저는 Excel 파일에서 일부 데이터를 읽으려면 C++ 응용 프로그램을 만들고 있습니다. 나는 그것을 작동 시키지만, 나는 한 부분에 대해서 혼란스러워한다. 여기에 코드가 있습니다 (첫 번째 셀만 읽도록 단순화되었습니다).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가 프로세스를 정리할 때 해제 될 것이기 때문에 동적으로 할당 된 메모리를 해제하지 않는 것과 비슷합니다) . 그러나 프로세스를 종료하려고하지 않을 때 다른 상황에서 처리하려고 할 때 들어갈 수있는 좋은 습관입니다. –