gpt4 book ai didi

C++ 自定义操作返回空字符串

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

我们在 C++ 中遇到延迟自定义操作的问题。我们只需要 customactiondata 属性“apacheconfpath”的值,该属性目前具有虚拟值 test。

这是我们的 C++ 自定义操作:

 UINT __stdcall AppendToApacheConfigFile(MSIHANDLE hInstall)
{
HRESULT hr = S_OK;
UINT er = ERROR_SUCCESS;
TCHAR sWord[100];

hr = WcaInitialize(hInstall, "AppendToApacheConfigFile");
ExitOnFailure(hr, "Failed to initialize");

TCHAR szActionData[MAX_PATH] = {0};
DWORD dActionDataLen = MAX_PATH;
MsiGetProperty (hInstall, TEXT("apacheconfpath"), TEXT(""), &dActionDataLen);

StringCbPrintf(sWord, 100, TEXT("%d"), dActionDataLen);
WcaLog(LOGMSG_STANDARD, "dActionDataLen = %s", sWord);

if (dActionDataLen > 0)
{
++dActionDataLen;
StringCbPrintf(sWord, 100, TEXT("%d"), dActionDataLen);
WcaLog(LOGMSG_STANDARD, "dActionDataLen(2) = %s", sWord);
MsiGetProperty (hInstall, TEXT("apacheconfpath"), szActionData, &dActionDataLen);
WcaLog(LOGMSG_STANDARD, "szActionData = %s", szActionData);
StringCbPrintf(sWord, 100, TEXT("%d"), dActionDataLen);
WcaLog(LOGMSG_STANDARD, "dActionDataLen(3) = %s", sWord);

//Do something with the value
}

LExit:
er = SUCCEEDED(hr) ? ERROR_SUCCESS : ERROR_INSTALL_FAILURE;
return WcaFinalize(er);
}

属性在我们的 wix 安装程序中设置:

<CustomAction Id="AppendToApacheConfigFile_Cmd" Property="AppendToApacheConfigFile" Value="/apacheconfpath=test;" />
<CustomAction Id="AppendToApacheConfigFile" BinaryKey="CustomActionDll" DllEntry="AppendToApacheConfigFile" Execute="deferred" />

<InstallExecuteSequence>
<Custom Action="AppendToApacheConfigFile_Cmd" Before="AppendToApacheConfigFile"><![CDATA[IIS_SELECTED <> 1]]></Custom>
<Custom Action="AppendToApacheConfigFile" After="DeployPhpRuntime"><![CDATA[IIS_SELECTED <> 1]]></Custom>
</InstallExecuteSequence>

我添加了很多日志记录来尝试查看发生了什么。似乎永远不会读取该属性,因为双字值始终为 0 且数据始终为空。我们永远不会通过第一次阅读。

根据日志设置的值

MSI (s) (80:C4) [20:59:30:210]: Executing op: CustomActionSchedule(Action=AppendToApacheConfigFile,ActionType=1025,Source=BinaryData,Target=AppendToApacheConfigFile,CustomActionData=/apacheconfpath=test;)

欢迎提供任何信息

最佳答案

当延迟的自定义操作请求数据时,它通过众所周知的标识符 CustomActionData 请求它。您可以在该行末尾的日志文件中看到引用的名称:

MSI (s) (80:C4) [20:59:30:210]: Executing op: CustomActionSchedule(Action=AppendToApacheConfigFile,ActionType=1025,Source=BinaryData,Target=AppendToApacheConfigFile,CustomActionData=/apacheconfpath=test;)

要访问数据,您需要将 MsiGetProperty 调用更改为更像:

MsiGetProperty(hInstall, TEXT("CustomActionData"), TEXT(""), &dActionDataLen);

注意:由于您已经在使用 wcautil,我强烈建议您使用 WcaGetProperty() 而不是 MsiGetProperty()。您需要检查 WcaGetProperty() 的返回代码,这样做您的自定义操作将正确处理用户取消。否则,您的自定义操作可能会吞没用户取消安装的尝试。

关于C++ 自定义操作返回空字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16135732/

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