我正在從C++應用程序讀取Excel文件中的一些數據。我有它的工作,但我對一部分感到困惑。這裏的代碼(簡化爲只讀第一個單元格)。爲什麼CoUninitialize在退出時會導致錯誤?
//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實際上並沒有什麼壞處,因爲無論如何你的進程正在關閉(類似於沒有釋放任何動態分配的內存,因爲當OS清理進程時它將被釋放) 。但稱這是一個很好的習慣,因爲當這個過程不會結束時,你可能會在不同的情況下做這件事。 – 2014-08-25 23:27:01