1

私はこれについて完全に理解していないので、助けが必要です。MsiGetSummaryInformationMsiSummaryInfoGetPropertyを使用しようとしています

私は C++ のバックグラウンドを持っていないので、ご容赦ください。これが私の試みです:

    UINT sisStatus = MsiGetSummaryInformation(0,originalTransform,0,&sumh);
    //UINT sisStatus = MsiGetSummaryInformation(hDbObject,0,0,&sumh);
    if (ERROR_SUCCESS == sisStatus)
    {
        //success - start getting/setting SIS
        //UINT property_type = VT_LPSTR;

        UINT pcount;
        MsiSummaryInfoGetPropertyCount(sumh,&pcount);
        wcout << "PCount " << pcount << endl;

        UINT getpropertyid = 2; 
        UINT returnpropertyid;      
        int returnedIntPropData;
        FILETIME fileValPtr;     
        LPDWORD stringDataLength = 0;           
        LPWSTR propdata = L"";

        MsiSummaryInfoGetProperty(sumh,getpropertyid,&returnpropertyid,&returnedIntPropData,&fileValPtr,propdata, stringDataLength);

        wcout << "Propdata " << propdata << endl;
        wcout << "Stringlength " << stringDataLength << endl;


    }

しかし、うまくいかないようです。返された値は正しくないようです。誰でも光を当てることができますか?

アップデート

これが私の新しい(更新された)例です:

UINT getpropertyid = 2; 
        UINT returnpropertyid;      
        int returnedIntPropData;
        FILETIME fileValPtr;     
        LPDWORD stringDataLength = new DWORD();     
        LPWSTR propdata = new TCHAR[];

        UINT gps = MsiSummaryInfoGetProperty(sumh,getpropertyid,&returnpropertyid,&returnedIntPropData,&fileValPtr,propdata, stringDataLength);
        if (ERROR_SUCCESS == gps)
        {
            wcout << "RETURN CODE: " << gps << endl;

        wcout << "Propdata " << propdata << endl;
        wcout << "Stringlength " << stringDataLength << endl;
         }
        else
        {
            wcout << "RETURN CODE EXPAND: " << gps << endl;             

            int num = (int)stringDataLength;
            wcout << "Buffer size: " << num << endl;

            propdata = new TCHAR[num];
            stringDataLength = new DWORD(num);  

            MsiSummaryInfoGetProperty(sumh,getpropertyid,&returnpropertyid,&returnedIntPropData,&fileValPtr,propdata, stringDataLength);

            wcout << "Propdata " << propdata << endl;
            wcout << "Stringlength " << stringDataLength << endl;   


        }

この行: wcout << "Buffer size: " << num << endl;

3873856 を返しますが、これは少し大きいように見えますか? 私のコーディングは少し面倒だと思います。あなたの例は大きな助けになるでしょう!

4

1 に答える 1

0

new の呼び出しは避けてください。自分が何をしているのか本当にわからないと、苦痛の世界に陥ります。代わりに、既に割り当てたストレージのアドレスを渡します (たとえば、ローカル整数値を宣言するか、std::wstring のバッファーで)。wcout を使用する場所にたどり着くことはめったにありませんが、最初の例を私が書く方法に合わせて変更しました。(未解決の変数 fororiginalTransformとハードコードされた があることに注意してくださいuiProperty。)

PMSIHANDLE hSum;
DWORD dwErr = MsiGetSummaryInformation(0, originalTransform, 0, &hSum);
if (ERROR_SUCCESS == dwErr)
{
    UINT uiProperty = 2;
    UINT uiDataType = 0;
    INT iValue = 0;
    FILETIME ftValue = {0};
    std::wstring sValue;
    DWORD cchValue = MAX_PATH;
    sValue.resize(cchValue);
    dwErr = MsiSummaryInfoGetProperty(hSum, uiProperty, &uiDataType, &iValue, &ftValue, const_cast<LPWSTR>(sValue.data()), &cchValue);
    if (ERROR_MORE_DATA == dwErr)
    {
        sValue.resize(++cchValue);
        dwErr = MsiSummaryInfoGetProperty(hSum, uiProperty, &uiDataType, &iValue, &ftValue, const_cast<LPWSTR>(sValue.data()), &cchValue);
    }
    if (ERROR_SUCCESS == dwErr)
    {
        sValue.resize(cchBuf);
        if (VT_LPSTR == uiDataType)
            wcout << "String Data (" << cchBuf << "): " << sValue << "\n";
        else if (VT_I4 == uiDataType)
            wcout << "Numeric Data: " << iValue << "\n";
    }
    else
    {
        wcout << "Error retrieving property: " << dwErr << "\n";
    }
}
else
{
    wcout << "Error retrieving summary info: " << dwErr << "\n";
}
于 2013-10-25T12:32:18.567 に答える