C++ - MsiSummaryInfoGetProperty

C++ - MsiSummaryInfoGetProperty

本文关键字:MsiSummaryInfoGetProperty C++      更新时间:2023-10-16

我对此完全不了解,所以需要一些帮助。 我正在尝试使用 MsiGetSummaryInformation 和 MsiSummaryInfoGetProperty

我不是出身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 <<"缓冲区大小: " <<num <<endl;

返回3873856,这似乎有点大? 我认为我的编码有点混乱。 您的示例将有很大帮助!

避免打电话给新人;如果你真的不知道自己在做什么,这会让你陷入痛苦的世界。而是传递已分配的存储地址(例如,通过声明本地整数值,或在缓冲区中为 std::wstring)。我已经修改了您的第一个示例,使其更像我编写它的方式,尽管我很少最终使用wcout。(请注意,originalTransform仍然有一个悬而未决的变量和一个硬编码的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";
}
相关文章:
  • 没有找到相关文章