我正在将C++动态链接库导入到innosetup安装脚本中。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:\Users\Nevod\AppData\Local\Temp\is-6LOEC.tmp\MyDll.dll
dll就在那里。
谢谢!
发布于 2010-08-27 12:48:34
MyDll.dll是32位的吗?
MyDll.dll是否依赖于同一目录中的任何其他DLL?如果是这样的话,您需要在" MyDll.dll“之后列出这些MyDll.dll的名称,以确保在加载DLL之前将它们提取出来,并且您可能还需要"loadwithalteredsearchpath”选项。来自help的示例
procedure ADllFunc(hWnd: Integer; lpText, lpCaption: String; uType: Cardinal);
external 'ADllFunc@files:A.dll,B.dll stdcall loadwithalteredsearchpath'; //A.dll depends on B.dll发布于 2013-11-14 19:01:02
(我知道它很旧,但也许这一次也有其他一些流行的东西)
在C++动态链接库中,函数的名称很可能是乱码。我也有同样的问题,我能够通过重新编译dll来解决它。简而言之:
如果从C++导出类似于以下内容的内容:
void __stdcall foo() 您将获得一个名为(Visual Studio)的函数:
?foo@@YGXXZ为了防止名称损坏,您应该使用export "C“指令。示例(Visual Studio)
extern "C" __declspec( dllexport ) void __stdcall foo()然而,我发现Visual Studio将继续变得混乱,你会得到类似的结果:
_foo@0这里解释了我能够获得干净名称的唯一方法:C++ DLL Export: Decorated/Mangled names
而罪魁祸首确实是__stdcall。如果您将其从声明中删除:
extern "C" __declspec( dllexport ) void foo()即使没有DEF文件,您也将再次获得干净的导出。这应该足够好了,因为上面的代码声明了一个"C“导出函数,并且C的默认调用约定是stdcall。然而,我还没有时间和部署来验证这一点,因为添加DEF文件比导航asm代码和检查堆栈指针要容易得多:)
发布于 2015-03-14 06:31:32
为了在InnoSetup的代码部分使用DLL,请确保:
extern "C" __declspec( dllexport )修饰符似乎更简单。
https://stackoverflow.com/questions/3549977
复制相似问题