msi [1/2]: Implement Installer::OpenDatabase

James Hawkins truiken at gmail.com
Thu May 31 21:49:52 CDT 2007


Hi,

Fixes bug 8544. http://bugs.winehq.org/show_bug.cgi?id=8544

Changelog:
* Implement Installer::OpenDatabase.

 dlls/msi/automation.c        |   38 ++++++++++++++++++++++++++++++++++++++
 dlls/msi/msiserver.idl       |    4 ++++
 dlls/msi/msiserver_dispids.h |    1 +
 3 files changed, 43 insertions(+), 0 deletions(-)

-- 
James Hawkins
-------------- next part --------------
diff --git a/dlls/msi/automation.c b/dlls/msi/automation.c
index 63fea99..be47cb6 100644
--- a/dlls/msi/automation.c
+++ b/dlls/msi/automation.c
@@ -1433,6 +1433,43 @@ static HRESULT WINAPI InstallerImpl_Invo
             else return DISP_E_MEMBERNOTFOUND;
             break;
 
+        case DISPID_INSTALLER_OPENDATABASE:
+            if (wFlags & DISPATCH_METHOD)
+            {
+                hr = DispGetParam(pDispParams, 0, VT_BSTR, &varg0, puArgErr);
+                if (FAILED(hr)) return hr;
+
+                hr = DispGetParam(pDispParams, 1, VT_BSTR, &varg1, puArgErr);
+                if (FAILED(hr))
+                {
+                    VariantClear(&varg0);
+                    return hr;
+                }
+
+                V_VT(pVarResult) = VT_DISPATCH;
+                if ((ret = MsiOpenDatabaseW(V_BSTR(&varg0), V_BSTR(&varg1), &msiHandle)) == ERROR_SUCCESS)
+                {
+                    hr = create_automation_object(msiHandle, NULL, (LPVOID *)&pDispatch,
+                                                  &DIID_Database, DatabaseImpl_Invoke, NULL, 0);
+                    if (SUCCEEDED(hr))
+                    {
+                        IDispatch_AddRef(pDispatch);
+                        V_DISPATCH(pVarResult) = pDispatch;
+                    }
+                    else
+                        ERR("Failed to create Database object: 0x%08x\n", hr);
+                }
+                else
+                {
+                    VariantClear(&varg0);
+                    VariantClear(&varg1);
+                    ERR("MsiOpenDatabase returned %d\n", ret);
+                    return DISP_E_EXCEPTION;
+                }
+            }
+            else return DISP_E_MEMBERNOTFOUND;
+            break;
+
         case DISPID_INSTALLER_INSTALLPRODUCT:
             if (wFlags & DISPATCH_METHOD)
             {
@@ -1676,6 +1713,7 @@ static HRESULT WINAPI InstallerImpl_Invo
             break;
 
          default:
+            ERR("Member not found: %d\n", dispIdMember);
             return DISP_E_MEMBERNOTFOUND;
     }
 
diff --git a/dlls/msi/msiserver.idl b/dlls/msi/msiserver.idl
index 3c0428b..d9869f0 100644
--- a/dlls/msi/msiserver.idl
+++ b/dlls/msi/msiserver.idl
@@ -66,6 +66,10 @@ library WindowsInstaller
             Session* OpenPackage(
                 [in] VARIANT PackagePath,
                 [in, optional, defaultvalue(0)] long Options);
+        [id(DISPID_INSTALLER_OPENDATABASE)]
+        	Database *OpenDatabase(
+        	    [in] BSTR DatabasePath,
+        	    [in] VARIANT OpenMode);
         [id(DISPID_INSTALLER_INSTALLPRODUCT)]
             void InstallProduct(
                 [in] BSTR PackagePath,
diff --git a/dlls/msi/msiserver_dispids.h b/dlls/msi/msiserver_dispids.h
index 694090e..c3dd07a 100644
--- a/dlls/msi/msiserver_dispids.h
+++ b/dlls/msi/msiserver_dispids.h
@@ -18,6 +18,7 @@
 
 #define DISPID_INSTALLER_CREATERECORD 1
 #define DISPID_INSTALLER_OPENPACKAGE 2
+#define DISPID_INSTALLER_OPENDATABASE 3
 #define DISPID_INSTALLER_INSTALLPRODUCT 8
 #define DISPID_INSTALLER_REGISTRYVALUE 11
 #define DISPID_INSTALLER_PRODUCTSTATE 17
-- 
1.4.1


More information about the wine-patches mailing list