मैं 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 को कॉल करने में कोई हानि नहीं है क्योंकि आपकी प्रक्रिया वैसे भी बंद हो रही है (इसी तरह गतिशील रूप से आवंटित स्मृति को मुक्त नहीं करना ठीक है क्योंकि ओएस प्रक्रिया को साफ करते समय इसे मुक्त कर दिया जाएगा) । लेकिन इसे कॉल करना एक अच्छी आदत है, क्योंकि जब आप इसे समाप्त करने वाले नहीं होते हैं, तो जब आप इसे एक अलग स्थिति में कर सकते हैं। –