首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ Builder >

CBuilder 何时调用CoUnintialize?该怎么处理

2012-03-01 
CBuilder 何时调用CoUnintialize?程序中用到了MSComm控件及多线程,又调用了三层架构的socketconnection做

CBuilder 何时调用CoUnintialize?
程序中用到了MSComm控件及多线程,又调用了三层架构的socketconnection做连接(单独使用它们中的任何一个没有问题)。
问题终于出现了:
编译没有问题,运行提示“尚未明确调用CoInitialize”。
跟踪到TMscomm构造时MSCommLib_OCX.cpp中
void __fastcall TMSComm::InitControlData()
{
  ControlData = &CControlData; //出错。

};
没办法,只有调用一下了,如下:
WINAPI WinMain(HINSTANCE, HINSTANCE, LPSTR, int)
{
  try
  {
  CoInitialize(NULL); //调用com初始化函数,但不知道有什么用?放在Form1构造函数里面太迟了
  Application->Initialize();
  Application->CreateForm(__classid(TForm1), &Form1);
  Application->CreateForm(__classid(TForm2), &Form2);
  Application->Run();
  }

按照配对关系,还得调用CoUninitialize();可在什么地方用呢?
在Delphi里面有个finally可以用,cb里面难道在Form destroy里面用吗?试过不行。
那么,在TForm1析构中用吗?重写了~TForm1();竟然提示
Virtual function 'TForm1::~TForm1()' conflicts with base class TForm?

两个问题:
1.到底何时调用CoInitialize,CoUninitialize?
2.如何覆写TForm1析构函数?

希望高手从深层次解释一下?  



[解决办法]
CoUninitialize();
放在
Application->Run();
的后面就可以了。
[解决办法]
是不是多线程,这俩函数好像只对调用的当前线程有效,各线程应该分别调用
[解决办法]
按理说在C++Builder里调用OCX控件时会自动调用CoInitialize的,CoUninitialize是在main结束后调用的。
楼主可以试试这样:

C/C++ code
WINAPI WinMain(HINSTANCE, HINSTANCE, LPSTR, int){//utilcls.h里,它会生成一个全局静态对象,构造时CoInitialize,析构时调用CoUninitialize//事实上这个东东在OCX使用前会自动调用的,不过多调用几次也没关系,类似于单件模式  TInitOle::Init();   try  {  Application->Initialize();  Application->CreateForm(__classid(TForm1), &Form1);  Application->CreateForm(__classid(TForm2), &Form2);  Application->Run();  }
[解决办法]
CoInitialize(NULL); //调用com初始化函数,但不知道有什么用?放在Form1构造函数里面太迟了
Application->Initialize();

一般情況下如果程序有使用COM, Application->Initialize();會調用CoInitialize。
依你說 ,你是使用了自定的COM,應該是自己封裝成了控件,並設有分共變量。此時應該在控件初始化時調用
CoInitialize , 控件撤出時 CoUnitialize ; 如果是DLL的話也是如此,在DLL中寫明,DLL加載時CoInitialize DLL撤出時 CoUnitialize ;這樣不易出錯,且能保障匹配。在程序中CoUnitialize的話,因異常不能良好處理的話,就不能匹配了。


[解决办法]
程序退出前 CoUnitialize
[解决办法]
来关注下

热点排行