首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >将DLL导入Inno-Setup时出现问题

将DLL导入Inno-Setup时出现问题
EN

Stack Overflow用户
提问于 2010-08-24 01:15:58
回答 3查看 5.4K关注 0票数 1

我正在将C++动态链接库导入到innosetup安装脚本中。DLL代码如下:

代码语言:javascript
复制
void __stdcall SetFbParam(char *dbFileName,char *dbTableName,char *dbParamName,char *dbParamValue){
//of no use here and doesn't change anything}

在Innosetup中,我使用以下命令导入它

代码语言:javascript
复制
procedure FBset(dbFileName,dbTableName,dbParamName,dbParamValue: String;);

external 'SetFbParam@files:MyDll.dll stdcall setuponly';

但是,在启动安装程序时,我总是得到一个运行时错误,说它不能导入我的dll。我尝试过不同的调用约定,但总是失败。如果这很重要,我在UAC上运行Win7 x64 (安装程序请求权限提升,之后就会崩溃)。

确切的信息是:

错误

运行时错误(在-1:0):

无法导入

dll:C:\Users\Nevod\AppData\Local\Temp\is-6LOEC.tmp\MyDll.dll

dll就在那里。

谢谢!

EN

回答 3

Stack Overflow用户

发布于 2010-08-27 12:48:34

MyDll.dll是32位的吗?

MyDll.dll是否依赖于同一目录中的任何其他DLL?如果是这样的话,您需要在" MyDll.dll“之后列出这些MyDll.dll的名称,以确保在加载DLL之前将它们提取出来,并且您可能还需要"loadwithalteredsearchpath”选项。来自help的示例

代码语言:javascript
复制
procedure ADllFunc(hWnd: Integer; lpText, lpCaption: String; uType: Cardinal);
external 'ADllFunc@files:A.dll,B.dll stdcall loadwithalteredsearchpath'; //A.dll depends on B.dll
票数 6
EN

Stack Overflow用户

发布于 2013-11-14 19:01:02

(我知道它很旧,但也许这一次也有其他一些流行的东西)

在C++动态链接库中,函数的名称很可能是乱码。我也有同样的问题,我能够通过重新编译dll来解决它。简而言之:

如果从C++导出类似于以下内容的内容:

代码语言:javascript
复制
void __stdcall foo() 

您将获得一个名为(Visual Studio)的函数:

代码语言:javascript
复制
?foo@@YGXXZ

为了防止名称损坏,您应该使用export "C“指令。示例(Visual Studio)

代码语言:javascript
复制
extern "C" __declspec( dllexport ) void __stdcall foo()

然而,我发现Visual Studio将继续变得混乱,你会得到类似的结果:

代码语言:javascript
复制
_foo@0

这里解释了我能够获得干净名称的唯一方法:C++ DLL Export: Decorated/Mangled names

而罪魁祸首确实是__stdcall。如果您将其从声明中删除:

代码语言:javascript
复制
extern "C" __declspec( dllexport ) void foo()

即使没有DEF文件,您也将再次获得干净的导出。这应该足够好了,因为上面的代码声明了一个"C“导出函数,并且C的默认调用约定是stdcall。然而,我还没有时间和部署来验证这一点,因为添加DEF文件比导航asm代码和检查堆栈指针要容易得多:)

票数 3
EN

Stack Overflow用户

发布于 2015-03-14 06:31:32

为了在InnoSetup的代码部分使用DLL,请确保:

  • DLL处于32位模式(即使安装程序是为64位构建的并在64位模式下运行)
  • 导出函数具有extern "C" __declspec( dllexport )修饰符
  • 使用cdecl调用约定,因为标准调用损坏名称(http://msdn.microsoft.com/en-us/library/zxk0tw93.aspx)。当然,也可以在InnoSetup import语句中指定损坏的名称。但是使用cdecl

似乎更简单。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3549977

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档