ユーザーが「UIモードなし」で実行されているかどうかを判断するために、C++カスタムアクション内から「UILevel」MSIプロパティを取得しようとしていますが、あまり運がありません。呼び出している関数には、DLLにエクスポートした関数からMSIHANDLEが渡されます(これは「遅延」または「最初のシーケンス」アクションのいずれかです)。私が見ているのは、それMsiGetPropertyW
が常に返さERROR_MORE_DATA
れ、trueLength
フィールドが常に0であるということです。これが私のコードです。
bool runningInNoUIMode(MSIHANDLE hInstall)
{
unsigned long nBufLen = 64UL;
WCHAR *wszValue = new WCHAR[nBufLen];
DWORD trueLength = 0UL;
UINT result = ::MsiGetPropertyW(hInstall, L"UILevel", L"", &trueLength); // Get the size of the property value first to see if there is enough storage allocated.
if (ERROR_MORE_DATA == result || nBufLen <= trueLength)
{
if (NULL != wszValue)
{
delete [] wszValue;
}
// Allocate more memory for the property adding one for the null terminator.
nBufLen = trueLength + 1;
wszValue = new WCHAR[nBufLen];
}
if (NULL == wszValue)
{
WcaLog(LOGMSG_STANDARD, "Unable to determine the user interface level the MSI is being run with because we were unable to allocate storage for accessing the 'UILevel' property.");
return false;
}
memset(wszValue, L'\0', nBufLen * sizeof(WCHAR));
result = ::MsiGetPropertyW(hInstall, L"UILevel", wszValue, &trueLength);
if (ERROR_SUCCESS != result)
{
WcaLog(LOGMSG_STANDARD, "Unable to determine the user interface level the MSI is being run with, error code = '%lu'.", result);
delete [] wszValue;
return false;
}
if (0 == wcscmp(L"2", wszValue)) // INSTALLUILEVEL_NONE == 2
{
delete [] wszValue;
return true;
}
delete [] wszValue;
return false;
}
今のところ、WiXを介して「UILevel」プロパティを渡し、C ++でそのようにチェックすることでこれを回避できると思いますが、ここでの問題も知りたいです。
WiX3.5.2519を搭載したWindows7でVisualStudio/ Visual C++2010を使用しています。
あなたが提供できるどんな援助にも感謝します!