gpt4 book ai didi

C++ - MsiSummaryInfoGetProperty

转载 作者:太空宇宙 更新时间:2023-11-04 14:00:21 25 4
gpt4 key购买 nike

我完全不懂这个,所以需要一些帮助。我正在尝试使用 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 << "缓冲区大小:"<< num << endl;

返回3873856,好像有点大?我认为我的编码有点困惑。你的例子会很有帮助!

最佳答案

避免调用new;如果你真的不知道自己在做什么,那会让你陷入痛苦的世界。而是传递您已经分配的存储地址(例如,通过声明本地整数值,或在缓冲区中为 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";
}

关于C++ - MsiSummaryInfoGetProperty,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19566233/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com