您的位置:首页 > 编程语言 > Delphi

跨语言之間的互相掉用对象!

2005-01-29 16:19 162 查看
哈哈,我自己搞好了,主要是这样:

要实现从跨语言调用Delphi对象,首先要在Delphi单元的接口部分以及其他语言的头文件中说明需要共享的对象的接口,在对象接口中定义该对象包含哪些属性与方法,并说明可供共享的部分。对象的共享,关键在于方法的共享。在Delphi语言中,要使一个对象可以被共享,可以把它说明为两个接口部分,暂称为"共享接口"与"实现接口"。其中共享接口指明对象中哪些方法可被另一种语言所共享;实现接口则继承共享接口,并且在单元实现部分针对实现接口中的方法定义具体的实现。要定义一个可供其他语言共享的Delphi对象,共享接口的说明应注意:

在Delphi程序里,要共享的方法必须被说明为抽象(abstract),而且虚拟(virtual ),实现接口继承共享接口同时共享的函数一定要override;

在其他语言程序里,把从Delphi共享的方法说明成"pure virtual";

共享的对象方法必须在两种语言里都被说明成相同的调用方式,通常使用标准系统调用方式(stdcall)。

下面,举例说明这些规则,假设有这样的一个Delphi对象:
TTestObject=class
procedure Proc1(x:integer);
function Func1(x:integer):PChar;
procedure Proc2;
function Func2:integer;
end;

如果C++程序需要共享其中的方法Proc1、Func1,可把上述说明修改成以下形式:
STestObject=class
procedure Proc1(x:integer); virtual;stdcall; abstract;
function Func1(x:integer); virtual;stdcall; abstract;
end;
TTestObject=class(STestObject)
procedure Proc1(x:integer);override;stdcall
fuction Func1(x:integer):PChar;override;stdcall
procedure Proc2;
fuction Func2:integer;
end;

在其他语言中,例如C++
在C++程序中做如下对象原型说明:
class STestObject {
virtual void Proc1(int x)=0;
virtual char *Func1(int x)=0;
};
或Delphi
STestObject = class
  procedure Proc1;virtual;stdcall;abstract;
  function Func1:PChar;virtual;stdcall;abstract;
end

为了能在其他语言中成功地访问Delphi定义的类, Delphi接口说明时必须包含一个可共享的"制造函数(Factory Function)"CreateTestObject,该制造函数可被定义成Export,例如:

Library TestLib;
exports CreateTestObject;
function CreateTestObject:STestObject; stdcall;
begin
Result:=TTestObject.Create;
end;

end.

在其他语言中,例如C++
经过这样的处理,现在可在C++程序中使用这个由Delphi定义的对象,调用方式如下:

typedef STestObject * (*CreateTestObject)();
HANDLE h = Loadlibrary("test.dll");
CreateTestObject HCreateTestObject = GetProcAddress("CreateTestObject");

void UseTestObject(void) {
STestObject *theTestObject=HCreateTestObject ();
theTestObject->Proc1(10);
Char *str=theTestObject->Func1(0);
}

当调用制造函数CreateTestObject时,实际上已经在Delphi一侧占用了一个对象实例的空间,其他程序在针对该对象的所有处理完成后必须考虑释放这一空间,具体的实现可在Delphi中定义一个类,如上述Proc1的共享方法Free,以此来完成这一任务:
STestObject=class
procedure Proc1(x:integer); virtual; abstract; stdcall;
function Func1(x:integer); virtual; abstract; stdcall;
procedure Free; virtual; abstract; stdcall;
end;

implementation

procedure TTestObject.Free;
begin

end;

end.

这种技术不仅适合所有面向对象语言间对象的共享,原理是一样的,能实现跨语言项目的灵活开发,发挥所有语言各自的优势,增加开发效率。
另外还能实现统一对象接口的多态实现,代表就是插件技术。

                      --mikokong
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息