私はExcelファイルからいくつかのデータを読み取るためにC++アプリケーションに取り組んでいます。私はそれを機能させましたが、私は一部について混乱しています。これがコードです(最初のセルのみを読み取るように簡略化されています)。
//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を呼び出さなかった場合の結果は何ですか?
私はここで完全に間違ったことをしていますか?