sync msi_winetest with wine 1.1.35

svn path=/trunk/; revision=44692
This commit is contained in:
Christoph von Wittich 2009-12-22 09:14:17 +00:00
parent 0b5066e17b
commit 917a4bead6
8 changed files with 433 additions and 73 deletions

View file

@ -34,8 +34,8 @@
DEFINE_GUID(GUID_NULL,0,0,0,0,0,0,0,0,0,0,0); DEFINE_GUID(GUID_NULL,0,0,0,0,0,0,0,0,0,0,0);
static const char *msifile = "winetest.msi"; static const char *msifile = "winetest-automation.msi";
static const WCHAR szMsifile[] = {'w','i','n','e','t','e','s','t','.','m','s','i',0}; static const WCHAR szMsifile[] = {'w','i','n','e','t','e','s','t','-','a','u','t','o','m','a','t','i','o','n','.','m','s','i',0};
static const WCHAR szMSITEST[] = { 'M','S','I','T','E','S','T',0 }; static const WCHAR szMSITEST[] = { 'M','S','I','T','E','S','T',0 };
static const WCHAR szProductCode[] = { '{','F','1','C','3','A','F','5','0','-','8','B','5','6','-','4','A','6','9','-','A','0','0','C','-','0','0','7','7','3','F','E','4','2','F','3','0','}',0 }; static const WCHAR szProductCode[] = { '{','F','1','C','3','A','F','5','0','-','8','B','5','6','-','4','A','6','9','-','A','0','0','C','-','0','0','7','7','3','F','E','4','2','F','3','0','}',0 };
static const WCHAR szUpgradeCode[] = { '{','C','E','0','6','7','E','8','D','-','2','E','1','A','-','4','3','6','7','-','B','7','3','4','-','4','E','B','2','B','D','A','D','6','5','6','5','}',0 }; static const WCHAR szUpgradeCode[] = { '{','C','E','0','6','7','E','8','D','-','2','E','1','A','-','4','3','6','7','-','B','7','3','4','-','4','E','B','2','B','D','A','D','6','5','6','5','}',0 };
@ -271,6 +271,27 @@ static void create_database(const CHAR *name, const msi_table *tables, int num_t
MsiCloseHandle(db); MsiCloseHandle(db);
} }
static BOOL create_package(LPWSTR path)
{
DWORD len;
/* Prepare package */
create_database(msifile, tables,
sizeof(tables) / sizeof(msi_table), summary_info,
sizeof(summary_info) / sizeof(msi_summary_info));
len = MultiByteToWideChar(CP_ACP, MB_PRECOMPOSED,
CURR_DIR, -1, path, MAX_PATH);
ok(len, "MultiByteToWideChar returned error %d\n", GetLastError());
if (!len)
return FALSE;
/* lstrcatW does not work on win95 */
path[len - 1] = '\\';
memcpy(&path[len], szMsifile, sizeof(szMsifile));
return TRUE;
}
/* /*
* Installation helpers * Installation helpers
*/ */
@ -456,26 +477,24 @@ static void test_dispid(void)
ok(dispid == 1, "Expected 1, got %d\n", dispid); ok(dispid == 1, "Expected 1, got %d\n", dispid);
dispid = get_dispid(pInstaller, "OpenPackage"); dispid = get_dispid(pInstaller, "OpenPackage");
ok(dispid == 2, "Expected 2, got %d\n", dispid); ok(dispid == 2, "Expected 2, got %d\n", dispid);
dispid = get_dispid(pInstaller, "OpenProduct");
ok(dispid == 3, "Expected 3, got %d\n", dispid);
dispid = get_dispid(pInstaller, "OpenDatabase"); dispid = get_dispid(pInstaller, "OpenDatabase");
ok(dispid == 4, "Expected 4, got %d\n", dispid); ok(dispid == 4, "Expected 4, got %d\n", dispid);
dispid = get_dispid(pInstaller, "SummaryInformation");
ok(dispid == 5, "Expected 5, got %d\n", dispid);
dispid = get_dispid( pInstaller, "UILevel" ); dispid = get_dispid( pInstaller, "UILevel" );
ok(dispid == 6, "Expected 6, got %d\n", dispid); ok(dispid == 6, "Expected 6, got %d\n", dispid);
dispid = get_dispid(pInstaller, "EnableLog");
ok(dispid == 7, "Expected 7, got %d\n", dispid);
dispid = get_dispid(pInstaller, "InstallProduct"); dispid = get_dispid(pInstaller, "InstallProduct");
ok(dispid == 8, "Expected 8, got %d\n", dispid); ok(dispid == 8, "Expected 8, got %d\n", dispid);
dispid = get_dispid(pInstaller, "Version"); dispid = get_dispid(pInstaller, "Version");
ok(dispid == 9, "Expected 9, got %d\n", dispid); ok(dispid == 9, "Expected 9, got %d\n", dispid);
dispid = get_dispid(pInstaller, "RegistryValue");
ok(dispid == 11, "Expected 11, got %d\n", dispid);
todo_wine
{
dispid = get_dispid(pInstaller, "OpenProduct");
ok(dispid == 3, "Expected 3, got %d\n", dispid);
dispid = get_dispid(pInstaller, "SummaryInformation");
ok(dispid == 5, "Expected 5, got %d\n", dispid);
dispid = get_dispid(pInstaller, "EnableLog");
ok(dispid == 7, "Expected 7, got %d\n", dispid);
dispid = get_dispid(pInstaller, "LastErrorRecord"); dispid = get_dispid(pInstaller, "LastErrorRecord");
ok(dispid == 10, "Expected 10, got %d\n", dispid); ok(dispid == 10, "Expected 10, got %d\n", dispid);
dispid = get_dispid(pInstaller, "RegistryValue");
ok(dispid == 11, "Expected 11, got %d\n", dispid);
dispid = get_dispid(pInstaller, "Environment"); dispid = get_dispid(pInstaller, "Environment");
ok(dispid == 12, "Expected 12, got %d\n", dispid); ok(dispid == 12, "Expected 12, got %d\n", dispid);
dispid = get_dispid(pInstaller, "FileAttributes"); dispid = get_dispid(pInstaller, "FileAttributes");
@ -484,7 +503,6 @@ static void test_dispid(void)
ok(dispid == 15, "Expected 15, got %d\n", dispid); ok(dispid == 15, "Expected 15, got %d\n", dispid);
dispid = get_dispid(pInstaller, "FileVersion"); dispid = get_dispid(pInstaller, "FileVersion");
ok(dispid == 16, "Expected 16, got %d\n", dispid); ok(dispid == 16, "Expected 16, got %d\n", dispid);
}
dispid = get_dispid(pInstaller, "ProductState"); dispid = get_dispid(pInstaller, "ProductState");
ok(dispid == 17, "Expected 17, got %d\n", dispid); ok(dispid == 17, "Expected 17, got %d\n", dispid);
dispid = get_dispid(pInstaller, "ProductInfo"); dispid = get_dispid(pInstaller, "ProductInfo");
@ -592,7 +610,8 @@ static void test_dispatch(void)
DISPID dispid; DISPID dispid;
OLECHAR *name; OLECHAR *name;
VARIANT varresult; VARIANT varresult;
VARIANTARG vararg[2]; VARIANTARG vararg[3];
WCHAR path[MAX_PATH];
DISPPARAMS dispparams = {NULL, NULL, 0, 0}; DISPPARAMS dispparams = {NULL, NULL, 0, 0};
/* Test getting ID of a function name that does not exist */ /* Test getting ID of a function name that does not exist */
@ -620,24 +639,159 @@ static void test_dispatch(void)
/* Try with NULL params */ /* Try with NULL params */
hr = IDispatch_Invoke(pInstaller, dispid, &IID_NULL, LOCALE_NEUTRAL, DISPATCH_METHOD, &dispparams, &varresult, &excepinfo, NULL); hr = IDispatch_Invoke(pInstaller, dispid, &IID_NULL, LOCALE_NEUTRAL, DISPATCH_METHOD, &dispparams, &varresult, &excepinfo, NULL);
todo_wine ok(hr == DISP_E_TYPEMISMATCH, "IDispatch::Invoke returned 0x%08x\n", hr); ok(hr == DISP_E_TYPEMISMATCH, "IDispatch::Invoke returned 0x%08x\n", hr);
/* Try one empty parameter */ /* Try one empty parameter */
dispparams.rgvarg = vararg; dispparams.rgvarg = vararg;
dispparams.cArgs = 1; dispparams.cArgs = 1;
VariantInit(&vararg[0]); VariantInit(&vararg[0]);
hr = IDispatch_Invoke(pInstaller, dispid, &IID_NULL, LOCALE_NEUTRAL, DISPATCH_METHOD, &dispparams, &varresult, &excepinfo, NULL); hr = IDispatch_Invoke(pInstaller, dispid, &IID_NULL, LOCALE_NEUTRAL, DISPATCH_METHOD, &dispparams, &varresult, &excepinfo, NULL);
todo_wine ok(hr == DISP_E_TYPEMISMATCH, "IDispatch::Invoke returned 0x%08x\n", hr); ok(hr == DISP_E_TYPEMISMATCH, "IDispatch::Invoke returned 0x%08x\n", hr);
/* Try one parameter, function requires two */ /* Try two empty parameters */
dispparams.cArgs = 2;
VariantInit(&vararg[0]);
VariantInit(&vararg[1]);
hr = IDispatch_Invoke(pInstaller, dispid, &IID_NULL, LOCALE_NEUTRAL, DISPATCH_METHOD, &dispparams, &varresult, &excepinfo, NULL);
ok(hr == DISP_E_TYPEMISMATCH, "IDispatch::Invoke returned 0x%08x\n", hr);
/* Try one parameter, the required BSTR. Second parameter is optional.
* NOTE: The specified package does not exist, which is why the call fails.
*/
dispparams.cArgs = 1;
VariantInit(&vararg[0]); VariantInit(&vararg[0]);
V_VT(&vararg[0]) = VT_BSTR; V_VT(&vararg[0]) = VT_BSTR;
V_BSTR(&vararg[0]) = SysAllocString(szMsifile); V_BSTR(&vararg[0]) = SysAllocString(szMsifile);
hr = IDispatch_Invoke(pInstaller, dispid, &IID_NULL, LOCALE_NEUTRAL, DISPATCH_METHOD, &dispparams, &varresult, &excepinfo, NULL); hr = IDispatch_Invoke(pInstaller, dispid, &IID_NULL, LOCALE_NEUTRAL, DISPATCH_METHOD, &dispparams, &varresult, &excepinfo, NULL);
VariantClear(&vararg[0]);
ok(hr == DISP_E_EXCEPTION, "IDispatch::Invoke returned 0x%08x\n", hr); ok(hr == DISP_E_EXCEPTION, "IDispatch::Invoke returned 0x%08x\n", hr);
ok_exception(hr, szOpenPackageException); ok_exception(hr, szOpenPackageException);
VariantClear(&vararg[0]);
/* Provide the required BSTR and an empty second parameter.
* NOTE: The specified package does not exist, which is why the call fails.
*/
dispparams.cArgs = 2;
VariantInit(&vararg[1]);
V_VT(&vararg[1]) = VT_BSTR;
V_BSTR(&vararg[1]) = SysAllocString(szMsifile);
VariantInit(&vararg[0]);
hr = IDispatch_Invoke(pInstaller, dispid, &IID_NULL, LOCALE_NEUTRAL, DISPATCH_METHOD, &dispparams, &varresult, &excepinfo, NULL);
ok(hr == DISP_E_EXCEPTION, "IDispatch::Invoke returned 0x%08x\n", hr);
ok_exception(hr, szOpenPackageException);
VariantClear(&vararg[1]);
/* Provide the required BSTR and two empty parameters.
* NOTE: The specified package does not exist, which is why the call fails.
*/
dispparams.cArgs = 3;
VariantInit(&vararg[2]);
V_VT(&vararg[2]) = VT_BSTR;
V_BSTR(&vararg[2]) = SysAllocString(szMsifile);
VariantInit(&vararg[1]);
VariantInit(&vararg[0]);
hr = IDispatch_Invoke(pInstaller, dispid, &IID_NULL, LOCALE_NEUTRAL, DISPATCH_METHOD, &dispparams, &varresult, &excepinfo, NULL);
ok(hr == DISP_E_EXCEPTION, "IDispatch::Invoke returned 0x%08x\n", hr);
ok_exception(hr, szOpenPackageException);
VariantClear(&vararg[2]);
/* Provide the required BSTR and a second parameter with the wrong type. */
dispparams.cArgs = 2;
VariantInit(&vararg[1]);
V_VT(&vararg[1]) = VT_BSTR;
V_BSTR(&vararg[1]) = SysAllocString(szMsifile);
VariantInit(&vararg[0]);
V_VT(&vararg[0]) = VT_BSTR;
V_BSTR(&vararg[0]) = SysAllocString(szMsifile);
hr = IDispatch_Invoke(pInstaller, dispid, &IID_NULL, LOCALE_NEUTRAL, DISPATCH_METHOD, &dispparams, &varresult, &excepinfo, NULL);
ok(hr == DISP_E_TYPEMISMATCH, "IDispatch::Invoke returned 0x%08x\n", hr);
VariantClear(&vararg[0]);
VariantClear(&vararg[1]);
/* Create a proper installer package. */
create_package(path);
/* Try one parameter, the required BSTR. Second parameter is optional.
* Proper installer package exists. Path to the package is relative.
*/
dispparams.cArgs = 1;
VariantInit(&vararg[0]);
V_VT(&vararg[0]) = VT_BSTR;
V_BSTR(&vararg[0]) = SysAllocString(szMsifile);
hr = IDispatch_Invoke(pInstaller, dispid, &IID_NULL, LOCALE_NEUTRAL, DISPATCH_METHOD, &dispparams, &varresult, &excepinfo, NULL);
todo_wine ok(hr == DISP_E_EXCEPTION, "IDispatch::Invoke returned 0x%08x\n", hr);
ok_exception(hr, szOpenPackageException);
VariantClear(&vararg[0]);
if (hr != DISP_E_EXCEPTION)
VariantClear(&varresult);
/* Try one parameter, the required BSTR. Second parameter is optional.
* Proper installer package exists. Path to the package is absolute.
*/
dispparams.cArgs = 1;
VariantInit(&vararg[0]);
V_VT(&vararg[0]) = VT_BSTR;
V_BSTR(&vararg[0]) = SysAllocString(path);
hr = IDispatch_Invoke(pInstaller, dispid, &IID_NULL, LOCALE_NEUTRAL, DISPATCH_METHOD, &dispparams, &varresult, &excepinfo, NULL);
ok(hr == S_OK, "IDispatch::Invoke returned 0x%08x\n", hr);
VariantClear(&vararg[0]);
VariantClear(&varresult);
/* Provide the required BSTR and an empty second parameter. Proper
* installation package exists.
*/
dispparams.cArgs = 2;
VariantInit(&vararg[1]);
V_VT(&vararg[1]) = VT_BSTR;
V_BSTR(&vararg[1]) = SysAllocString(path);
VariantInit(&vararg[0]);
hr = IDispatch_Invoke(pInstaller, dispid, &IID_NULL, LOCALE_NEUTRAL, DISPATCH_METHOD, &dispparams, &varresult, &excepinfo, NULL);
ok(hr == S_OK, "IDispatch::Invoke returned 0x%08x\n", hr);
VariantClear(&vararg[1]);
VariantClear(&varresult);
/* Provide the required BSTR and two empty parameters. Proper
* installation package exists.
*/
dispparams.cArgs = 3;
VariantInit(&vararg[2]);
V_VT(&vararg[2]) = VT_BSTR;
V_BSTR(&vararg[2]) = SysAllocString(path);
VariantInit(&vararg[1]);
VariantInit(&vararg[0]);
hr = IDispatch_Invoke(pInstaller, dispid, &IID_NULL, LOCALE_NEUTRAL, DISPATCH_METHOD, &dispparams, &varresult, &excepinfo, NULL);
ok(hr == S_OK, "IDispatch::Invoke returned 0x%08x\n", hr);
VariantClear(&vararg[2]);
VariantClear(&varresult);
/* Provide the required BSTR and a second parameter with the wrong type. */
dispparams.cArgs = 2;
VariantInit(&vararg[1]);
V_VT(&vararg[1]) = VT_BSTR;
V_BSTR(&vararg[1]) = SysAllocString(path);
VariantInit(&vararg[0]);
V_VT(&vararg[0]) = VT_BSTR;
V_BSTR(&vararg[0]) = SysAllocString(path);
hr = IDispatch_Invoke(pInstaller, dispid, &IID_NULL, LOCALE_NEUTRAL, DISPATCH_METHOD, &dispparams, &varresult, &excepinfo, NULL);
ok(hr == DISP_E_TYPEMISMATCH, "IDispatch::Invoke returned 0x%08x\n", hr);
VariantClear(&vararg[0]);
VariantClear(&vararg[1]);
/* Provide the required BSTR and a second parameter that can be coerced to
* VT_I4.
*/
dispparams.cArgs = 2;
VariantInit(&vararg[1]);
V_VT(&vararg[1]) = VT_BSTR;
V_BSTR(&vararg[1]) = SysAllocString(path);
VariantInit(&vararg[0]);
V_VT(&vararg[0]) = VT_I2;
V_BSTR(&vararg[0]) = 0;
hr = IDispatch_Invoke(pInstaller, dispid, &IID_NULL, LOCALE_NEUTRAL, DISPATCH_METHOD, &dispparams, &varresult, &excepinfo, NULL);
ok(hr == S_OK, "IDispatch::Invoke returned 0x%08x\n", hr);
VariantClear(&vararg[1]);
VariantClear(&varresult);
DeleteFileW(path);
/* Test invoking a method as a DISPATCH_PROPERTYGET or DISPATCH_PROPERTYPUT */ /* Test invoking a method as a DISPATCH_PROPERTYGET or DISPATCH_PROPERTYPUT */
VariantInit(&vararg[0]); VariantInit(&vararg[0]);
@ -2353,7 +2507,6 @@ static void test_Installer(void)
static WCHAR szIntegerDataException[] = { 'I','n','t','e','g','e','r','D','a','t','a',',','F','i','e','l','d',0 }; static WCHAR szIntegerDataException[] = { 'I','n','t','e','g','e','r','D','a','t','a',',','F','i','e','l','d',0 };
WCHAR szPath[MAX_PATH]; WCHAR szPath[MAX_PATH];
HRESULT hr; HRESULT hr;
UINT len;
IDispatch *pSession = NULL, *pDatabase = NULL, *pRecord = NULL, *pStringList = NULL; IDispatch *pSession = NULL, *pDatabase = NULL, *pRecord = NULL, *pStringList = NULL;
int iValue, iCount; int iValue, iCount;
@ -2404,17 +2557,7 @@ static void test_Installer(void)
IDispatch_Release(pRecord); IDispatch_Release(pRecord);
} }
/* Prepare package */ create_package(szPath);
create_database(msifile, tables, sizeof(tables) / sizeof(msi_table),
summary_info, sizeof(summary_info) / sizeof(msi_summary_info));
len = MultiByteToWideChar(CP_ACP, MB_PRECOMPOSED, CURR_DIR, -1, szPath, MAX_PATH);
ok(len, "MultiByteToWideChar returned error %d\n", GetLastError());
if (!len) return;
/* lstrcatW does not work on win95 */
szPath[len - 1] = '\\';
memcpy(&szPath[len], szMsifile, sizeof(szMsifile));
/* Installer::OpenPackage */ /* Installer::OpenPackage */
hr = Installer_OpenPackage(szPath, 0, &pSession); hr = Installer_OpenPackage(szPath, 0, &pSession);

