Delphi无法正确动态调用C++ dll库的几个原因

2022-06-23  本文已影响0人  大龙10
摘自:http://t.zoukankan.com/ycloneal-p-5715537.html

本文说明delphi调用C++DLL库的几个问题,并给出解决方法。

1、问题一:

delphi找不到dll中的函数,出现“无法定位程序输入点”的问题

如下图所示:


分析:

这是因为dll库开放的函数名和代码中的函数名不致导致的,比如myfunc的函数名生成dll后变为_myfunc@12之类的问题,查看dll接口名可用depends工具。

解决方法:

详见:

http://www.cnblogs.com/fishseewater/archive/2010/10/05/1844292.html 
%dll 导出函数名的那些事"

2、问题二:

依赖DLL库找不到,比如vcruntime140.dll或vcruntime140.dll

原因:

使用VS生成DLL库,如果未使用release生成dll,且采用MD的方式会依赖VS自身的DLL,导致第三方使用出问题。

解决方法:

https://msdn.microsoft.com/zh-cn/library/2kzt1wy3.aspx 
 "MD与MT区别"

3、问题三:

delphi调用函数时参数传入有误,比如传如字符串在DLL中与delphi不同

分析:

这和函数参数的入栈方式有关,跨语言最好采用stdcall

解决方法:

4、问题四:

delphi的函数指针在dll中调用出错

分析:

原因不明,笔者经历中,如以下代码,setCallback函数声明为
setCallback: Function(backfunc: PbackFunc):Pointer;
则DLL中无法正常调用回调,如果将setCallback函数声明改为
setCallback: PbackFunc;
则DLL中可以正常调用。

type
   PbackFunc = procedure(message1:pchar); Stdcall;

procedure handle_message(const pardata:pAnsiChar);stdcall;
begin
    showmessage(pardata);
    Sleep(1000);
    exit;
end;

//setCallback: Function(backfunc: PbackFunc):Pointer;
setCallback: PbackFunc;

setCallback(@handle_message);
上一篇下一篇

猜你喜欢

热点阅读