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

向下

如何中断构造函数? 找到类似的分支


Giemgo   (2003-04-13 00:26) [0]

如果在构造函数中检查某些条件时,当对象的进一步生命没有意义时会出现这种情况,那么如何中断Create? 不创造创造? 另外,该对象尚未创建...

第二个问题是如何让调用者知道对象的构造正在被取消? 我不能使用异常,SysUtils没有连接(我在纯WinApi上写)。

最后 - 如果可以使用例外 - 应该生成什么样的异常?



Набережных С.   (2003-04-13 09:36) [1]

程序Project1; {$ APPTYPE CONSOLE} 使用 窗口; 类型 TObj = class 公开 构造函数创建; 析构者摧毁; 覆盖; 结束; TExc = class 私人 FMsg:string; 公开 构造函数Create(Msg:string); 析构者摧毁; 覆盖; 结束; {} TExc 构造函数TExc.Create(Msg:string); 开始 WriteLn(“TExc.Create”); FMsg:= Msg; 结束; 析构函数TExc.Destroy; 开始 WriteLn(“TExc.Destroy”); MessageBox(0,PChar(FMsg),“错误”,MB_OK或MB_ICONERROR或MB_SYSTEMMODAL); 继承; 结束; {} TObj 构造函数TObj.Create; 开始 WriteLn(“TObj.Create”); 提高TExc.Create(“TObj创建失败!”); 结束; 析构函数TObj.Destroy; 开始 WriteLn(“TObj.Destroy”); 继承; 结束; 开始 //在此处插入用户代码 尝试 TObj.Create; 除了 在E上:TExc执行WriteLn(“>>> >>> TExc异常”); 否则提高; 结束; ReadLn; 结束。

你有什么害怕这个SysUtils?



Юрий Зотов   (2003-04-13 10:21) [2]

> Giemgo(13.04.03 00:26)

>如何打断创建? 不要调用相同的创建
>析构函数?

在构造函数中激发任何异常。 对象将自动销毁,析构函数也将自动调用。 事实是,编译器使用隐式try-except块包围所有构造函数代码,我们得到如下内容:

Sozdat_obekt;
尝试
Nash_kod_konstruktora;

Unichtozhit_obekt;
提高;
结束;


>此外,该对象尚未创建...

不是那样的 已经创建。 该对象由编译器生成的特殊隐藏代码创建。 也就是说,在构造函数的INPUT中,对象ALREADY存在,构造函数中的OUR代码仅初始化它。


>如何让调用者清楚知道对象的构造被取消了?

如果在调用构造函数时发生异常,则这是要取消的信号。


>我不能使用异常,SysUtils没有连接(我写
>纯粹的WinApi)。

好吧,写信给你的健康,SysUtils阻止了什么? 在这里,假设我们在纯API上编写。 他们编写了一般应用程序的几个功能,将它们带入一个单独的模块并将其连接到程序。 正常电路? 这很正常。 所以使用SysUtils - 完全相同的事情。 您的程序中未使用的SysUtils函数将不会包含在链接器中,因此如果您连接SysUtils,您的代码大小会稍微增加(检查它 - 自己查看),但是有很多便利设施。 它不盈利吗?

好吧,如果这很重要,那就按照Naberezhnye S.的说明去做吧。


>如果可以使用例外

你可以,没有任何问题。


>应该生成什么样的异常?

任何。



Giemgo   (2003-04-13 13:02) [3]

您的程序中未使用的SysUtils 链接器ve不会包含它

你在谜语中跟我说话。
我们这样做吧。 为我的项目构建。 生成的exe 18444的大小。 在使用中我添加了SysUtils。 我没有使用任何程序,收到的41984代码的大小

当然,我明白你把这个补充称为悲惨,但仍然超过一倍! 或许他们意味着别的什么?

在我看来,在Delphi中,该单元完全包含在内。 假设我添加到相同的项目表单 - exe 368640的大小。 也许我的链接器不能正常工作,但它总是对我有用。

一般来说,为什么有像KOL这样的库? 毕竟,她的整个技巧就是这样,为了不将未使用的东西连接到程序中,与VCL不同



Юрий Зотов   (2003-04-13 14:33) [4]

> Giemgo(13.04.03 13:02)

由于连接模块的初始化/终结代码(以及它所指的那些代码),它们的内部全局常量,变量等,大小会增加。

但是来自这些模块的那些程序/功能的代码是FACTS
程序没有调用,它没有连接。

运行时包是个例外。 链接器不能事先知道包将用于什么以及它将不会用于什么,因此,它包括包中的所有内容。 但据我所知,这不是你的情况。

我同意,对于纯API,23 K中的添加剂可能不合理地大。 但是你也创建了一个海豚对象 - 这是什么样的“纯API”? 已经不干净了。

虽然最终所有这些都不是那么重要,因为:
“好吧,如果这是如此根本,那就像Naberezhnye S.所展示的那样。”

所以你摆脱了SysUtils。 其他一切(关于构造函数中的加注)仍然有效。