View file

@ -31,9 +31,10 @@
#include "wine/test.h" #include "wine/test.h"
static const char *msifile = "winetest.msi"; static const char *msifile = "winetest-db.msi";
static const char *msifile2 = "winetst2.msi"; static const char *msifile2 = "winetst2-db.msi";
static const char *mstfile = "winetst.mst"; static const char *mstfile = "winetst-db.mst";
static const WCHAR msifileW[] = {'w','i','n','e','t','e','s','t','-','d','b','.','m','s','i',0};
static void test_msidatabase(void) static void test_msidatabase(void)
{ {
@ -921,6 +922,8 @@ static void test_viewmodify(void)
r = MsiViewModify(hview, MSIMODIFY_INSERT_TEMPORARY, hrec ); r = MsiViewModify(hview, MSIMODIFY_INSERT_TEMPORARY, hrec );
ok(r == ERROR_SUCCESS, "MsiViewModify failed\n"); ok(r == ERROR_SUCCESS, "MsiViewModify failed\n");
r = MsiCloseHandle(hrec);
ok(r == ERROR_SUCCESS, "MsiCloseHandle failed\n");
r = MsiViewClose(hview); r = MsiViewClose(hview);
ok(r == ERROR_SUCCESS, "MsiViewClose failed\n"); ok(r == ERROR_SUCCESS, "MsiViewClose failed\n");
r = MsiCloseHandle(hview); r = MsiCloseHandle(hview);
@ -1760,6 +1763,30 @@ static void test_where(void)
ok( r == ERROR_SUCCESS, "query failed: %d\n", r ); ok( r == ERROR_SUCCESS, "query failed: %d\n", r );
MsiCloseHandle( rec ); MsiCloseHandle( rec );
rec = 0;
query = "SELECT * FROM `Media` WHERE `DiskPrompt` < 'Cabinet'";
r = do_query(hdb, query, &rec);
ok( r == ERROR_BAD_QUERY_SYNTAX, "query failed: %d\n", r );
MsiCloseHandle( rec );
rec = 0;
query = "SELECT * FROM `Media` WHERE `DiskPrompt` > 'Cabinet'";
r = do_query(hdb, query, &rec);
ok( r == ERROR_BAD_QUERY_SYNTAX, "query failed: %d\n", r );
MsiCloseHandle( rec );
rec = 0;
query = "SELECT * FROM `Media` WHERE `DiskPrompt` <> 'Cabinet'";
r = do_query(hdb, query, &rec);
todo_wine ok( r == ERROR_SUCCESS, "query failed: %d\n", r );
MsiCloseHandle( rec );
rec = 0;
query = "SELECT * FROM `Media` WHERE `DiskPrompt` = 'Cabinet'";
r = do_query(hdb, query, &rec);
ok( r == ERROR_NO_MORE_ITEMS, "query failed: %d\n", r );
MsiCloseHandle( rec );
rec = MsiCreateRecord(1); rec = MsiCreateRecord(1);
MsiRecordSetString(rec, 1, ""); MsiRecordSetString(rec, 1, "");
@ -5539,6 +5566,8 @@ static void enum_stream_names(IStorage *stg)
ok(hr == S_OK, "Expected S_OK, got %08x\n", hr); ok(hr == S_OK, "Expected S_OK, got %08x\n", hr);
ok(stm != NULL, "Expected non-NULL stream\n"); ok(stm != NULL, "Expected non-NULL stream\n");
CoTaskMemFree(stat.pwcsName);
sz = MAX_PATH; sz = MAX_PATH;
memset(data, 'a', MAX_PATH); memset(data, 'a', MAX_PATH);
hr = IStream_Read(stm, data, sz, &count); hr = IStream_Read(stm, data, sz, &count);
@ -5569,8 +5598,6 @@ static void test_defaultdatabase(void)
MSIHANDLE hdb; MSIHANDLE hdb;
IStorage *stg = NULL; IStorage *stg = NULL;
static const WCHAR msifileW[] = {'w','i','n','e','t','e','s','t','.','m','s','i',0};
DeleteFile(msifile); DeleteFile(msifile);
r = MsiOpenDatabase(msifile, MSIDBOPEN_CREATE, &hdb); r = MsiOpenDatabase(msifile, MSIDBOPEN_CREATE, &hdb);

View file

@ -27,7 +27,7 @@
#include "wine/test.h" #include "wine/test.h"
static const char msifile[] = "winetest.msi"; static const char msifile[] = "winetest-format.msi";
static UINT run_query( MSIHANDLE hdb, const char *query ) static UINT run_query( MSIHANDLE hdb, const char *query )
{ {
@ -315,17 +315,16 @@ static MSIHANDLE helper_createpackage( const char *szName )
static void test_createpackage(void) static void test_createpackage(void)
{ {
static const CHAR filename[] = "winetest.msi";
MSIHANDLE hPackage = 0; MSIHANDLE hPackage = 0;
UINT res; UINT res;
hPackage = helper_createpackage( filename ); hPackage = helper_createpackage( msifile );
ok ( hPackage != 0, " Failed to create package\n"); ok ( hPackage != 0, " Failed to create package\n");
res = MsiCloseHandle( hPackage); res = MsiCloseHandle( hPackage);
ok( res == ERROR_SUCCESS , "Failed to close package\n" ); ok( res == ERROR_SUCCESS , "Failed to close package\n" );
DeleteFile( filename ); DeleteFile( msifile );
} }
static void test_formatrecord(void) static void test_formatrecord(void)
@ -1620,14 +1619,13 @@ static void test_formatrecord(void)
static void test_formatrecord_package(void) static void test_formatrecord_package(void)
{ {
static const CHAR filename[] = "winetest.msi";
char buffer[100]; char buffer[100];
MSIHANDLE hrec; MSIHANDLE hrec;
MSIHANDLE package; MSIHANDLE package;
UINT r; UINT r;
DWORD sz=100; DWORD sz=100;
package = helper_createpackage( filename ); package = helper_createpackage( msifile );
ok(package!=0, "Unable to create package\n"); ok(package!=0, "Unable to create package\n");
hrec = MsiCreateRecord(12); hrec = MsiCreateRecord(12);
@ -2117,7 +2115,7 @@ static void test_formatrecord_package(void)
r = MsiCloseHandle(package); r = MsiCloseHandle(package);
ok(r==ERROR_SUCCESS, "Unable to close package\n"); ok(r==ERROR_SUCCESS, "Unable to close package\n");
DeleteFile( filename ); DeleteFile( msifile );
} }
static void test_formatrecord_tables(void) static void test_formatrecord_tables(void)
@ -2383,12 +2381,11 @@ static void test_formatrecord_tables(void)
static void test_processmessage(void) static void test_processmessage(void)
{ {
static const CHAR filename[] = "winetest.msi";
MSIHANDLE hrec; MSIHANDLE hrec;
MSIHANDLE package; MSIHANDLE package;
int r; int r;
package = helper_createpackage( filename ); package = helper_createpackage( msifile );
ok(package!=0, "Unable to create package\n"); ok(package!=0, "Unable to create package\n");
hrec = MsiCreateRecord(3); hrec = MsiCreateRecord(3);
@ -2403,7 +2400,7 @@ static void test_processmessage(void)
MsiCloseHandle(hrec); MsiCloseHandle(hrec);
MsiCloseHandle(package); MsiCloseHandle(package);
DeleteFile(filename); DeleteFile(msifile);
} }
START_TEST(format) START_TEST(format)

View file

@ -163,6 +163,52 @@ static const CHAR property_dat[] = "Property\tValue\n"
"SERVNAME\tTestService\n" "SERVNAME\tTestService\n"
"SERVDISP\tTestServiceDisp\n"; "SERVDISP\tTestServiceDisp\n";
static const CHAR aup_property_dat[] = "Property\tValue\n"
"s72\tl0\n"
"Property\tProperty\n"
"DefaultUIFont\tDlgFont8\n"
"HASUIRUN\t0\n"
"ALLUSERS\t1\n"
"INSTALLLEVEL\t3\n"
"InstallMode\tTypical\n"
"Manufacturer\tWine\n"
"PIDTemplate\t12345<###-%%%%%%%>@@@@@\n"
"ProductCode\t{7DF88A48-996F-4EC8-A022-BF956F9B2CBB}\n"
"ProductID\tnone\n"
"ProductLanguage\t1033\n"
"ProductName\tMSITEST\n"
"ProductVersion\t1.1.1\n"
"PROMPTROLLBACKCOST\tP\n"
"Setup\tSetup\n"
"UpgradeCode\t{4C0EAA15-0264-4E5A-8758-609EF142B92D}\n"
"AdminProperties\tPOSTADMIN\n"
"ROOTDRIVE\tC:\\\n"
"SERVNAME\tTestService\n"
"SERVDISP\tTestServiceDisp\n";
static const CHAR aup2_property_dat[] = "Property\tValue\n"
"s72\tl0\n"
"Property\tProperty\n"
"DefaultUIFont\tDlgFont8\n"
"HASUIRUN\t0\n"
"ALLUSERS\t2\n"
"INSTALLLEVEL\t3\n"
"InstallMode\tTypical\n"
"Manufacturer\tWine\n"
"PIDTemplate\t12345<###-%%%%%%%>@@@@@\n"
"ProductCode\t{7DF88A48-996F-4EC8-A022-BF956F9B2CBB}\n"
"ProductID\tnone\n"
"ProductLanguage\t1033\n"
"ProductName\tMSITEST\n"
"ProductVersion\t1.1.1\n"
"PROMPTROLLBACKCOST\tP\n"
"Setup\tSetup\n"
"UpgradeCode\t{4C0EAA15-0264-4E5A-8758-609EF142B92D}\n"
"AdminProperties\tPOSTADMIN\n"
"ROOTDRIVE\tC:\\\n"
"SERVNAME\tTestService\n"
"SERVDISP\tTestServiceDisp\n";
static const CHAR shortcut_dat[] = "Shortcut\tDirectory_\tName\tComponent_\tTarget\tArguments\tDescription\tHotkey\tIcon_\tIconIndex\tShowCmd\tWkDir\n" static const CHAR shortcut_dat[] = "Shortcut\tDirectory_\tName\tComponent_\tTarget\tArguments\tDescription\tHotkey\tIcon_\tIconIndex\tShowCmd\tWkDir\n"
"s72\ts72\tl128\ts72\ts72\tS255\tL255\tI2\tS72\tI2\tI2\tS72\n" "s72\ts72\tl128\ts72\ts72\tS255\tL255\tI2\tS72\tI2\tI2\tS72\n"
"Shortcut\tShortcut\n" "Shortcut\tShortcut\n"
@ -941,6 +987,48 @@ static const CHAR aup_install_exec_seq_dat[] = "Action\tCondition\tSequence\n"
"LaunchConditions\t\t100\n" "LaunchConditions\t\t100\n"
"TestAllUsersProp\tALLUSERS AND NOT REMOVE\t50\n"; "TestAllUsersProp\tALLUSERS AND NOT REMOVE\t50\n";
static const CHAR aup2_install_exec_seq_dat[] = "Action\tCondition\tSequence\n"
"s72\tS255\tI2\n"
"InstallExecuteSequence\tAction\n"
"CostFinalize\t\t1000\n"
"ValidateProductID\t\t700\n"
"CostInitialize\t\t800\n"
"FileCost\t\t900\n"
"RemoveFiles\t\t3500\n"
"InstallFiles\t\t4000\n"
"RegisterUser\t\t6000\n"
"RegisterProduct\t\t6100\n"
"PublishFeatures\t\t6300\n"
"PublishProduct\t\t6400\n"
"InstallFinalize\t\t6600\n"
"InstallInitialize\t\t1500\n"
"ProcessComponents\t\t1600\n"
"UnpublishFeatures\t\t1800\n"
"InstallValidate\t\t1400\n"
"LaunchConditions\t\t100\n"
"TestAllUsersProp\tALLUSERS=2 AND NOT REMOVE\t50\n";
static const CHAR aup3_install_exec_seq_dat[] = "Action\tCondition\tSequence\n"
"s72\tS255\tI2\n"
"InstallExecuteSequence\tAction\n"
"CostFinalize\t\t1000\n"
"ValidateProductID\t\t700\n"
"CostInitialize\t\t800\n"
"FileCost\t\t900\n"
"RemoveFiles\t\t3500\n"
"InstallFiles\t\t4000\n"
"RegisterUser\t\t6000\n"
"RegisterProduct\t\t6100\n"
"PublishFeatures\t\t6300\n"
"PublishProduct\t\t6400\n"
"InstallFinalize\t\t6600\n"
"InstallInitialize\t\t1500\n"
"ProcessComponents\t\t1600\n"
"UnpublishFeatures\t\t1800\n"
"InstallValidate\t\t1400\n"
"LaunchConditions\t\t100\n"
"TestAllUsersProp\tALLUSERS=1 AND NOT REMOVE\t50\n";
static const CHAR aup_custom_action_dat[] = "Action\tType\tSource\tTarget\tISComments\n" static const CHAR aup_custom_action_dat[] = "Action\tType\tSource\tTarget\tISComments\n"
"s72\ti2\tS64\tS0\tS255\n" "s72\ti2\tS64\tS0\tS255\n"
"CustomAction\tAction\n" "CustomAction\tAction\n"
@ -1586,6 +1674,45 @@ static const msi_table aup_tables[] =
ADD_TABLE(property) ADD_TABLE(property)
}; };
static const msi_table aup2_tables[] =
{
ADD_TABLE(component),
ADD_TABLE(directory),
ADD_TABLE(feature),
ADD_TABLE(feature_comp),
ADD_TABLE(file),
ADD_TABLE(aup2_install_exec_seq),
ADD_TABLE(aup_custom_action),
ADD_TABLE(media),
ADD_TABLE(aup_property)
};
static const msi_table aup3_tables[] =
{
ADD_TABLE(component),
ADD_TABLE(directory),
ADD_TABLE(feature),
ADD_TABLE(feature_comp),
ADD_TABLE(file),
ADD_TABLE(aup2_install_exec_seq),
ADD_TABLE(aup_custom_action),
ADD_TABLE(media),
ADD_TABLE(aup2_property)
};
static const msi_table aup4_tables[] =
{
ADD_TABLE(component),
ADD_TABLE(directory),
ADD_TABLE(feature),
ADD_TABLE(feature_comp),
ADD_TABLE(file),
ADD_TABLE(aup3_install_exec_seq),
ADD_TABLE(aup_custom_action),
ADD_TABLE(media),
ADD_TABLE(aup2_property)
};
static const msi_table fiu_tables[] = static const msi_table fiu_tables[] =
{ {
ADD_TABLE(rof_component), ADD_TABLE(rof_component),
@ -6778,6 +6905,7 @@ static void test_allusers_prop(void)
MsiSetInternalUI(INSTALLUILEVEL_NONE, NULL); MsiSetInternalUI(INSTALLUILEVEL_NONE, NULL);
/* ALLUSERS property unset */
r = MsiInstallProductA(msifile, "FULL=1"); r = MsiInstallProductA(msifile, "FULL=1");
ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r); ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r);
@ -6798,6 +6926,69 @@ static void test_allusers_prop(void)
ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r); ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r);
delete_test_files(); delete_test_files();
create_test_files();
create_database(msifile, aup2_tables, sizeof(aup2_tables) / sizeof(msi_table));
MsiSetInternalUI(INSTALLUILEVEL_NONE, NULL);
/* ALLUSERS property set to 1 */
r = MsiInstallProductA(msifile, "FULL=1");
ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r);
ok(delete_pf("msitest\\cabout\\new\\five.txt", TRUE), "File not installed\n");
ok(delete_pf("msitest\\cabout\\new", FALSE), "File not installed\n");
ok(delete_pf("msitest\\cabout\\four.txt", TRUE), "File not installed\n");
ok(delete_pf("msitest\\cabout", FALSE), "File not installed\n");
ok(delete_pf("msitest\\changed\\three.txt", TRUE), "File not installed\n");
ok(delete_pf("msitest\\changed", FALSE), "File not installed\n");
ok(delete_pf("msitest\\first\\two.txt", TRUE), "File not installed\n");
ok(delete_pf("msitest\\first", FALSE), "File not installed\n");
ok(delete_pf("msitest\\filename", TRUE), "File not installed\n");
ok(delete_pf("msitest\\one.txt", TRUE), "File installed\n");
ok(delete_pf("msitest\\service.exe", TRUE), "File not installed\n");
ok(delete_pf("msitest", FALSE), "File not installed\n");
r = MsiInstallProductA(msifile, "REMOVE=ALL");
ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r);
delete_test_files();
create_test_files();
create_database(msifile, aup3_tables, sizeof(aup3_tables) / sizeof(msi_table));
MsiSetInternalUI(INSTALLUILEVEL_NONE, NULL);
/* ALLUSERS property set to 2 */
r = MsiInstallProductA(msifile, "FULL=1");
ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r);
ok(delete_pf("msitest\\cabout\\new\\five.txt", TRUE), "File not installed\n");
ok(delete_pf("msitest\\cabout\\new", FALSE), "File not installed\n");
ok(delete_pf("msitest\\cabout\\four.txt", TRUE), "File not installed\n");
ok(delete_pf("msitest\\cabout", FALSE), "File not installed\n");
ok(delete_pf("msitest\\changed\\three.txt", TRUE), "File not installed\n");
ok(delete_pf("msitest\\changed", FALSE), "File not installed\n");
ok(delete_pf("msitest\\first\\two.txt", TRUE), "File not installed\n");
ok(delete_pf("msitest\\first", FALSE), "File not installed\n");
ok(delete_pf("msitest\\filename", TRUE), "File not installed\n");
ok(delete_pf("msitest\\one.txt", TRUE), "File installed\n");
ok(delete_pf("msitest\\service.exe", TRUE), "File not installed\n");
ok(delete_pf("msitest", FALSE), "File not installed\n");
r = MsiInstallProductA(msifile, "REMOVE=ALL");
ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r);
delete_test_files();
create_test_files();
create_database(msifile, aup4_tables, sizeof(aup4_tables) / sizeof(msi_table));
MsiSetInternalUI(INSTALLUILEVEL_NONE, NULL);
/* ALLUSERS property set to 2, conditioned on ALLUSERS = 1 */
r = MsiInstallProductA(msifile, "FULL=1");
ok(r == ERROR_INSTALL_FAILURE, "Expected ERROR_INSTALL_FAILURE, got %u\n", r);
} }
static char session_manager[] = "System\\CurrentControlSet\\Control\\Session Manager"; static char session_manager[] = "System\\CurrentControlSet\\Control\\Session Manager";

