James Hawkins : msi: Implement Installer::OpenDatabase.

Alexandre Julliard julliard at wine.codeweavers.com
Fri Jun 1 06:44:36 CDT 2007


Module: wine
Branch: master
Commit: 7a289624cfcbc829aabc614093bbd5ae01251529
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=7a289624cfcbc829aabc614093bbd5ae01251529

Author: James Hawkins <truiken at gmail.com>
Date:   Thu May 31 19:49:52 2007 -0700

msi: 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(-)

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_Invoke(
             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_Invoke(
             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..66a7e9d 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




More information about the wine-cvs mailing list