C++与Delphi中对象的互访.docx

C++与Delphi中对象的互访.docx

ID:59256688

大小:102.10 KB

页数:12页

时间:2020-09-08

C++与Delphi中对象的互访.docx_第1页
C++与Delphi中对象的互访.docx_第2页
C++与Delphi中对象的互访.docx_第3页
C++与Delphi中对象的互访.docx_第4页
C++与Delphi中对象的互访.docx_第5页
资源描述:

《C++与Delphi中对象的互访.docx》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库

1、C++与Delphi中对象的互访2015年9月18日QQ:QQ群:实现目标:1)测试在C/C++中调用Delphi对象的方法。2)测试在delphi中调用C++对象的方法。我们知道两种语言的编译器产生的代码有很多区别,这就造成跨语言的代码利用变得困难。但是对于一个程序员来说,只要所用的语言工具容许内存指针操作,那么总是有办法实现代码的互相调用。C/C++/Delphi都支持指针操作,因此可以遍历所有用户空间内存。而且Delphi编译器和C/C++编译器有很多选项可以让函数调用按照一定的规则产生代码。因此实现互访是有可能的。前

2、提:1)至少明白对象、类、继承等基本概念。2)至少明白DLL库是什么。3)至少明白栈、堆、函数调用是什么。4)对编译、链接、加载有基本概念。基本概念:1)对象这里简单介绍下“对象”的概念,对象其实就是一个内存数据块,与C语言的结构体(struct)没有本质区别。当我们create(或new)一个对象时,其实就是最终会向内存管理单元申请(malloc)一个能存放在类中声明的变量的大小的内存块。然后调用初始化函数(构造函数)来初始化申请到这个内存块。在delphi的System单元中classfunctionTObject.Ne

3、wInstance:TObject;beginResult:=InitInstance(_GetMem(InstanceSize));end;可以看到对象的create,就是先获取一块内存,然后初始化其中的变量。classfunctionTObject.InitInstance(Instance:Pointer):TObject;{$IFDEFPUREPASCAL}varIntfTable:PInterfaceTable;ClassPtr:TClass;I:Integer;beginFillChar(Instance^,In

4、stanceSize,0);//全部清0PInteger(Instance)^:=Integer(Self);//将类对象赋值给对象的第一个指针。对象通常在堆内存分配,而不在栈上分配,这是由编译器的策略决定的,因为对象通常在函数内部创建之后还有可能被函数外部使用,如果保留在栈上,那么栈就不能释放,这是不符合栈的使用要求的。偶尔也有在栈上分配对象的,例如C++语言的声明:CSomeClasscobject;这样的声明,会让编译器直接在栈上创建一个对象,这时cobject对象与struct类型没有本质区别,因此cobject.s

5、omeMethod类似结构体的“.”语法结构是正确的。此时需要注意的是,对象仅仅是在函数体内使用才这样声明。下面测试下直接将record(C/C++为struct)变量转换为对象。TMyClassRecord=recordpclass:Pointer;v1:integer;v2:integer;end;声明一个与类一样的记录结构,这类似C/C++的结构体,然后将第一个指针赋值为类对象地址,这样这个记录就是该类的一个对象。这也是可以在delphi中实现栈对象的方式。Varrobj:TMyclassRecord;在栈中创建了一个

6、对象robj,robj.pclass:=TMyClass;则TMyClass(@robj).someMethod方法调用就是(TMyClass.create).someMethod;robj.pclass:=TMyOtherClass;则TMyOtherClass(@robj).someMethod方法调用就是(TMyOtherClass.create).someMethod;这里有意思的就是将一个record类型变量直接变成了一个类的对象来使用,而且你可以转换成任意的类,只要该record的结构与该类的对象结构相同。如果要

7、在堆中创建对象,CSomeClasscobject=newCSomeClass();此时,cobject是一个对象指针,其地址是在栈上分配的,这个4字节(32位)的指针的值就是在堆中分配的地址。new会调用CSomeClass的构造函数,而在此之前还有很多其他代码,这些代码负责申请对象内存。此时必须采用cobject->someMethod这样的指针引用操作方式,而不是点语法。Delphi编译器不支持在栈中直接创建对象,因此Delphi中对象变量都是指针处理。类的方法函数与普通函数没有本质区别,只是这里有一点编译器为你做了的

8、事情,就是this/self这个指针会默认传递给类方法函数。cobject.someMethod(param1);编译后实际的函数会变成someMethod(cobject,param1);这样,我们就将对象与类的方法关联起来了,对于不同的对象调用同样的方法函数,实际上该函数操作的就是不同

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。