2012-07-26 75 views
0

我现在正在使用wix并开发了一个安装程序。此安装程序调用C++自定义操作DLL。 DLL和安装程序都正在构建,但是当我去安装它时,安装程​​序以“安装程序向导由于错误提早结束”而结束“任何人都知道可能的答案?从C++自定义动作DLL调用函数的问题WIX

这是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代码。

回答

-1

我已经意识到,我忘了添加下面这行代码,使我的代码完美工作。希望这可以帮助其他人。:)

#pragma comment(linker, "/EXPORT:[email protected]") 
1

有几十个可能的答案,很难说没有看到你的C++和你的WiX代码。

需要考虑的事情:

曾是C++的dll故意建成一个自定义操作? (它是否导出Type1 stdcall MsiCustom操作?) 该函数的名称是什么? 您的WiX代码中的功能名称是否正确? 你把你的函数中的任何日志记录,看看它是否被执行?

更新:您不应该使用自定义操作来执行安装程序本身可以执行的操作。另外,在创建需要提升和/或更改机器状态的CA时,应始终将其安排为延期,而不能立即模拟。你需要阅读大量的安装程序最佳实践来解决你的战略问题,而不是分散你的战术问题。

+0

首先我想知道的是为什么要自定义操作来停止服务。你的出口报表可能会搞砸。看看Depends中的DLL,看看你是否看到了导出的函数。 – 2012-07-26 16:08:22

+0

另一件事是您的CA被安排执行。在需要提升的机器上(例如启用UAC),这经常会失败,因为执行安装程序的人可能无权执行所需的操作。 – 2012-07-26 16:09:36

+0

是的,它必须是,因为我需要找到注册表值,以我的应用程序将要安装的位置。我运行了一个日志文件,它说错误0x80070715:无法获取自定义操作DLL的文件版本,尽管我已经向我的DLL添加了一个版本号 – 2012-07-26 16:19:07