Giemgo   (2003-04-13 15:09) [5]

Yuri Zotov,谢谢! 我几乎了解一切。

为什么你称我的项目不是纯粹的WinApi? 嗯,是的,我连接了Windows类型的模块,但这只是为了不自己编写WinApi函数的导出

为什么Forms会增加大小(300上的千字节)。 在任何犯罪,全局常量的初始化,一次和错误估计?



Anatoly Podgoretsky   (2003-04-13 15:27) [6]

好吧,没有犯罪,厌倦了运行这个初始化和进一步的链接。
好吧,既然你有一个干净的API,你不需要任何例外,因为Windows不以任何方式支持它们。 这些是Delphi及其课程的特质。



Giemgo   (2003-04-13 15:37) [7]

在这里,我听说异常与win32异常完全兼容。 而且,假设编写在delph上的DLL库中的异常可以在用VC编写的程序中捕获,该库将使用该程序。

除非例外是delfi及其类的属性? 我想到了例外 - 这就是这样的类



Anatoly Podgoretsky   (2003-04-13 15:40) [8]

你被残忍地欺骗了,不要再听他们了。 WinApi中没有例外。



Giemgo   (2003-04-13 15:49) [9]

而且,当然,我道歉,没有注意到Forms中的RegisterFindGlobalComponentProc

为什么残酷欺骗? 似乎Teixer和Pacheco ......我现在会看到......可能,我什么都不懂



Anatoly Podgoretsky   (2003-04-13 15:52) [10]

Teixer和Pacheco讨论了Delphic组件和函数,包括那些可以抛出异常的组件和函数,对API函数的调用进行特殊的包装,处理返回的结果。
在Windows零,井,不,不可以,它的设计使它能够执行用任何语言编写的应用程序。



Giemgo   (2003-04-13 15:59) [11]

好吧,我发现:

“在Delphi2中,情况不再如此.Delphi6异常完全对应于Win32异常”

但据我了解,win32例外仅存在于库中。



Giemgo   (2003-04-13 16:23) [12]

WinApi中没有例外。

那么,那里都一样吗? 或者我又不是那么理解的东西?



[NIKEL]   (2003-04-13 16:44) [13]

- > WinApi中没有例外。


是的......然后有错误处理和异常函数,但是自己没有例外吗? 主啊,你完全不在意吗? :)

尝试/捕捉/最后没有人喊道......




Giemgo   (2003-04-13 17:09) [14]

[NIKEL],好吧,我也在谈论。 Just Anatoly Podgoretsky声称没有例外。 也许其他东西意味着什么?



[NIKEL]   (2003-04-13 17:16) [15]

Win32 API完全支持错误和异常处理。

阅读

AbnormalTermination
嘟嘟:)
GetExceptionCode
GetExceptionInformation
GetLastError函数
SetErrorMode
SetLastError
SetLastErrorEx




Giemgo   (2003-04-13 18:13) [16]

是的,但可能Anatoly Podgoretsky意味着当窗口中发生异常时,没有任何内容被传输,所有内容都是独立处理的。

但与此同时,图书馆并非如此。



Giemgo   (2003-04-13 22:13) [17]

Anatoly Podgoretsky,我理解正确吗?



Giemgo   (2003-04-14 18:56) [18]

同样,我想听到更多。 这句话是否正确:

WinApi中没有例外



Бурундук   (2003-04-14 20:01) [19]

Giemgo(14.04.03 18:56)
并调用RaiseException(123,0,0,nil)
并查看WinApi中是否有任何异常。



Giemgo   (2003-04-14 21:02) [20]

外部执行7B

什么?



Giemgo   (2003-04-15 15:54) [21]

那么,有人会澄清这种情况吗?

WinApi中没有例外

这是真的吗? 很奇怪每个人都沉默......没人知道? 我不相信



y-soft   (2003-04-15 16:59) [22]

Giemgo(15.04.03 15:54)
那么,有人会澄清这种情况吗?

WinApi中没有例外

这是真的吗? 很奇怪每个人都沉默......没人知道? 我不相信


Windows内置了对异常的支持(结构化异常处理,SEH),但为了使其工作,编译器必须生成特殊代码(异常块)。 在MSDN / Platform SDK / Debugging和错误处理机制中,如果您想了解更多详细信息,请阅读Richter关于完成处理程序的章节。

似乎你已经设定了完​​成主人的目标,而不是自己整理。

PS MSDN位于http://msdn.microsoft.com



Mikhail   (2003-04-15 17:03) [23]

主人已经消失在某处:)



REA   (2003-04-15 17:15) [24]

在我看来,有例外。 甚至在硬件层面的某个地方。 至少在垫子里。 协处理器。 否则,某些主板上的程序(现在有很多主板)不会挂起。 抛出异常不仅仅是类。 在VC ++中,这些例外是不同类型的该死的云(嗯,某处是3片段)。



Игорь Шевченко   (2003-04-15 18:54) [25]


