OLEUnInitialize() in windows 7

OLEUnInitialize() in windows 7

本文关键字:windows in OLEUnInitialize      更新时间:2023-10-16

我是MFC的新人。我正在使用 OLEINitialize() 初始化一个 COM 对象,使用 COCreateInstance() 创建对象的实例(EXCEL.EXE),使用 OLEUnInitialize() 来取消初始化 com 对象。但是在Windows XP中,在调用OLEUnInitialize()之后,EXCEL.EXE结束。但在 Windows 7 中并非如此。如果你们有任何想法,请帮助我。提前谢谢。

下面是构造函数:

CXLAutomation::CXLAutomation(BOOL bVisible)
{
    m_pdispExcelApp = NULL;
    m_pdispWorkbook = NULL;
    m_pdispWorksheet = NULL;
    m_pdispActiveChart = NULL;
    InitOLE();       
    StartExcel();
    SetExcelVisible(bVisible);
    CreateWorkSheet();
}

破坏者:

CXLAutomation::~CXLAutomation()
{
    ReleaseDispatch();
    OleUninitialize();
}

功能:

BOOL CXLAutomation::InitOLE()
{
    DWORD dwOleVer;
    dwOleVer = CoBuildVersion();
    // check the OLE library version
    if (rmm != HIWORD(dwOleVer)) 
    {
        MessageBox(NULL, L"Incorrect version of OLE libraries.", L"Failed", MB_OK | MB_ICONSTOP);
        return FALSE;
    }
    // could also check for minor version, but this application is
    // not sensitive to the minor version of OLE
    // initialize OLE, fail application if we can't get OLE to init.
    if (FAILED(OleInitialize(NULL))) 
    {
        MessageBox(NULL, L"Cannot initialize OLE.", L"Failed", MB_OK | MB_ICONSTOP);
        return FALSE;
    }

    return TRUE;
}
BOOL CXLAutomation::StartExcel()
{
    CLSID clsExcelApp;
    // if Excel is already running, return with current instance
    if (m_pdispExcelApp != NULL)
        return TRUE;
    /* Obtain the CLSID that identifies EXCEL.APPLICATION
     * This value is universally unique to Excel versions 5 and up, and
     * is used by OLE to identify which server to start.  We are obtaining
     * the CLSID from the ProgID.
     */
    if (FAILED(CLSIDFromProgID(L"Excel.Application", &clsExcelApp))) 
    {
        MessageBox(NULL, L"Cannot obtain CLSID from ProgID", L"Failed", MB_OK | MB_ICONSTOP);
        return FALSE;
    }
    // start a new copy of Excel, grab the IDispatch interface
    if (FAILED(CoCreateInstance(clsExcelApp, NULL, CLSCTX_LOCAL_SERVER, IID_IDispatch, (void**)&m_pdispExcelApp))) 
    {
        MessageBox(NULL, L"Cannot start an instance of Excel for Automation.", L"Failed", MB_OK | MB_ICONSTOP);
        return FALSE;
    }
    return TRUE;
}

OleInitializeOleUninitialize不适用于 COM 对象。 它们用于初始化和取消初始化给定线程上的 COM 库。 在使用完 COM 之前,不应调用OleUninitialize,即不再有 COM 对象。

您需要在创建的 COM 对象上调用 Release() 才能释放它。