关于VC和Delphi共享类的问题!急!!! 1 怎样编写一个VC的DLL,其导出的类能在Delphi中使用?怎样使用?2 怎样编写一个Delphi的DLL,其导出的类能在VC中使用?怎样使用?最好给个例子!谢谢! 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 VC、Delphi 在面向对象方面的内部实现是不一样的,两者在二进制级上的交互存在困难。除非都遵循 com 规范,但是这也不可能实现类的继承等相关特性 等待Delphi.net吧,在.net构架下可以轻松实现 导出类?何为导出类?1.只操作已生成的实例,不做代码级的共享2.利用规范的COM接口3.利用结构体做简易的代码级"类"共享 我给你提供Delphi调用VC++类的方法: 1、在VC++的头文件中说明类,注意,定义等类方法 (1)最后一个为析构函数; (2) 倒数第二个是建构方法; (3)定义公开的方法:virtual void _stdcall Free(),该方法将调用析构函数 (4) 其他所有方法均定义为:virtual 、_stdcall; (5)不要定义常数属性(即直接读取实例内步定义的变量的值),实现属性的方法、函数也要定义为virtual 、_stdcall; 2、在.cpp文件中: (1)实现类的方法,注意Free()的实现,要调用析构函数; (2)增加一个独立的函数:CreateObject,函数内部调用类的建构方法,返回类的句柄(假定为CCreateObject类型),(对应Delphi的调用方式为Cdel); (3)在.cpp文件的结尾出输出CreateObject函数: extern "C" __declspec(dllexport) CCreateObject CreateObject(......) 3、在Delphi程序中,重新定义类CCreateObject, (1)要完全按照在VC++中类的方法排列次序逐一说明(不包括建构和析构,但是包括Free),所有方法都定义为:Virtual;StdCall;Abstract; (2)定义新的建构方法 Class Function Create(......) CCreateObject; (3)说明函数类型: Type CCreateObject=Function(......); Cdecl; //函数类型 (4)定义函数变量: Var CreateObject: CCreateObject; (5)CCreateObject.Create(......)的实现,只需要一句话: Result:=CreateObject(......) 其中CreateObject就是从VC++的DLL中导出的建立CCreateObject实例的函数。 4、在Delphi程序中,可以动态连接VC++的Dll库: DLL_Handle:=LoadLibrary(PChar(DLLPath)); DLL_Handle>0 Then //若加载成功, Begin //则定位函数 Try @CreateObject:=GetProcAddress(DLL_Handle,'CreateObject'); Except FreeLibrary(DLL_Handle); End End 5、使用: 创建实例:AInst:=CCreateObject.Create(......); 调用方法:AInst.Method...... 与Delphi内定义的类一样处理。 注意: 1、实现的方法为Delphi的虚拟表方法; 2、在没有建立实例前,类方法也不能使用,因为类方法也只能通过实例才能映射过来,这与本地说明的类不一样; 3、一定要特别注意两边方法的对应关系; 4、在Delphi这边,同样也不能定义直接取或设置值的属性,必须用函数和方法实现,且实现的函数或方法一定要在VC++的类定义中定义。 对了,你可以参考我对另一个贴的回答:Delphi可以使用VC做的DLL还原的LIB吗?(2003-9-8 21:27:20) 楼上的,好强啊,呵呵其实做成COM 接口就是了,毕竟这种跨语言的DLL 参数传递没有一个统一的规范是很麻烦的。比如你一不小心在接口里传递了一个string 怎么办?传递了一个动态数组怎么办?既然如此麻烦,不如使用COM,扩展性又好,又规整。 求助!我的这个程序速度非常慢~,帮我分析一下是什么原因~?(内详细~有关字符处理的) 窗口的显示与隐藏?(在线等) 调查单位换算问题 再送100分!共200分!求答案! 跪谢cctv treeview,listview中删掉一个节点之后,其后的节点的data指向的地址是不是就不对了? 如何获得本机的网关?只有这么多分了,全部奉上! delphi7+access2003数据库,想把表2的kaipan根据daima“对号入座”到表1 如何把一个字符串转换成一个特定的数字? 网络能讯的问题 在DELPHI 中嵌入汇编指令 怎么判断oracle中一个字段的类型?
2.利用规范的COM接口
3.利用结构体做简易的代码级"类"共享
1、在VC++的头文件中说明类,注意,定义等类方法
(1)最后一个为析构函数;
(2) 倒数第二个是建构方法;
(3)定义公开的方法:virtual void _stdcall Free(),该方法将调用析构函数
(4) 其他所有方法均定义为:virtual 、_stdcall;
(5)不要定义常数属性(即直接读取实例内步定义的变量的值),实现属性的方法、函数也要定义为virtual 、_stdcall;
2、在.cpp文件中:
(1)实现类的方法,注意Free()的实现,要调用析构函数;
(2)增加一个独立的函数:CreateObject,函数内部调用类的建构方法,返回类的句柄(假定为CCreateObject类型),(对应Delphi的调用方式为Cdel);
(3)在.cpp文件的结尾出输出CreateObject函数:
extern "C" __declspec(dllexport) CCreateObject CreateObject(......)
3、在Delphi程序中,重新定义类CCreateObject,
(1)要完全按照在VC++中类的方法排列次序逐一说明(不包括建构和析构,但是包括Free),所有方法都定义为:Virtual;StdCall;Abstract;
(2)定义新的建构方法
Class Function Create(......) CCreateObject;
(3)说明函数类型:
Type CCreateObject=Function(......); Cdecl; //函数类型
(4)定义函数变量:
Var CreateObject: CCreateObject;
(5)CCreateObject.Create(......)的实现,只需要一句话:
Result:=CreateObject(......)
其中CreateObject就是从VC++的DLL中导出的建立CCreateObject实例的函数。
4、在Delphi程序中,可以动态连接VC++的Dll库:
DLL_Handle:=LoadLibrary(PChar(DLLPath));
DLL_Handle>0 Then //若加载成功,
Begin //则定位函数
Try
@CreateObject:=GetProcAddress(DLL_Handle,'CreateObject');
Except
FreeLibrary(DLL_Handle);
End
End
5、使用:
创建实例:AInst:=CCreateObject.Create(......);
调用方法:AInst.Method...... 与Delphi内定义的类一样处理。 注意:
1、实现的方法为Delphi的虚拟表方法;
2、在没有建立实例前,类方法也不能使用,因为类方法也只能通过实例才能映射过来,这与本地说明的类不一样;
3、一定要特别注意两边方法的对应关系;
4、在Delphi这边,同样也不能定义直接取或设置值的属性,必须用函数和方法实现,且实现的函数或方法一定要在VC++的类定义中定义。