Aric Stewart wrote:
+ WCHAR buf[21]; + WCHAR buf2[21];
It would be nicer to get rid of the magic numbers, and to call the variables something more meaningful than buf1, buf2.
+ rc = MSI_DatabaseOpenViewW(package->db, ExecSeqQuery, &view); + if (rc != ERROR_SUCCESS) + return ERROR_SUCCESS; + + rc = MSI_IterateRecords(view, NULL, ITERATE_PublishComponent, package);
return rc; }
You need to release the view you opened. MSI_IterateRecords leaves the view intact (it does not call msiobj_release).
@@ -1297,11 +1298,93 @@ DWORD Unused1, DWORD Unused2, LPWSTR lpPathBuf, DWORD* pcchPathBuf) { - FIXME("%s %s %li %s %li %li %p %p\n", debugstr_w(szComponent), + HKEY hkey; + UINT rc; + WCHAR info[124];
What is info, and why is it 124 bytes long?
+ DWORD sz; + LPWSTR product = NULL; + LPWSTR component = NULL; + LPWSTR ptr; + GUID clsid; + + TRACE("%s %s %li %s %li %li %p %p\n", debugstr_w(szComponent), debugstr_w(szQualifier), dwInstallMode, debugstr_w(szProduct), Unused1, Unused2, lpPathBuf, pcchPathBuf); + + rc = MSIREG_OpenUserComponentsKey(szComponent, &hkey, FALSE); + if (rc != ERROR_SUCCESS) + return ERROR_INDEX_ABSENT; + + sz = sizeof(info); + rc = RegQueryValueExW( hkey, szQualifier, NULL, NULL, (LPVOID) info, &sz); + if (rc != ERROR_SUCCESS) + return ERROR_INDEX_ABSENT;
You need to close the hkey you opened.
+ rc = MsiProvideQualifiedComponentW(szwComponent, szwQualifier, + dwInstallMode, lpwPathBuf, &pcchwPathBuf); + + HeapFree(GetProcessHeap(),0,szwComponent); + HeapFree(GetProcessHeap(),0,szwQualifier); + WideCharToMultiByte(CP_ACP, 0, lpwPathBuf, pcchwPathBuf, lpPathBuf, + *pcchPathBuf, NULL, NULL); + *pcchPathBuf = pcchwPathBuf;
This is wrong for multibyte locales, isn't it?
Index: dlls/msi/msipriv.h =================================================================== RCS file: /home/wine/wine/dlls/msi/msipriv.h,v retrieving revision 1.52 diff -u -r1.52 msipriv.h --- dlls/msi/msipriv.h 11 Apr 2005 12:47:20 -0000 1.52 +++ dlls/msi/msipriv.h 18 Apr 2005 18:57:52 -0000 @@ -357,6 +357,7 @@ extern UINT MSIREG_OpenFeatures(HKEY* key); extern UINT MSIREG_OpenFeaturesKey(LPCWSTR szProduct, HKEY* key, BOOL create); extern UINT MSIREG_OpenComponents(HKEY* key); +extern UINT MSIREG_OpenUserComponentsKey(LPCWSTR szComponent, HKEY* key, BOOL create); extern UINT MSIREG_OpenComponentsKey(LPCWSTR szComponent, HKEY* key, BOOL create); extern UINT MSIREG_OpenProductsKey(LPCWSTR szProduct, HKEY* key, BOOL create); extern UINT MSIREG_OpenUserFeaturesKey(LPCWSTR szProduct, HKEY* key, BOOL create);
Can't we have one or two functions that do the same thing as all the above to avoid the duplication of similar code? Mike