主页
Top.Mail.Ru Yandeks.Metrika
论坛:“主要”;
当前存档:2002.07.29;
下载:[xml.tar.bz2];

向下

定义构造函数地址 找到类似的分支


Ученик   (2002-07-16 16:13) [0]

类的地址可以确定此类对象的构造函数的地址吗?

VAR
P:指针;
开始
P:= TBitmap;

需要计算TBitmap。使用P创建地址吗?



Skier   (2002-07-16 16:20) [1]

>学生
为什么呢?
您想做什么?



Ученик   (2002-07-16 16:23) [2]

>滑雪者
在类地址处调用该类的对象的创建,所有内容都可以通过组件清楚地看到,并且有一个构造函数; 覆盖;但是如果来自TPersistent或TObject?



Skier   (2002-07-16 16:27) [3]

>学生
对于TPersistent挖:
-RegisterClass
-UnRegisterClass
-注册类
-UnRegisterClasses
-FindClass
-GetClass






Ученик   (2002-07-16 16:29) [4]

TObject构造函数称为



Skier   (2002-07-16 16:30) [5]

>学生
在dogonku:
了解有关元类的信息。



Skier   (2002-07-16 16:32) [6]

>学生
还有为什么要使用TObject TBitmap?



Digitman   (2002-07-16 16:38) [7]

好吧,例如:

showmessage(inttohex(整数(@ TBitmap.Create),8));

并且,如果将您感兴趣的名称的构造方法声明为重载? 那怎么办

而且-为什么需要这个? 如果不是秘密?




Ученик   (2002-07-16 16:41) [8]

>滑雪者
VAR
P:TPersistentClass;
开始
RegisterClasses([TBitmap]);
P:= GetClass(“ TBitmap”);
如果P <> nil则
P.创建;
叫做TObject.Create

>数字人
调用类地址以创建此类的对象。



Digitman   (2002-07-16 16:42) [9]

好吧,假设您调用了一个构造类方法。
实际上,谁将为您创建实例?



Skier   (2002-07-16 16:48) [10]

>学生

类型 TBitmapClass = TBitmap的类; 变种 P:TBitmapClass; 开始 RegisterClasses([TBitmap]); P:= TBitmapClass(GetClass(“ TBitmap”)); 如果P <> nil则P.Create;



Ученик   (2002-07-16 16:53) [11]

>数字人
创建实例后,P.Create.Free将调用TBitmap.Destroy,只有构造函数才会引起问题。



Ученик   (2002-07-16 16:56) [12]

>数字人
创建实例后,P.Create.Free将调用TBitmap.Destroy,只有构造函数才会引起问题。
>滑雪者
以TBitmap为例,它可以是任何其他位置。

有某种方法表,构造函数不在一个固定的位置吗?



Digitman   (2002-07-16 17:39) [13]

>学生

不,等等...
因为您不想拒绝编译器服务,是由谁/如何以及如何从您创建实例的?

构造函数方法的主体不执行此操作,其任务是初始化现有实例



Ученик   (2002-07-16 17:46) [14]

>数字人
我不知道答案,我只是在学习,只是尝试执行上述代码,创建对象,
特定于它们的构造函数不被调用



Skier   (2002-07-16 17:55) [15]

>学生
不幸的是,TPersistent构造函数的后代没有
重叠(覆盖)。
这只能从TComponent :(



Digitman   (2002-07-16 17:56) [16]

>学生

当然,在此示例中将创建一个对象! 毫无疑问)

但是在此示例中,编译器隐式执行实现和调用代码以为您创建实例的工作。

您希望在运行时调用某种构造函数方法,就像某种实例初始化过程一样。 问题是-什么情况? 您将不得不自己照顾这个问题...

另一个问题-如果它有一个或多个(预先未知)参数,即使知道它的地址,也希望如何调用它?




Ученик   (2002-07-16 18:16) [17]

>数字人
>您只想在运行时调用某个构造函数方法>作为某种实例初始化过程。

