|
|
作者: |
|
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楼: |
专业
----------------------------------------------
-
|
作者: |
|
2021/2/1 11:21:55 |
3楼: |
virtual; stdcall; abstract; cdecl; external 'zelig-x64.dll' name '?CharRecognition@zeligkm@@TXAAXXQ';
个人专门为Delphi的话虚函数方式使用较多。。。
----------------------------------------------
哦哟喂,看过来: http://zelig.cn
|
作者: |
|
2021/2/1 13:18:24 |
4楼: |
----------------------------------------------
一卡通专家的中专家www.cnduh.com
|
作者: |
|
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
|
作者: |
|
2021/2/1 23:39:10 |
6楼: |
我记得有个示例不错的。delphi显示调用vc编写dll模块与隐式调用dll模块
----------------------------------------------
相信自己,若自己都不相信,那还有谁可信。
|
作者: |
|
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楼: |
高手,学习
----------------------------------------------
-
|
作者: |
|
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
|
作者: |
|
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
我理解有误,为什么代码却可以正常工作?
迷糊了。
望武哥能再次指点一下。以免别人被我误导。
----------------------------------------------
武汉天气不好
|
作者: |
|
2021/2/4 11:28:47 |
11楼: |
Windows环境里,最省事的还是COM方式,当然VC编写COM并不是非常轻松,但是Delphi调用COM却是非常轻松的,哈哈。 另一个比较方便的就是用虚函数来调用VC的类,VC这边的类声明肯定要做一些限制的,要不Delphi这边调用会出很多麻烦。 武大大其实说的差不多了,我只是多嘴几句而已。
----------------------------------------------
-
|
作者: |
|
2021/2/4 11:40:44 |
12楼: |
@dbyoung (dbyoung) 是的啊,VC的成员函数X86下就是thiscall(也叫MS的Fastcall)啊。只能说明你之前对VC的成员函数X86的调用约定有误解。 X64下所有的调用约定都统一成stdcall了。我前面也说了,这个stdcall类似cdecl,堆栈是调用方维护的。
----------------------------------------------
武稀松http://www.raysoftware.cn
|
作者: |
|
2021/2/4 12:30:19 |
13楼: |
理解了。 谢谢武哥。
----------------------------------------------
武汉天气不好
|
|