- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
我正在开发一个 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 编程不是很有经验,所以我可能缺少一些明显的东西。
为什么调用 CoUninitialize 会导致异常?
不调用 CoUninitialize 的后果是什么?
我在这里做错了什么吗?
最佳答案
您遇到的问题是范围之一。简短的回答是将 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/
Ansi-C 函数调用 CoUninitialize . 语法是: void CoUninitialize(void); 我看不到任何错误处理选项,如何检查 CoUninitialize 是否成功?
我有一个应用程序,其中创建了一个线程,该线程必须在超时间隔内检查数据库中是否有特定类型的数据。该线程完全负责创建数据库连接、查询和关闭连接。我在线程执行中只调用了一次 CoInitialize,并重用
我有一个 .NET 应用程序,它使用 COM Interop 使用 COM 组件,组件实例化自身,接口(interface)指针在 API cal 中返回到 .net 包装器,稍后在应用程序流程中进行
我正在开发一个 C++ 应用程序来从 Excel 文件中读取一些数据。我已经开始工作了,但我对其中一部分感到困惑。这是代码(简化为仅读取第一个单元格)。 //Mostly copied from ht
我调用 CoInitializeEx,特别是: CoInitializeEx(NULL, COINIT_DISABLE_OLE1DDE | COINIT_APARTMENTTHREADED); 在我的
我有个疑问。我初始化 COM,做 CoCreateInstance 并使用一些接口(interface)。我可以在不调用 Release 的情况下调用 CoUninitialize 吗?它会导致任何内
我正在实现一个包含 a shared ADO Connection 的 DLL通过使用 TADOConnection 的 ConnectionObject 属性并将其跨 DLL 边界传递到 TADOC
IShellDispatch COM 接口(interface)有一个非常奇怪的问题,更具体地说是 FolderItemVerbs 对象,这让我抓狂! 调用 FolderItemVerbs::Rele
下面的代码生成一个线程,该线程等待 5 秒,然后(递归地)遍历前台应用程序中的所有可访问项(小部件)。 如果(在 5 秒延迟期间)我切换到 Windows 10 Metro 应用程序(如 Calc 或
我有这样一个函数: bool op1(); bool op2(); bool foo() { CoInitialize(nullptr); if (!op1()) { CoUninit
我正在尝试创建一个在 python 3.4 中创建一个函数,该函数将对服务器执行 ping 操作。目前它只需要在 Windows 上工作(可能是 XP 及更高版本)。 我发现我可以使用 WMI Win
我已经在项目中构建并包含了 RtAudio 库,但是当我尝试构建项目本身时,出现错误: RtAudio.cpp:-1: error: undefined reference to `CoInitial
CoInitialize(NULL) 和 CoUninitialize() 是否由 ATL 自动调用? 或者我仍然必须在 COM 应用程序的开头和结尾分别调用 CoInitialize(NULL) 和
我是一名优秀的程序员,十分优秀!