在项目中使用duilib,在测试系统兼容性的时候,点击关闭按钮调用CoUninitialize在WIN10下出现异常
①:框架程序基本流程
-> WinMain(入口函数)
-> CPaintManagerUI::SetResourceInstance (实例句柄与渲染类关联)
-> ::CoInitialize (初始化COM库, 为加载COM库提供支持)
-> new C360SafeFrameWnd (创建窗口类)
-> pFrame->Create (注册窗口类与创建窗口)
->RegisterSuperclass (注册一个超类 即已有一个窗口类的基上再注册一个窗口类)
->RegisterWindowClass(注册窗口类)
-> ::CreateWindowEx (创建窗口,此时触发 WM_CREATE消息)
-> HandleMessage ( WM_CREATE消息处理OnCreate)
-> pFrame->CenterWindow (窗口居中显示)
-> CPaintManagerUI::MessageLoop (处理消息循环)
-> ::CoUninitialize(); (退出程序并释放COM库)
如360的例子
int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE /*hPrevInstance*/, LPSTR /*lpCmdLine*/, int nCmdShow)
{
CPaintManagerUI::SetInstance(hInstance);
CPaintManagerUI::SetResourcePath(CPaintManagerUI::GetInstancePath() + _T("skin"));
CPaintManagerUI::SetResourceZip(_T("360SafeRes.zip"));
HRESULT Hr = ::CoInitialize(NULL);
if( FAILED(Hr) ) return 0;
C360SafeFrameWnd* pFrame = new C360SafeFrameWnd();
if( pFrame == NULL ) return 0;
pFrame->Create(NULL, _T("360安全卫士"), UI_WNDSTYLE_FRAME, 0L, 0, 0, 800, 572);
pFrame->CenterWindow();
::ShowWindow(*pFrame, SW_SHOW);
CPaintManagerUI::MessageLoop();
::CoUninitialize();
return 0;
}
{
if( msg.sType == _T("windowinit") )
OnPrepare();
else if( msg.sType == _T("click") )
{
if( msg.pSender == m_pCloseBtn )
{
//::CoUninitialize();
PostQuitMessage(0);
return;
}
注意:
1、 在win10下退出会崩溃,因为中途释放科COM
2、-> ::CoInitialize 和CoUninitialize()要同级并成对使用