View file

@ -2517,8 +2517,7 @@ static void test_MsiGetFileVersion(void)
r = MsiGetFileVersionA(path, version, &versz, lang, &langsz); r = MsiGetFileVersionA(path, version, &versz, lang, &langsz);
ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r); ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
ok(versz == verchecksz, "Expected %d, got %d\n", verchecksz, versz); ok(versz == verchecksz, "Expected %d, got %d\n", verchecksz, versz);
ok(!lstrcmpA(lang, langcheck), "Expected %s, got %s\n", langcheck, lang); ok(strstr(lang, langcheck) != NULL, "Expected %s in %s\n", langcheck, lang);
ok(langsz == langchecksz, "Expected %d, got %d\n", langchecksz, langsz);
ok(!lstrcmpA(version, vercheck), ok(!lstrcmpA(version, vercheck),
"Expected %s, got %s\n", vercheck, version); "Expected %s, got %s\n", vercheck, version);
@ -2536,8 +2535,7 @@ static void test_MsiGetFileVersion(void)
lstrcpyA(lang, "lang"); lstrcpyA(lang, "lang");
r = MsiGetFileVersionA(path, NULL, NULL, lang, &langsz); r = MsiGetFileVersionA(path, NULL, NULL, lang, &langsz);
ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r); ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
ok(!lstrcmpA(lang, langcheck), "Expected %s, got %s\n", langcheck, lang); ok(strstr(lang, langcheck) != NULL, "Expected %s in %s\n", langcheck, lang);
ok(langsz == langchecksz, "Expected %d, got %d\n", langchecksz, langsz);
/* check neither version nor language */ /* check neither version nor language */
r = MsiGetFileVersionA(path, NULL, NULL, NULL, NULL); r = MsiGetFileVersionA(path, NULL, NULL, NULL, NULL);
@ -2553,7 +2551,7 @@ static void test_MsiGetFileVersion(void)
langsz = MAX_PATH; langsz = MAX_PATH;
r = MsiGetFileVersionA(path, NULL, NULL, NULL, &langsz); r = MsiGetFileVersionA(path, NULL, NULL, NULL, &langsz);
ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r); ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
ok(langsz == langchecksz, "Expected %d, got %d\n", langchecksz, langsz); ok(langsz >= langchecksz, "Expected %d >= %d\n", langsz, langchecksz);
/* pcchVersionBuf not big enough */ /* pcchVersionBuf not big enough */
versz = 5; versz = 5;
@ -2571,7 +2569,7 @@ static void test_MsiGetFileVersion(void)
ok(r == ERROR_MORE_DATA, "Expected ERROR_MORE_DATA, got %d\n", r); ok(r == ERROR_MORE_DATA, "Expected ERROR_MORE_DATA, got %d\n", r);
ok(!strncmp(lang, langcheck, 2), ok(!strncmp(lang, langcheck, 2),
"Expected first character of %s, got %s\n", langcheck, lang); "Expected first character of %s, got %s\n", langcheck, lang);
ok(langsz == langchecksz, "Expected %d, got %d\n", langchecksz, langsz); ok(langsz >= langchecksz, "Expected %d >= %d\n", langsz, langchecksz);
HeapFree(GetProcessHeap(), 0, vercheck); HeapFree(GetProcessHeap(), 0, vercheck);
HeapFree(GetProcessHeap(), 0, langcheck); HeapFree(GetProcessHeap(), 0, langcheck);
@ -2781,7 +2779,7 @@ static void test_MsiGetProductInfo(void)
ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r); ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
ok(sz == 4, "Expected 4, got %d\n", sz); ok(sz == 4, "Expected 4, got %d\n", sz);
/* lpValueBuf is NULL, pcchValueBuf is too small */ /* lpValueBuf is non-NULL, pcchValueBuf is too small */
sz = 2; sz = 2;
lstrcpyA(buf, "apple"); lstrcpyA(buf, "apple");
r = MsiGetProductInfoA(prodcode, INSTALLPROPERTY_HELPLINK, buf, &sz); r = MsiGetProductInfoA(prodcode, INSTALLPROPERTY_HELPLINK, buf, &sz);
@ -2789,7 +2787,7 @@ static void test_MsiGetProductInfo(void)
ok(r == ERROR_MORE_DATA, "Expected ERROR_MORE_DATA, got %d\n", r); ok(r == ERROR_MORE_DATA, "Expected ERROR_MORE_DATA, got %d\n", r);
ok(sz == 4, "Expected 4, got %d\n", sz); ok(sz == 4, "Expected 4, got %d\n", sz);
/* lpValueBuf is NULL, pcchValueBuf is exactly 4 */ /* lpValueBuf is non-NULL, pcchValueBuf is exactly 4 */
sz = 4; sz = 4;
lstrcpyA(buf, "apple"); lstrcpyA(buf, "apple");
r = MsiGetProductInfoA(prodcode, INSTALLPROPERTY_HELPLINK, buf, &sz); r = MsiGetProductInfoA(prodcode, INSTALLPROPERTY_HELPLINK, buf, &sz);

