DELPHI盒子
!实时搜索: 盒子论坛 | 注册用户 | 修改信息 | 退出
检举帖 | 全文检索 | 关闭广告 | 捐赠
技术论坛
 用户名
 密  码
自动登陆(30天有效)
忘了密码
≡技术区≡
DELPHI技术
lazarus/fpc/Free Pascal
移动应用开发
Web应用开发
数据库专区
报表专区
网络通讯
开源项目
论坛精华贴
≡发布区≡
发布代码
发布控件
文档资料
经典工具
≡事务区≡
网站意见
盒子之家
招聘应聘
信息交换
论坛信息
最新加入: cuiqingbo
今日帖子: 20
在线用户: 15
导航: 论坛 -> DELPHI技术 斑竹:liumazi,sephil  
作者:
男 dbyoung (dbyoung) ★☆☆☆☆ -
普通会员
2021/1/31 23:17:06
标题:
分享:Delphi 如何调用 VC 的类的成员函数 浏览:1389
加入我的收藏
楼主: Delphi 如何调用 VC 的类的成员函数(一) --- 虚函数模式
Delphi 如何调用 VC 的类的成员函数(二) --- 内存模式

有不对之处,还望大侠指正。
----------------------------------------------
武汉天气不好
作者:
男 keymark (嬲) ▲▲▲△△ -
普通会员
2021/2/1 10:27:47
1楼: mark
----------------------------------------------
[alias]  co = clone --recurse-submodules  up = submodule update --init --recursiveupd = pullinfo = statusrest = reset --hard懒鬼提速https://www.cctry.com/>http://qalculate.github.io/downloads.htmlhttps://www.cctry.com/
作者:
男 vmao (毛小毛) ★☆☆☆☆ -
盒子活跃会员
2021/2/1 10:50:12
2楼: 专业
----------------------------------------------
-
作者:
男 mricy (Icy) ▲▲▲▲△ -
普通会员
2021/2/1 11:21:55
3楼: virtual; stdcall; abstract;
cdecl; external 'zelig-x64.dll' name '?CharRecognition@zeligkm@@TXAAXXQ'; 

个人专门为Delphi的话虚函数方式使用较多。。。
----------------------------------------------
哦哟喂,看过来: http://zelig.cn
作者:
男 www12345 (风云) ★☆☆☆☆ -
盒子活跃会员
2021/2/1 13:18:24
4楼: 按此在新窗口浏览图片
----------------------------------------------
一卡通专家的中专家www.cnduh.com
作者:
男 wr960204 (武稀松) ★☆☆☆☆ -
盒子活跃会员
2021/2/1 23:05:15
5楼: 1.VC的函数调用约定要制定位stdcall或cdecl。(否则成员函数默认是VC自己的fastcall,除非Delphi内嵌汇编,否则不支持。)
2.VC的函数最方便的方式是虚函数,Delphi这边声明一个抽象类,虚函数对应上就可以了。(否则要把VC的class导出,然后按照C的导出函数改名规则声明,再加上this的对象做参数,比较麻烦。)
3.还有就是包装成COM对象,实际上就是前面的stdcall加上虚函数的升级版。
----------------------------------------------
武稀松http://www.raysoftware.cn
作者:
男 letianwuji (大器晚成) ▲▲▲▲▲ -
普通会员
2021/2/1 23:39:10
6楼: 我记得有个示例不错的。delphi显示调用vc编写dll模块与隐式调用dll模块
----------------------------------------------
相信自己,若自己都不相信,那还有谁可信。
作者:
男 dbyoung (dbyoung) ★☆☆☆☆ -
普通会员
2021/2/2 7:45:01
7楼: DEMO 中的 DLL,是用 VS2019 向导建立的标准的 C++ Class DLL。
从 Depends 中可以看出,VS2019下,标准的 C++ Class DLL 导出函数约定:
x86 下是 thiscall,
x64 下是 cdecl。

thiscall Delphi 不支持。但与 stdcall 类似。可以用 stdcall 代替。
cdecl Delphi 本身就支持。

C++ 开源代码编写者,一般并不会采用虚函数的方法来写代码。
所以如果要在 Delphi 中使用的话,需要修改源代码。
或者自己进行封装。这种方法用的最多。很耗体力。又没有多少技术含量。
如果工作量大的话,就有可能被放弃。

