跨语言之間的互相掉用对象!
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
要实现从跨语言调用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
相关文章推荐
- go语言序列化对象为二进制
- 利用jdk6中Annotation将XML与对象之间互相转化(一)
- L脚本语言 整数对象方法调用
- 面向对象语言的多态性问题
- go语言string、int、int64互相转换
- [转]DataURL与File,Blob,canvas对象之间的互相转换的Javascript
- 【适合初学者】简单代码讲述json数据与oc对象互相转化
- DataURL与File,Blob,canvas对象之间的互相转换的Javascript
- javaSE_8系列博客——Java语言的特性(一)--关于面向对象基本概念的理解(1)
- Python语言学习:Beautiful Soup四个对象的具体用法
- python 对象和json互相转换方法
- 二进制数据与对象之间互相转换
- 望大家互相指教,每个html语言必须的基本结构
- 黑马程序员-OC语言之类和对象
- 第02天OC语言(10):对象作为返回值
- 01-js对象和jq对象互相转换使用实例-jQuery实例
- JavaScript--基于对象的脚本语言学习笔记(三)
- 如何设计一门语言(三)——什么是坑(面向对象和异常处理)
- jsontools实现java对象与json值之间互相转换
- ZZ:使用.NET语言开发Silverlight应用程序入门(二):界面和对象模型