【问题标题】:WIX passing parameter to C++ custom actionWIX 将参数传递给 C++ 自定义操作
【发布时间】:2016-08-05 10:13:28
【问题描述】:

我有一个 c++ 自定义操作函数,如下所示。此函数用于从 INi 文件中检索 Ini 部分。

extern "C" LPSTR PASCAL EXPORT ReadFile(LPSTR IniFilename, LPSTR IniFIleSection, LPSTR IniKey, LPSTR DefaultValue)
{

    static char MyValue[512];
    sprintf(sValue, "%s %s %s %s",IniFilename, IniFIleSection, IniKey, DefaultValue);
    GetPrivateProfileString(IniFIleSection, IniKey, DefaultValue, MyValue, 512,IniFilename);
    return (sValue);

}

我正在为 Customaction 使用 Wix 防御,如下所示

 <Binary Id="CustomCallId" SourceFile="CustomDllname.dll"  />
 <CustomAction Id="ReadValue" BinaryKey="CustomCallId" DllEntry="ReadFile"/>

 <InstallExecuteSequence>
  <Custom Action="ReadValue" Sequence="71" />
</InstallExecuteSequence>

但我不确定如何将参数从 WIX 自定义调用传递给 DLL。

【问题讨论】:

    标签: c++ visual-c++ wix windows-installer installation


    【解决方案1】:

    Windows 安装程序不支持此功能。它只能调用原型为UINT __stdcall CustomAction(MSIHANDLE hInstall) 的C++ DLL 中的函数。然后该函数的实现可以使用MSIHANDLE 来访问活动安装中的属性。

    如果您控制此 DLL 中的代码,您可以导出一个辅助函数,该函数读取属性,然后调用您原来的 ReadValue 函数。或者,您可以研究其他方法来包装该调用。

    【讨论】:

    • InstallShield 对此有一个很好的模式。 (标准 DLL)。
    【解决方案2】:

    理想情况下,这种类型的自定义操作应该是数据驱动的。这是 C# 中的概念。 C++ 基本相同。事实上,MichaelU (InstallShield) 非常友好地将我的 C# 代码翻译成 C++ 代码。

    http://blog.deploymentengineering.com/2008/05/data-driven-cas-made-easy-with-dtf.html

    你想定义一个像这样的表:

    [INI搜索器] INISearcher(唯一性的主键) FileName [格式化为能够使用属性的类型] 部分 钥匙 默认数据 属性_

    您的 CA 可以查询此表、迭代结果、格式化文件名并执行 INI 读取,然后将结果存储在表中列出的属性中。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-01-21
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多