您的位置:首页 > 其它

关于使用不带条件的大括号解析程序析构报错的问题

2015-10-22 18:23 260 查看
最近在项目需要添加COM组件的使用,程序入口处方法如下:

BOOL CTestApp::InitInstance()

{

    // InitCommonControlsEx() is required on Windows XP if an application

    // manifest specifies use of ComCtl32.dll version 6 or later to enable

    // visual styles.  Otherwise, any window creation will fail.

    INITCOMMONCONTROLSEX InitCtrls;

    InitCtrls.dwSize = sizeof(InitCtrls);

    // Set this to include all the common control classes you want to use

    // in your application.

    InitCtrls.dwICC = ICC_WIN95_CLASSES;

    InitCommonControlsEx(&InitCtrls);

    CWinApp::InitInstance();

    AfxEnableControlContainer();

    // Create the shell manager, in case the dialog contains

    // any shell tree view or shell list view controls.

    CShellManager *pShellManager = new CShellManager;

    // Standard initialization

    // If you are not using these features and wish to reduce the size

    // of your final executable, you should remove from the following

    // the specific initialization routines you do not need

    // Change the registry key under which our settings are stored

    // TODO: You should modify this string to be something appropriate

    // such as the name of your company or organization

    SetRegistryKey(_T("Local AppWizard-Generated Applications"));

      CoInitialize(NULL);

        CTestDlg dlg;

        m_pMainWnd = &dlg;

        INT_PTR nResponse = dlg.DoModal();

        if (nResponse == IDOK)

        {

            // TODO: Place code here to handle when the dialog is

            //  dismissed with OK

        }

        else if (nResponse == IDCANCEL)

        {

            // TODO: Place code here to handle when the dialog is

            //  dismissed with Cancel

        }

 

    CoUninitialize();

    // Delete the shell manager created above.

    if (pShellManager != NULL)

    {

        delete pShellManager;

    }

    // Since the dialog has been closed, return FALSE so that we exit the

    //  application, rather than start the application's message pump.

    return FALSE;

}

在CTestDlg中引用了com对象。程序一直执行正常,当时在窗体关闭时程序报错,后来发现原因:

程序先执行了CoUninitialize,然后释放com对象,导致释放com对象异常。

修改方法就是使用无条件的大括号,限制窗体的作用域:

BOOL CTestApp::InitInstance()

{

    // InitCommonControlsEx() is required on Windows XP if an application

    // manifest specifies use of ComCtl32.dll version 6 or later to enable

    // visual styles.  Otherwise, any window creation will fail.

    INITCOMMONCONTROLSEX InitCtrls;

    InitCtrls.dwSize = sizeof(InitCtrls);

    // Set this to include all the common control classes you want to use

    // in your application.

    InitCtrls.dwICC = ICC_WIN95_CLASSES;

    InitCommonControlsEx(&InitCtrls);

    CWinApp::InitInstance();

    AfxEnableControlContainer();

    // Create the shell manager, in case the dialog contains

    // any shell tree view or shell list view controls.

    CShellManager *pShellManager = new CShellManager;

    // Standard initialization

    // If you are not using these features and wish to reduce the size

    // of your final executable, you should remove from the following

    // the specific initialization routines you do not need

    // Change the registry key under which our settings are stored

    // TODO: You should modify this string to be something appropriate

    // such as the name of your company or organization

    SetRegistryKey(_T("Local AppWizard-Generated Applications"));

      CoInitialize(NULL);

       {

        CTestDlg dlg;

        m_pMainWnd = &dlg;

        INT_PTR nResponse = dlg.DoModal();

        if (nResponse == IDOK)

        {

            // TODO: Place code here to handle when the dialog is

            //  dismissed with OK

        }

        else if (nResponse == IDCANCEL)

        {

            // TODO: Place code here to handle when the dialog is

            //  dismissed with Cancel

        }

      }

    CoUninitialize();

    // Delete the shell manager created above.

    if (pShellManager != NULL)

    {

        delete pShellManager;

    }

    // Since the dialog has been closed, return FALSE so that we exit the

    //  application, rather than start the application's message pump.

    return FALSE;

}

添加之后一定是窗体中的com先释放,然后执行CoUninitialize,这样程序就不会报错了。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: