2012-05-31 51 views
1

在一個相對較新的XP(SP3)安裝中,我收到了來自MsiEnumProductsEx(來自msi.lib)調用的奇怪結果。這裏是我的代碼:MsiEnumProductsEx返回ERROR_MORE_DATA而不做任何事

TCHAR userId[8] = _T("s-1-1-0"); 
    UINT result; 
    index = 0; 
    TCHAR szInstalledProductCode[39]; 
    TCHAR szSid[40]; 
    MSIINSTALLCONTEXT context; 
    DWORD numChars = 40; 
    MSIINSTALLCONTEXT context; 
    result = MsiEnumProductsEx(NULL, userId, MSIINSTALLCONTEXT_ALL, index, szInstalledProductCode, &context, (LPTSTR)szSid, &numChars); 

這個函數調用後,所有的輸出變量保持不變;即szInstalledProductCode,szSid,contextnumChars保持不變;通過實際給予他們虛擬值並查看它們未被覆蓋來測試。此外,result設置爲234;這通常表示緩衝區太小,我需要傳入更大的緩衝區;應該用這個大小來填充numChars變量。但是,如前所述,numChars與之前的版本(40)保持完全一致,因此再次調用具有相同大小(加上一個用於空終止)的方法與第一次沒有什麼不同。

當我在其他機器上運行這個相同的代碼時,它的行爲完全如何,文檔說它應該表現 - 填充所有變量,包括szSid直到它的緩衝區長度;如果緩衝區太小,則返回ERROR_MORE_DATA並填充numChars以適當的大小。

所以我能想到的是這個Windows的安裝程序在某種程度上被破壞了,但我們需要了解Windows中特別錯誤的根本原因。任何人都可以給我指導;即使這只是某些調查途徑?

回答

0

以下是我解決了這個一個:

我用的ProcessMonitor從Sysinternals的,看它是做什麼的場景(這個比較這是實際工作的機器上使用的ProcessMonitor)的後面。我注意到,區別在於,只要它在HKCR/Installer/Products中查看,它就開始捆綁該過程(而在工作PC上,它隨後從註冊表中獲取安裝程序信息)。事實證明,那裏有一個格式不正確的產品代碼(不知何故是一個連字符),所以這個功能失敗了。不知道它是如何到達那裏的,但你去了。

+0

類似但不同的奇怪的東西:http://blog.iswix.com/2011/11/curious-case-of-corrupted-characters.html –