> WinApi中没有例外


有。 阅读评委会的绅士里希特。

最糟糕的是win32.hlp

它可以用作用户模式代码。 内核模式和用户模式异常,包括硬件和软件生成。

某些指令序列的执行会导致由硬件引发的异常。 例如,没有必要这样做。
它可以在软件例程的过程中发生(例如,当指定了无效的参数值时)。 发生这种情况时,您可以通过调用RaiseException函数显式启动异常。 此功能启用信息流。




Giemgo   (2003-04-16 00:09) [26]

> Naberezhnye S.(13.04.03 09:36)

总的来说,一切都很清楚。 但是在哪里创建了TExc实例的破坏?



Giemgo   (2003-04-16 10:45) [27]

毕竟,你需要销毁TExc,否则会造成内存丢失



Anatoly Podgoretsky   (2003-04-16 10:54) [28]

Giemgo(16.04.03 00:09)
对象实例的破坏在其析构函数中。



Digitman   (2003-04-16 11:58) [29]


> Giemgo


见Anatoly Podgoretsky©(16.04.03 10:54)

在这种情况下,“析构函数”不是指您在Destroy方法体中看到的内容(这只是一种允许您在对象自己的字段上显式执行某些操作的方法),而是在编译器生成的代码中自动执行的隐式操作,身体完成后立即消灭。 在这个隐式代码中,为实例分配的内存确实被锁定。 实际上,为了在分配实例之前执行一些自己的操作,例如,在失败的Create方法中分配的内存块的分配以防止内存备忘录,提供了Destroy方法。
换句话说,为ex-p分配/分配内存,由编译器自动生成的隐式代码负责,并且为了分配/处理由您显式执行的内存,您在Create / Destroy方法体中的自定义代码负责



Giemgo   (2003-04-16 18:30) [30]

是的,我明白了!

提高TExc.Create(“TObj创建失败!”);

在这里,据我所知,创建了一个TExc实例。 虽然很奇怪,实例的链接在哪里?
它在哪里被摧毁? 调用TExc.Destroy在哪里?



vuk   (2003-04-16 19:18) [31]

隐式调用异常的析构函数。



Giemgo   (2003-04-16 23:07) [32]

1) 隐式调用异常的析构函数。

治疗后立即?

2)所以可以创建任何类? 类型

过程TForm1.Button1Click(Sender:TObject);
开始
提高TForm.Create(个体经营);
结束;

为什么我在1D0004A获得“模块project95.exe中的异常TForm”?

不知何故它与异常不太相似:)



Набережных С.   (2003-04-17 18:30) [33]

> Giemgo(16.04.03 23:07)

提高TExc.Create(“TObj创建失败!”);

raise是一个强制编译器在这个地方调用_RaiseExcept过程的指令,我们创建的TExc对象通过该过程作为参数传递。 该对象只是一个异常信息载体。 _RaiseExcept执行一些准备并引发系统RaiseException,这是“异常驱动程序”。 因为 在此之前,在_ClassCreate过程中创建了一个保护框架,其中一个元素是我们应用程序的异常处理程序的地址(如果没有框架,这将是默认处理程序),那么此处理程序将引发RaiseException。 编译器插入的这个处理程序将破坏创建的对象(TObj),即对TExcFrame中存储的球的引用,并将导致_RaiseAgain,进一步“推送”异常。 所以我们将进入我们描述的处理程序(Except-End块)。 同时,此处理程序将接收对TExceptionRecord结构的引用,其中除了其他外,还将引用TExc对象。 如果我们处理某种类型的异常(并且类型由我们传递的对象的类确定),那么将为此对象调用析构函数,异常处理将在那里结束,否则将再次调用_RaiseAgain。 在这种情况下,“On TExc do”记录对应于TExc类及其任何祖先,并且对应于没有“On”任何类。
这是作为第一近似的异常处理。 如果您更感兴趣并且更详细,那么请使用调试器,进入系统模块,然后 - “转发并使用歌曲”。 学会自己思考是必要的。 程序员应该思考,而不仅仅是在论坛上分散问题。



Giemgo   (2003-04-19 17:26) [34]

Naberezhny有,你仍然说上面研究只看源代码? 那么,我很羡慕你

他们说有人在调试器中学习了Assembler



vuk   (2003-04-19 17:39) [35]

到Giemgo:
你还能在哪里学到一些东西? 只在调试器中。 所以调试器在手 - 转发!



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

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

楼上









内存:0.71 MB
时间:0.038 c
14-783
Tytus
2003-04-15 17:55
2003.05.01
组件类型。


1-610
NA
2003-04-13 21:26
2003.05.01
更新组件属性时无效和刷新


7-803
yUrrius
2003-03-13 13:19
2003.05.01
CreateProcess的


1-501
瘟疫
2003-04-20 04:18
2003.05.01
如何用鼠标右键选择TreeView中的项目?


1-513
Wolverin
2003-04-20 22:22
2003.05.01
Работа с другим приложением





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