gpt4 book ai didi

c++ - 为什么 CoUninitialize 在退出时会导致错误?

转载 作者:可可西里 更新时间:2023-11-01 16:28:58 25 4
gpt4 key购买 nike

我正在开发一个 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 的代码,它的值(value)。

void _Release() throw()
{
if (m_pInterface != NULL) {
m_pInterface->Release();
}
}

我对 COM 编程不是很有经验,所以我可能缺少一些明显的东西。

  1. 为什么调用 CoUninitialize 会导致异常?

  2. 不调用 CoUninitialize 的后果是什么?

  3. 我在这里做错了什么吗?

最佳答案

您遇到的问题是范围之一。简短的回答是将 CoInit 和 CoUninit 从 Ptr 移动到外部范围。例如:

//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;
}

较长的答案是 Ptrs 析构函数(调用 Release)在从 main 退出时被调用。这是在 CoUnit 之后,它基本上关闭了您的应用程序和 COM 对象之间的通信 channel 。

不调用 CoUnit 的后果是什么?对于短暂的进程内 COM 服务器,确实没有任何负面影响。

关于c++ - 为什么 CoUninitialize 在退出时会导致错误?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2653797/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com