TO dbExpress(都是昵称惹的祸) 真的是很复杂,其实我是想知道,对象和类在内存中到底是什么样的存放方式,有没有通过直接内存的读写,创建这个类的可能
看了大佬的两张帖子,标题都很强。我也不知道它们具体是怎么编排的。具体的你看看Delphi语言的帮助,看看System单元,在CPU调试窗跟踪一下,基本也差不了多少。我只知道类也是一个结构,在编译时间就已经确定好了。还知道的就是对象也是一个指针,它所指向的内容的第一个元素还是一个指针,这个指针指向类的VMT。复制类我只能说有可能吧,实际上可能性很小很小很小,我想Delphi Development Team也会摇头的。你不要认为类就是VMT,关键是还有类实现的代码。因为很多函数中涉及到地址的代码是由编译器写死了的,你复制了函数的代码,但是如何去修改这些和地址相关的代码呢?至于完全传递一个对象实例在运行时的内存映像,也不太可能,除非你是针对某一个类。如果给一个对象,你只知道它继承于TObject,也有它的类型信息,你也不可能100%正确地复制它,因为对象的所有成员看起来都是一个整数,但实际上有些成员是指针,实际的数据放在另外一个堆块里面,有些是字符串,有些甚至是对象或者借口。如果你知道一个对象继承于TComponent,当然你可以流化它,然后在另外一个进程中载入这个流,前提是吸收这个流的进程有这个对象的类的知识,但这种复制也不完全是复制,只能说是clone了。不要花太多时间在这上面了,毕竟这些东西是不应该直接存取的,不同版本的编译器有可能有不同的编排策略。proman大佬说得好,当你要用特殊的方法来解决你的问题,那么你应该考虑一下你是否应该改变一下思路了。
to dbExpress(都是昵称惹的祸) 标题很强是吧,主要是为了吸引高手的目光,你看效果还不错,虽然我的问题这么烂还是有高手回答你说得很有道理,完全接受,现在结贴。
一文中作者提到过,好像实现了,全文如下:-------------------------------------------------------------------
SizeOf不适合于对象,返回的总是4;对于固定类型可以正确返回;编译的时候确定大小
InstanceSize运行是确定大小。
对Class来说,instancesize应该是类的实例的实际占用内存空间的大小
除了你看得见的数据以外,在类的开头还有一个指针(4 Bytes)指向类的类型信息
如ParentClass、Function入口等信息(这一行的可靠性大约为70%)
我用VC和Delphi通过TCP/IP传递对象,就遇到了这个问题。
一定要把得到的指针的值加上4以后,再把其后的内容发给对方。(读取过程也一样)------------------------------------------------------------------
一个类也是存在内存中的,为什么不能读出其中的信息通过网络发送到另一个机器上再重新生成这个类
另一个进程必须知道这个对象是什么类型,否则如何使用?
好,如果另一个进程知道这个对象的类型,而且总是适用对象的方法来操作对象,那么就用DCOM或者CORBA吧,简单,不易出错。如果你要传递类,真的不知道怎么搞,光有类的信息是没有用的,你还要把函数的代码复制过去,还要在另一个进程动态建造一个Code段,修改类信息,以便类的函数指针正确指向了代码。
是不是太复杂了。但是你为什么不把类作在一个bpl,然后让另一个进程动态载入呢,岂不是更简单?