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";
}
相关文章:
- 没有找到相关文章