1

比較的新しいXP(SP3)インストールで、MsiEnumProductsEx(msi.libから)への呼び出しから奇妙な結果が得られます。これが私のコードです:

    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実際にそれらにダミー値を与え、それらが上書きされていないことを確認することによってテストされました。さらに、result234に設定されています。これは通常、szSidバッファーが小さすぎること、およびより大きなバッファーを渡す必要があることを示しています。numChars変数はこのサイズで埋める必要があります。ただし、前述のように、numCharsは以前(40)とまったく同じままであるため、同じサイズ(およびnull終了の場合は1)でメソッドを再度呼び出すと、最初の場合と何ら変わりはありません。

これと同じコードを他のマシンで実行すると、ドキュメントに記載されているとおりに動作しますszSid。バッファ長までを含むすべての変数が入力されます。バッファが小さすぎる場合は、戻って適切なサイズERROR_MORE_DATAで埋めます。numChars

したがって、私が考えることができるのは、このWindowsのインストールが何らかの理由で壊れているということだけですが、Windowsで特に間違っている原因の根本的な原因を理解する必要があります。誰かが私にガイダンスを与えることができますか?調査するのが特定の方法であるとしても?

4

1 に答える 1

0

これが私がこれを解決した方法です:

SysInternalsのProcessMonitorを使用して、舞台裏で何が行われているかを確認しました(これを、実際に動作しているマシンでProcessMonitorを使用した場合と比較して)。違いは、HKCR / Installer / Productsを調べるとすぐに、プロセスを拘束し始めたことです(一方、動作中のPCでは、レジストリからインストーラー情報を取得し始めました)。そこに不正な形式の製品コード(最初はハイフン)が含まれていることが判明したため、関数は失敗していました。どうやってそこにたどり着いたのか分かりませんが、そこに行きます。

于 2012-05-31T04:57:25.980 に答える