导入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,请确保:
extern "C" __declspec( dllexport )
修饰符