【问题标题】:Problems calling function from C++ custom action dll WIX从 C++ 自定义操作 dll WIX 调用函数时出现问题
【发布时间】:2017-05-12 18:06:38
【问题描述】:

我目前正在使用 wix 并开发了一个安装程序。此安装程序调用 C++ 自定义操作 DLL。 DLL 和安装程序都已成功构建,但是当我去安装它时,安装以“安装程序向导因错误而提前结束”而结束,有人知道可能的答案吗?

这是 C++ Dll 函数:

extern "C" UINT __stdcall StopOrcService(MSIHANDLE hInstall)

然后我继续使用该函数的代码。然后我使用 def 文件将其导出。

<CustomAction Id='StopOrcService' BinaryKey='StopOrcService' DllEntry='StopOrcService' Execute='immediate' Return='check'/>

<InstallExecuteSequence>
  <Custom Action='StopOrcService' After='ProcessComponents' />
</InstallExecuteSequence>

<Binary Id='StopOrcService' SourceFile='SetupDLL.dll' />

这是我的 wix 代码。

【问题讨论】:

    标签: dll wix custom-action


    【解决方案1】:

    有几十种可能的答案,如果不看你的 C++ 和你的 WiX 代码就很难说。

    需要考虑的事项:

    C++ dll 是否特意构建为自定义操作? (它是否导出 Type1 stdcall MsiCustom Action?) 该函数的名称是什么? 您的 WiX 代码中的函数名称是否正确? 您是否在函数中添加了任何日志以查看它是否被执行?

    更新:您不应该使用自定义操作来执行安装程序本机可以执行的操作。此外,在创建需要提升和/或更改机器状态的 CA 时,它们应该始终被安排为延迟,而不是立即进行模拟。您需要阅读大量关于安装程序最佳实践的阅读资料,以解决您的战略问题,而不是解决您的战术问题。

    【讨论】:

    • 我想知道的第一件事是为什么要使用自定义操作来停止服务。您的导出语句可能会搞砸。看看Depends中的DLL,看看有没有导出函数。
    • 另一件事是您的 CA 计划立即执行。这在需要提升(例如启用 UAC )的机器上经常会失败,因为执行安装程序的人可能没有执行所需操作的权限。
    • 是的,它必须是,因为我需要找到我的应用程序安装位置的注册表值。我运行了一个日志文件,它显示错误 0x80070715:无法获取自定义操作 dll 的文件版本,尽管我已在我的 DLL 中添加了版本号
    • 你是如何制作这个 DLL 的?如果您使用的是 Visual Studio,WiX 有一个不错的 C++ 项目模板,可以为您设置这一切,包括创建版本资源记录。
    • 这个安装程序是另一个程序的插件,所以我必须停止该程序的服务,然后找到第一个程序安装到的注册表并将新插件添加到该位置。我在 wix C++ 中制作了 DLL 并添加了 .rc 文件,但它仍然给我错误
    【解决方案2】:

    我意识到我忘了添加以下行,这使我的代码可以完美运行。希望这对其他人有所帮助。:)

    #pragma comment(linker, "/EXPORT:StopOrcService=_StopOrcService@4")
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-07-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-03-28
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多