Delphi无法准确动态调用C++ dll库的几个缘故原由

藏宝库编辑 2024-10-4 18:24:02 54 0 来自 中国
摘自:http://t.zoukankan.com/ycloneal-p-5715537.html本文分析delphi调用C++DLL库的几个问题,并给出解决方法。
1、问题一:

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

如下图所示:

1.png 分析:

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


  • ①使用传统的模块界说文件 (.def);
  • ②使用extern "C"注明接口函数;
  • ③使用stdcall注明接口函数
详见:
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,导致第三方使用出问题。
解决方法:


  • ①将天生方式由Debug改为release;
  • ②天生dll的项目设置由MD改为MT。
    详见:
https://msdn.microsoft.com/zh-cn/library/2kzt1wy3.aspx  "MD与MT区别"3、问题三:

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

分析:

这和函数参数的入栈方式有关,跨语言最好采取stdcall
解决方法:


  • ①将dll接口函数设置为stdcall;
  • ②DELPHI调用函数声明时也要注明stdcall,如下
    myfunc: Function(cs:pchar):integer;Stdcall;
4、问题四:

delphi的函数指针在dll中调用堕落

分析:

缘故原由不明,笔者履历中,如以下代码,setCallback函数声明为
setCallback: Function(backfunc: PbackFunc)ointer;
则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)ointer;setCallback: PbackFunc;setCallback(@handle_message);
您需要登录后才可以回帖 登录 | 立即注册

Powered by CangBaoKu v1.0 小黑屋藏宝库It社区( 冀ICP备14008649号 )

GMT+8, 2024-11-23 16:25, Processed in 0.190952 second(s), 35 queries.© 2003-2025 cbk Team.

快速回复 返回顶部 返回列表