【发布时间】:2011-02-08 20:59:33
【问题描述】:
我正在开发一个 C++ 应用程序以从 Excel 文件中读取一些数据。我已经让它工作了,但我对一个部分感到困惑。这是代码(简化为仅读取第一个单元格)。
//Mostly copied from http://www.codeproject.com/KB/wtl/WTLExcel.aspx
#import "c:\Program Files\Common Files\Microsoft Shared\OFFICE11\MSO.DLL"
#import "c:\Program Files\Common Files\Microsoft Shared\VBA\VBA6\VBE6EXT.OLB"
#import "C:\Program Files\Microsoft Office\Office11\excel.exe" rename ("DialogBox","ExcelDialogBox") rename("RGB","ExcelRGB") rename("CopyFile", "ExcelCopyFile") rename("ReplaceText", "ExcelReplaceText") exclude("IFont", "IPicture")
_variant_t varOption((long) DISP_E_PARAMNOTFOUND, VT_ERROR);
int _tmain(int argc, _TCHAR* argv[])
{
DWORD dwCoInit = 0;
CoInitializeEx(NULL, dwCoInit);
Excel::_ApplicationPtr pExcel;
pExcel.CreateInstance(_T("Excel.Application"));
Excel::_WorkbookPtr pBook;
pBook = pExcel->Workbooks->Open("c:\\test.xls", varOption, varOption, varOption, varOption, varOption, varOption, varOption, varOption, varOption, varOption, varOption, varOption);
Excel::_WorksheetPtr pSheet = pBook->Sheets->Item[1];
Excel::RangePtr pRange = pSheet->GetRange(_bstr_t(_T("A1")));
_variant_t vItem = pRange->Value2;
printf(_bstr_t(vItem.bstrVal));
pBook->Close(VARIANT_FALSE);
pExcel->Quit();
//CoUninitialize();
return 0;
}
我必须注释掉对 CoUninitialize 的调用,程序才能运行。当取消注释 CoUninitialize 时,我在程序退出时的 comip.h 中的 _Release 函数中遇到访问冲突。
这是来自 comip.h 的代码,值得一看。
void _Release() throw()
{
if (m_pInterface != NULL) {
m_pInterface->Release();
}
}
我对 COM 编程不是很有经验,所以我可能缺少一些明显的东西。
为什么调用 CoUninitialize 会导致异常?
不调用 CoUninitialize 会有什么后果?
我在这里做错了吗?
【问题讨论】:
-
AFAIK 在这种情况下不调用 CoUninitialize 实际上没有什么害处,因为您的进程无论如何都会关闭(类似于不释放任何动态分配的内存是可以的,因为它会在操作系统时被释放清理过程)。但是调用它是一个好习惯,因为当你可能在不同的情况下这样做时,过程还没有结束。
标签: c++ excel com access-violation