我想调用一个对象的构造函数,我认为它应该执行所有操作,至少除了调用TObject.Create之外。 这确实有几个参数的问题,但是我现在想闭上眼睛,尽管如果组件库不匹配,一些奇怪的消息会在Delphi中闪烁。



Юрий Зотов   (2002-07-16 18:25) [18]

>学生

一切都以某种方式弄乱了。 简单说明-需要做什么? 创建一个非组件对象,知道对该类的引用吗? 还是别的?

还有你的例子

类型
TBitmapClass = TBitmap的类;

VAR
P:TBitmapClass;
开始
RegisterClasses([TBitmap]);
P:= TBitmapClass(GetClass(“ TBitmap”));
如果P <> nil则P.Create;

完全等效于通常的TBitmap.Create调用。 为什么会有这样的花哨?



Ученик   (2002-07-16 18:29) [19]

> Yuri Zotov
你搞砸了,不是我的。



Skier   (2002-07-16 18:31) [20]

这是我的 我只是以为学生想要
处理TBitmap的继承人。
他想到了别的东西:)



[NIKEL]   (2002-07-16 18:36) [21]

我认为无法获得析构函数和构造函数的地址...



Skier   (2002-07-16 18:39) [22]

> [NIKEL]
showmessage(inttohex(整数(@ TBitmap.Create),8));

你为什么不解决? :)



Юрий Зотов   (2002-07-16 18:48) [23]

真的很困惑,对不起。

但是到底是什么呢? 你看,我什么也没要求。 我澄清是因为我大概在猜测您想要什么,并且知道该怎么做。 但是为了说话,一定不要猜测,而要完全确定。



Ученик   (2002-07-16 19:11) [24]

> Yuri Zotov
因此没有陷阱,我想在该类的地址处创建该类的对象。



vuk   (2002-07-16 19:18) [25]

到Digitman:
>构造函数方法的主体不执行此操作,其任务是
>初始化现有实例
....
>您只想在运行时调用某个构造方法
>作为某种实例初始化过程。 问题是什么
>实例? 您将不得不自己照顾这个问题...

你错了 构造函数是创建实例的那个。 您可以获取他的地址,也可以致电(如果您知道)。 只有这是唯一的事情-最好不要这样做。 :o)



vuk   (2002-07-16 19:25) [26]

给学生:
您可以创建一个实例,但不能总是正确地执行它。 例如,对于TComponent继承人,这很简单(那里有一个虚拟构造函数),但是对于其他类,这可能会出现问题。



Ученик   (2002-07-16 19:27) [27]

> vuk
与其他人,只是问题)))



vuk   (2002-07-16 19:32) [28]

如果您需要创建_your_class的实例,那么一般不会解决此类任务,因为每个类都有自己的构造函数,并且未在任何表中注册。



Ученик   (2002-07-16 19:36) [29]

> vuk
> ...未在任何表中注册。

遗憾



Digitman   (2002-07-17 10:02) [30]

> vuk

这是微妙之处:

如果在调用特定类PON dl = 1的构造方法之前,则在初始化实例之前,将调用负责生成实例的ClassCreate系统过程。 否则(RON dl = 0),将仅进行初始化尝试,如果没有实例,这将导致异常。

使用dl = 0调用所有继承的构造函数。

在调用任何类的任何构造方法之前,总是在RON eax中输入VMT地址。

此外,如果类的构造方法具有参数,则还需要传递它们:第一个参数(按其在构造函​​数声明中的列出顺序)-RON ecx,其余参数-通过顺序压入堆栈。

>学生

整个编译器为程序员“透明地”生成了这个动作序列。

当显式调用构造函数(在实际地址处)时,忽略这些事实必然会导致异常情况。




Ученик   (2002-07-17 10:10) [31]

>数字人
如果您需要一些东西,可以用内置的汇编器编写,但是看起来好像没有地址,谢谢。



Игорь Шевченко   (2002-07-17 10:20) [32]

析构函数地址以-4偏移量写入VMT表中
(vmtDestroy)



Digitman   (2002-07-17 10:32) [33]