View file

@ -30,7 +30,7 @@
#include "wine/test.h" #include "wine/test.h"
static const char msifile[] = "winetest.msi"; static const char msifile[] = "winetest-package.msi";
char CURR_DIR[MAX_PATH]; char CURR_DIR[MAX_PATH];
static UINT (WINAPI *pMsiApplyMultiplePatchesA)(LPCSTR, LPCSTR, LPCSTR); static UINT (WINAPI *pMsiApplyMultiplePatchesA)(LPCSTR, LPCSTR, LPCSTR);
@ -2341,9 +2341,9 @@ static void test_states(void)
MSIHANDLE hdb; MSIHANDLE hdb;
INSTALLSTATE state, action; INSTALLSTATE state, action;
static const CHAR msifile2[] = "winetest2.msi"; static const CHAR msifile2[] = "winetest2-package.msi";
static const CHAR msifile3[] = "winetest3.msi"; static const CHAR msifile3[] = "winetest3-package.msi";
static const CHAR msifile4[] = "winetest4.msi"; static const CHAR msifile4[] = "winetest4-package.msi";
hdb = create_package_db(); hdb = create_package_db();
ok ( hdb, "failed to create package database\n" ); ok ( hdb, "failed to create package database\n" );
@ -11601,7 +11601,8 @@ static void test_MsiGetProductProperty(void)
ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", res); ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", res);
lstrcpyA(val, path); lstrcpyA(val, path);
lstrcatA(val, "\\winetest.msi"); lstrcatA(val, "\\");
lstrcatA(val, msifile);
res = RegSetValueExA(props, "LocalPackage", 0, REG_SZ, res = RegSetValueExA(props, "LocalPackage", 0, REG_SZ,
(const BYTE *)val, lstrlenA(val) + 1); (const BYTE *)val, lstrlenA(val) + 1);
ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", res); ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", res);