内存法的好处,无需修改源码。有没有源代码也无所谓了。节省体力。
缺点如武哥说的那样,在 Delphi 中封装时要麻烦一些。从 DEMO 中看也是如此。
可以封装在一个对象或结构体中,放在一个单独的单元里。封装虽然麻烦些,但调用就方便了。

看了 Laex 大侠的 Delphi-OpenCV,一直在想,不用封装的方式,直接在 Delphi 中调用 OpenCV。
用内存法,技术上应该可以行的通了。打算有时间时折腾折腾。
----------------------------------------------
武汉天气不好
作者:
男 xjia (xjia) ★☆☆☆☆ -
盒子活跃会员
2021/2/2 8:53:40
8楼: 高手,学习
----------------------------------------------
-
作者:
男 wr960204 (武稀松) ★☆☆☆☆ -
盒子活跃会员
2021/2/3 10:49:33
9楼: @dbyoung (dbyoung)
VC的thiscall和stdcall并不类似,如果说相似的话,只能说和Delphi的register调用约定类似,前几个参数用寄存器传递,后面的用栈传递,但是用的寄存器有不同。
理论上来说VC的Class导出后会把每个成员函数都用C++的导出规则改名导出,只要Delphi这边你有耐心,把每个导出的成员函数都声明一遍也是可以调用到的。如果是thiscall的约定,那么就要内嵌汇编来调用。
另外X64下只有一种调用约定,就是stdcall,这个stdcall类似以前的cdecl栈是由调用方维护的。其他所有的调用约定都是stdcall的别名。
----------------------------------------------
武稀松http://www.raysoftware.cn
作者:
男 dbyoung (dbyoung) ★☆☆☆☆ -
普通会员
2021/2/3 15:07:16
10楼: @wr960204 (武稀松)

  VC(VS2019) 下,DLL X86 默认导出的是 thiscall。并不是 stdcall。
  我一开始认为 VC DLL 导出函数应该是stdcall。但是用Depends查看才发现导出的是 thiscall。
  我在 Delphi 中,X86 使用的是 stdcall。
  stdcall和thiscall 的区别,是thiscall将类指针(this)放入ECX中(我的理解,不知道对不对?)。
  我在 DEMO 中也是这样模拟的。所以程序可以正常运行。

  VC(VS2019) 下,DLL X64 默认导出的是 cdecl。也不是 stdcall。难道是别名?
  我在 Delphi 中,X64 模式下使用的是 cdecl,程序也是可以正常运行的。

  测试源码在这里:https://github.com/dbyoung720/DCallCppClassDll.git

  我理解有误,为什么代码却可以正常工作?

  迷糊了。

  望武哥能再次指点一下。以免别人被我误导。
----------------------------------------------
武汉天气不好
作者:
男 testerhook (CaptainHook) ★☆☆☆☆ -
普通会员
2021/2/4 11:28:47
11楼: Windows环境里,最省事的还是COM方式,当然VC编写COM并不是非常轻松,但是Delphi调用COM却是非常轻松的,哈哈。
另一个比较方便的就是用虚函数来调用VC的类,VC这边的类声明肯定要做一些限制的,要不Delphi这边调用会出很多麻烦。
武大大其实说的差不多了,我只是多嘴几句而已。
----------------------------------------------
-
作者:
男 wr960204 (武稀松) ★☆☆☆☆ -
盒子活跃会员
2021/2/4 11:40:44
12楼: @dbyoung (dbyoung)
是的啊,VC的成员函数X86下就是thiscall(也叫MS的Fastcall)啊。只能说明你之前对VC的成员函数X86的调用约定有误解。
X64下所有的调用约定都统一成stdcall了。我前面也说了,这个stdcall类似cdecl,堆栈是调用方维护的。
----------------------------------------------
武稀松http://www.raysoftware.cn
作者:
男 dbyoung (dbyoung) ★☆☆☆☆ -
普通会员
2021/2/4 12:30:19
13楼: 理解了。
谢谢武哥。
----------------------------------------------
武汉天气不好
信息
登陆以后才能回复
Copyright © 2CCC.Com 盒子论坛 v3.0.1 版权所有 页面执行70.3125毫秒 RSS