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结束后调用的。
楼主可以试试这样:
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
[解决办法]
来关注下