登录 用户中心() [退出] 后台管理 注册
   
您的位置: 首页 >> 程序员学前班[不再更新,只读] >> 主题: [com/delphi/windows]没有调用 CoInitialize() 使用 TWebBrowser 引起的异常     [回主站]     [分站链接]
标题
[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
2008-4-26 14:47:55 发表 编辑

奇怪的是在单元的初始化部分中写是没有用的,除非程序在退出时 sleep 10 秒。

initialization
{ Initialization section goes here }
CoInitialize(nil);

finalization
{ Finalization section goes here }
CoUninitialize();

--------------------------------------------------
而在项目文件中就可以
...
begin
CoInitialize(nil);//这样在使用 active 控件时安全点
Application.Initialize;
...
--------------------------------------------------
难道单元的初始化是在另一个线程中进行的?

clq
2008-4-26 15:08:15 发表 编辑

实际上真正的原因是

finalization
{ Finalization section goes here }
CoUninitialize();

发生得太早。


实际上 initialization
{ Initialization section goes here }
CoInitialize(nil);

finalization
{ Finalization section goes here }
CoUninitialize();

两个地方,不要初始化,也不要释放就不会出错了,也不用在 application 中调用,不过线程中还是要注意调用这两个函数。
--------------------------------------------------
实在不行就不要调用 CoUninitialize(); 释放好了,保证不会退出时再有 216 错误,哈哈。




总数:2 页次:1/1 首页 尾页  
总数:2 页次:1/1 首页 尾页  


所在合集/目录



发表评论:
文本/html模式切换 插入图片 文本/html模式切换


附件:



NEWBT官方QQ群1: 276678893
可求档连环画,漫画;询问文本处理大师等软件使用技巧;求档softhub软件下载及使用技巧.
但不可"开车",严禁国家敏感话题,不可求档涉及版权的文档软件.
验证问题说明申请入群原因即可.

Copyright © 2005-2020 clq, All Rights Reserved
版权所有
桂ICP备15002303号-1