OLEUnInitialize() in windows 7
OLEUnInitialize() in windows 7
我是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;
}
OleInitialize
和OleUninitialize
不适用于 COM 对象。 它们用于初始化和取消初始化给定线程上的 COM 库。 在使用完 COM 之前,不应调用OleUninitialize
,即不再有 COM 对象。
您需要在创建的 COM 对象上调用 Release() 才能释放它。
相关文章:
- std::async from std::async in windows xp
- 如何在 google test in windows 中管理断言
- 在Windows Visual Studio中实现<netinet/in.h>
- C++ - 程序接收信号SIGSEGV,分段错误.In msvcrt!memcpy () (C:\Windows\S
- 使用 new in C++(在 Windows 上)分配大于 2GB 的单个对象
- pthread_cond_timedwait() in Windows
- TLS with http_listener in Microsoft cpprestsdk on Windows
- Windows 10 环境中的"This version of XAudio2 is available only in Windows 8"错误
- QT c++ "Windows.h no such a file or dictionary in main.ccp"
- QB,如何在Windows上配置.h.in文件
- No FileIO in Windows Phone?
- 包含 Windows.h 和 wingdi.h 时出现"GradientFill was not declared in this scope"错误
- COM in the non-Windows world?
- OLEUnInitialize() in windows 7
- Sleep() in Windows 消息循环
- 未解析的包含:<stdio.h> in Eclipse helios(Windows 7 64bit)
- Performance Windows Socket in C++ with Matlab
- Cython in Windows 64 with GSL
- Handling Multiple windows in Symbian using Qt
- 如何可靠地检测 Mac OS X、iOS、Linux、Windows in C 预处理器