导入DLL到Inno中的问题

我正在使用innosetup安装脚本导入C ++ DLL。 该DLL代码如下所示:

void __stdcall SetFbParam(char *dbFileName,char *dbTableName,char *dbParamName,char *dbParamValue){
//of no use here and doesn't change anything}

在Innosetup中,我使用它导入它

procedure FBset(dbFileName,dbTableName,dbParamName,dbParamValue: String;);

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

但是,在启动安装程序期间,我总是遇到运行时错误,并说它无法导入我的dll。 我尝试了各种调用约定,但总是失败。 如果它非常重要,我将运行带有UAC的Win7 x64(安装程序请求权限提升并在此之后崩溃)。

确切的消息是:
错误
运行时错误(在-1:0):
无法导入
DLL:C:用户 Nevod 应用程序数据本地 TEMP 是-6LOEC.tmp MYDLL.DLL

该DLL在那里。

谢谢!


MyDll.dll 32位?

MyDll.dll是否依赖于同一目录中的任何其他DLL? 如果是这样,则需要在“MyDll.dll”之后列出这些DLL的名称以确保在加载MyDll.dll之前将其解压缩,并且您可能还需要“loadwithalteredsearchpath”选项。 帮助中的示例:

procedure ADllFunc(hWnd: Integer; lpText, lpCaption: String; uType: Cardinal);
external 'ADllFunc@files:A.dll,B.dll stdcall loadwithalteredsearchpath'; //A.dll depends on B.dll

(我知道它很老,但也可能有其他一些命中这个)

大多数情况下,函数的名称在C ++ DLL中被损坏。 我有同样的问题,我可以通过重新编译dll来解决它。 简而言之:

如果你从C ++导出类似如下内容:

void __stdcall foo() 

你会得到一个名为(Visual Studio)的函数:

?foo@@YGXXZ

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

extern "C" __declspec( dllexport ) void __stdcall foo()

不过,我发现Visual Studio会继续破坏,你会得到如下的东西:

_foo@0

我能够得到干净的名字的唯一方式在这里解释:C ++ DLL导出:装饰/缺点名称

罪魁祸首确实是__stdcall。 如果你从你的声明中删除它:

extern "C" __declspec( dllexport ) void foo()

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


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

  • DLL是32位模式(即使安装程序是为64位构建的,并且运行在64位模式下)
  • 导出的函数具有extern "C" __declspec( dllexport )修饰符
  • 使用cdecl调用约定,因为stdcall破损名称(http://msdn.microsoft.com/en-us/library/zxk0tw93.aspx)。 当然,可以在InnoSetup import语句中指定mangled名称。 但是使用cdecl似乎更容易
  • 链接地址: http://www.djcxy.com/p/44513.html

    上一篇: Problem with importing DLL into Inno

    下一篇: Inno Setup for Windows service?