View file

@ -24,7 +24,7 @@
#include "wine/test.h" #include "wine/test.h"
static const char *msifile = "winetest.msi"; static const char *msifile = "winetest-record.msi";
static BOOL create_temp_file(char *name) static BOOL create_temp_file(char *name)
{ {
@ -604,6 +604,9 @@ static void test_fieldzero(void)
r = MsiRecordIsNull(rec, 0); r = MsiRecordIsNull(rec, 0);
ok(r == FALSE, "Expected FALSE, got %d\n", r); ok(r == FALSE, "Expected FALSE, got %d\n", r);
r = MsiCloseHandle(hview);
ok(r == ERROR_SUCCESS, "MsiCloseHandle failed\n");
MsiCloseHandle(rec);
MsiCloseHandle(hdb); MsiCloseHandle(hdb);
DeleteFileA(msifile); DeleteFileA(msifile);
} }

View file

@ -63,9 +63,12 @@
#define PID_MSISOURCE PID_WORDCOUNT #define PID_MSISOURCE PID_WORDCOUNT
#define PID_MSIRESTRICT PID_CHARCOUNT #define PID_MSIRESTRICT PID_CHARCOUNT
const char *msifile = "winetest-suminfo.msi";
static const WCHAR msifileW[] = {
'w','i','n','e','t','e','s','t','-','s','u','m','i','n','f','o','.','m','s','i',0 };
static void test_suminfo(void) static void test_suminfo(void)
{ {
const char *msifile = "winetest.msi";
MSIHANDLE hdb = 0, hsuminfo; MSIHANDLE hdb = 0, hsuminfo;
UINT r, count, type; UINT r, count, type;
DWORD sz; DWORD sz;
@ -284,8 +287,6 @@ static void test_create_database_binary(void)
static const CLSID FMTID_SummaryInformation = static const CLSID FMTID_SummaryInformation =
{ 0xf29f85e0, 0x4ff9, 0x1068, {0xab, 0x91, 0x08, 0x00, 0x2b, 0x27, 0xb3, 0xd9}}; { 0xf29f85e0, 0x4ff9, 0x1068, {0xab, 0x91, 0x08, 0x00, 0x2b, 0x27, 0xb3, 0xd9}};
DWORD mode = STGM_CREATE | STGM_READWRITE | STGM_DIRECT | STGM_SHARE_EXCLUSIVE; DWORD mode = STGM_CREATE | STGM_READWRITE | STGM_DIRECT | STGM_SHARE_EXCLUSIVE;
static const WCHAR msifile[] = {
'w','i','n','e','t','e','s','t','.','m','s','i',0 };
IPropertySetStorage *pss = NULL; IPropertySetStorage *pss = NULL;
IPropertyStorage *ps = NULL; IPropertyStorage *ps = NULL;
IStorage *stg = NULL; IStorage *stg = NULL;
@ -295,7 +296,7 @@ static void test_create_database_binary(void)
PROPVARIANT propvar[10]; PROPVARIANT propvar[10];
USHORT data[2] = { 0, 0 }; USHORT data[2] = { 0, 0 };
r = StgCreateDocfile( msifile, mode, 0, &stg ); r = StgCreateDocfile( msifileW, mode, 0, &stg );
ok( r == S_OK, "failed to create database\n"); ok( r == S_OK, "failed to create database\n");
r = IStorage_SetClass( stg, &CLSID_MsiDatabase ); r = IStorage_SetClass( stg, &CLSID_MsiDatabase );
@ -386,7 +387,6 @@ static void test_create_database_binary(void)
static void test_summary_binary(void) static void test_summary_binary(void)
{ {
const char *msifile = "winetest.msi";
MSIHANDLE hdb = 0, hsuminfo = 0; MSIHANDLE hdb = 0, hsuminfo = 0;
UINT r, type, count; UINT r, type, count;
INT ival; INT ival;