>学生

怎么不行 他在那!

过程TfMain.ButtonXClick(发送者:TObject);
VAR
VAR
p:程序;
c:TClass;
t:TObject;
开始
p:= @ TComponent.Create;
c:= GetClass(“ TComponent”);
ASM
mov dl,1 //创建一个实例
mov eax,[c] // VMT
mov ecx,0 //所有者=无
调用dword ptr [p] //实际上-在地址处调用构造函数
mov [t],eax //结果是到已创建和初始ex-p的链接
结束;

免费 //销毁创建的对象

结束;



Ученик   (2002-07-17 10:52) [34]

>伊戈尔舍甫琴科
关于设计师
>数字人
我们在调用由TObject和TPersistent生成的对象的构造函数时遇到问题,它们在组件方面没有问题;它们具有重写的构造函数; 一切都以通常的方式被调用
TComponentClass(FindClass(“ Class Name”))。创建(AOwner)



vuk   (2002-07-17 10:58) [35]

>这里有一些微妙之处
我是这个 一般而言,您可以轻松编写一些内容。 如果我们记得构造函数是一个返回创建实例的函数,那么一切就很简单。 没有参数的构造函数可以这样表示:

类型
TSimpleConstructor = function(ClassRef:TClass):TObject; 注册
因此,TComponent构造函数看起来像

类型
TComponentConstructor = function(ClassRef:TClass; AOwner:TComponent):TObject; 注册

然后,挑战就变得容易了。 假设在上面的示例中,变量p为TComponentConstructor类型,并且包含构造函数的地址,则其调用将如下所示:
ASM
mov dl,1
结束;
t:= P(c,nil);

但是仅在您引用的示例中,所有这些操作都是多余的,因为可以轻松完成所有操作,因为TComponent后代具有虚拟构造函数,并且不需要特别执行上述所有操作。 这绝不会帮助问题的作者解决问题,因为他不知道自己将创建什么类型的实例,因此将无法获得特定构造函数的地址(在突出显示的行中明确完成)。
有了TComponent的继承人,一切都很简单。 假设变量A包含某个TComponent后代的实例,则:
C:= TComponentClass(A.GetClass).Create(无);




Digitman   (2002-07-17 11:16) [36]

> vuk
>>对于问题作者解决他的问题,这绝对没有帮助

当然,这无济于事! 我在说这个,只是他似乎不明白这一点。

正如您所说,我所说的一切都是“复杂”的-仅是希望清楚地表明地址是正确确定的,并且很可能在接收到的地址上明确调用构造方法,但这充满了上述问题。

>学生

TComponent是TPersistent的直接后代,如果说您可以毫无问题地构造任何TComponent后代,那么在这种情况下还不清楚您会遇到什么困难。



Ученик   (2002-07-17 11:26) [37]

>数字人
>而我正在谈论这个,只是现在他似乎还不了解>。

我已经停止了学徒(16.07.02 19:36)

> TComponent是TPersistent的直接后继者,在这种情况下,如果说“您可以构造没有问题的任何TComponent后继者”,您将遇到什么困难尚不清楚。

正念缺乏主宰(Digitman,Yuri Zotov),正念,而您没有价格))),您撰写了许多有关简单事物的文章。







Digitman   (2002-07-17 11:56) [38]

>学生

我看不到您“停下来了” ...
因此,您仍然无法明智地解释问题的实质...

他们已经告诉过您-在任何情况下,您都需要提前了解注册对象的类,具有指向类描述符的链接并声明其构造函数。 只有这样,VMT才能通过上述警告调用类的构造方法。



Ученик   (2002-07-17 12:03) [39]

>数字人
正念,正念和正念,请再次阅读此页。



Digitman   (2002-07-17 12:40) [40]

>学生

废话 在这种情况下,是您不小心。

我引用你的话:

(1)
>>您需要计算TBitmap的地址。使用P创建,>>可以吗?

(2)
>> TObject构造函数称为


这是-再次-回答您的问题(1)并驳斥您的声明(2)的代码

