• 设为首页
  • 点击收藏
  • 手机版
    手机扫一扫访问
    迪恩网络手机版
  • 关注官方公众号
    微信扫一扫关注
    公众号

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

原作者: [db:作者] 来自: [db:来源] 收藏 邀请

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

问题一:delphi找不到dll中的函数,出现“无法定位程序输入点”的问题,如下图所示。

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

解决方法:①使用传统的模块定义文件 (.def);

              ②使用extern "C"注明接口函数;

              ③使用stdcall注明接口函数

              详见: http://www.cnblogs.com/fishseewater/archive/2010/10/05/1844292.html 

问题二:依赖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 

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

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

解决方法:①将dll接口函数设置为stdcall;

              ②DELPHI调用函数声明时也要注明stdcall,如下

                  myfunc: Function(cs:pchar):integer;Stdcall;

问题三: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);

 

         

 


鲜花

握手

雷人

路过

鸡蛋
该文章已有0人参与评论

请发表评论

全部评论

专题导读
上一篇:
有感于哈工大matlab被限制使用发布时间:2022-07-18
下一篇:
Delphi消息处理机制发布时间:2022-07-18
热门推荐
阅读排行榜

扫描微信二维码

查看手机版网站

随时了解更新最新资讯

139-2527-9053

在线客服(服务时间 9:00~18:00)

在线QQ客服
地址:深圳市南山区西丽大学城创智工业园
电邮:jeky_zhao#qq.com
移动电话:139-2527-9053

Powered by 互联科技 X3.4© 2001-2213 极客世界.|Sitemap