1 怎样编写一个VC的DLL,其导出的类能在Delphi中使用?怎样使用?
2 怎样编写一个Delphi的DLL,其导出的类能在VC中使用?怎样使用?
最好给个例子!
谢谢!

解决方案 »

  1.   

    VC、Delphi 在面向对象方面的内部实现是不一样的,两者在二进制级上的交互存在困难。除非都遵循 com 规范,但是这也不可能实现类的继承等相关特性
      

  2.   

    等待Delphi.net吧,在.net构架下可以轻松实现
      

  3.   

    导出类?何为导出类?1.只操作已生成的实例,不做代码级的共享
    2.利用规范的COM接口
    3.利用结构体做简易的代码级"类"共享
      

  4.   

    我给你提供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++的类定义中定义。
      

  5.   

    对了,你可以参考我对另一个贴的回答:Delphi可以使用VC做的DLL还原的LIB吗?(2003-9-8 21:27:20)
      

  6.   

    楼上的,好强啊,呵呵其实做成COM 接口就是了,毕竟这种跨语言的DLL 参数传递没有一个统一的规范是很麻烦的。比如你一不小心在接口里传递了一个string 怎么办?传递了一个动态数组怎么办?既然如此麻烦,不如使用COM,扩展性又好,又规整。