您的TBitmap与TComponent不相关。

过程TfMain.ButtonXClick(发送者:TObject); 变种 变种 p:程序; c:TClass; t: TObject ; 开始 p:= @ TComponent.Create; //这是地址 RegisterClass(TBitmap); c:= GetClass(“ TBitmap”); 汇编 mov dl,1 mov eax,[c] call dword ptr [p] //这是TBitmap对象的创建 mov [t],eax 结束 免费 //这是创建的TBitmap对象的销毁 结束

画画,并确保自己!



Ученик   (2002-07-17 12:44) [41]

>数字人
如果这对您来说更容易,那么我会pent悔,我不知道我想要什么,我会提出愚蠢的问题,也不会听取伟大的Delphi大师的回答,我希望我们不会继续,有人应该变得更聪明。



Digitman   (2002-07-17 12:48) [42]

>学生

因此,如果“我不知道我想要什么”,请先找出原因,然后再粗心地指责那些想帮助您的人。 有认真的论据,不要胡说!



Ученик   (2002-07-17 12:52) [43]

>数字人
没有评论



Digitman   (2002-07-17 13:00) [44]

>学生
是的,先生,请您



Ученик   (2002-07-17 13:04) [45]

>数字人
)



Уролог   (2002-07-17 13:10) [46]

主啊! 在我看来,一位老专家认为Digitman©比Apprentice更厚实,更真实。 有一个潜在的想法,即学徒之徒被年轻的极简主义所折磨,但这是另一位专家。



Ученик   (2002-07-17 13:22) [47]

>泌尿科医生
您现在已经完全信誉卓著的Digitman。



Skier   (2002-07-17 13:23) [48]

领带,伙计们...



Digitman   (2002-07-17 14:32) [49]

>学生

不用担心我)
我绝对喜欢鼓吹无聊的局外人。

您在主题上说的重要得多...
但是您决定关闭主题,而不是将其变为事实……而且徒劳地……



Страницы: 1 2 整个分支

论坛:“主要”;
当前存档:2002.07.29;
下载:[xml.tar.bz2];

楼上





内存:0.73 MB
时间:0.071 c
14-95529年
[NIKEL]
2002-07-03 00:30
2002.07.29
放松!


4-95599年
德米特里谢诺克
2002-05-20 14:51
2002.07.29
如何确定窗口句柄的状态?


14-95570年
音乐
2002-06-27 17:33
2002.07.29
插座!


1-95345年
Ruslan0001
2002-07-18 11:23
2002.07.29
有更准确的计时器


14-95531年
恶魔
2002-07-02 16:16
2002.07.29
我仍然对人们感到惊讶





南非荷兰语 阿尔巴尼亚人 阿拉伯语 亚美尼亚 阿塞拜疆 巴斯克 白俄罗斯 保加利亚语 加泰罗尼亚 简体中文 中国(繁体) 克罗地亚 捷克 丹麦语 荷兰人 英语 爱沙尼亚语 菲律宾人 芬兰 法语
加利亚西语 格鲁吉亚语 德语 希腊语 海地克里奥尔语 希伯来语 印地语 匈牙利 北日耳曼语 印度尼西亚人 爱尔兰语 意大利语 日本 韩语 拉脱维亚 立陶宛 马其顿 马来语 马耳他语 挪威语
波斯语 波兰语 葡萄牙语 罗马尼亚 俄语 塞尔维亚 斯洛伐克 斯洛文尼亚 西班牙语 斯瓦希里 瑞典语 泰国人 土耳其 乌克兰 乌尔都语 越南人 威尔士语 意第绪语 孟加拉 波斯尼亚
宿务 世界语 古吉拉特语 豪萨语 苗族 伊博 爪哇 卡纳达语 高棉 老挝 拉丁语 毛利 马拉 蒙古人 尼泊尔 旁遮普 索马里 淡米尔文 泰卢固语 约鲁巴语
祖鲁
英文 Французский Немецкий Итальянский Португальский 俄文 Испанский