标题
[com/delphi/windows]没有调用 CoInitialize() 使用 TWebBrowser 引起的异常
clq
浏览(0) +
2008-04-26 14:43:01 发表
编辑
关键字:
[com/delphi/windows]没有调用 CoInitialize() 使用 TWebBrowser 引起的异常
用到象 TWebBrowser/ado 这样与 com 关系很密切的控件时是一定要有
CoInitialize(nil); //activex 单元中。
调用的,即使是在 vc 中调用了 delphi 的 dll 也是一样的,否则会有很多莫名其妙的错误(比如我在这个例子中碰到的是使用 TOpenDialog 后退出就会有异常,而不用就不会)。并且是每个用到的线程和主进程都要有这个调用。
delphi 和 vc 中都是一样的,而且还要注意这种控件一般都不是线程安全的,尽量不要在线程中使用。
错误的表现为:在程序退出时不停地弹出 error 216 错误。
clq
奇怪的是在单元的初始化部分中写是没有用的,除非程序在退出时 sleep 10 秒。
initialization
{ Initialization section goes here }
CoInitialize(nil);
finalization
{ Finalization section goes here }
CoUninitialize();
--------------------------------------------------
而在项目文件中就可以
...
begin
CoInitialize(nil);//这样在使用 active 控件时安全点
Application.Initialize;
...
--------------------------------------------------
难道单元的初始化是在另一个线程中进行的?
clq
实际上真正的原因是
finalization
{ Finalization section goes here }
CoUninitialize();
发生得太早。
实际上 initialization
{ Initialization section goes here }
CoInitialize(nil);
finalization
{ Finalization section goes here }
CoUninitialize();
两个地方,不要初始化,也不要释放就不会出错了,也不用在 application 中调用,不过线程中还是要注意调用这两个函数。
--------------------------------------------------
实在不行就不要调用 CoUninitialize(); 释放好了,保证不会退出时再有 216 错误,哈哈。
NEWBT官方QQ群1: 276678893
可求档连环画,漫画;询问文本处理大师等软件使用技巧;求档softhub软件下载及使用技巧.
但不可"开车",严禁国家敏感话题,不可求档涉及版权的文档软件.
验证问题说明申请入群原因即可.