CoUninitialize 退出时 m_pInterface->Release()崩溃 解决

转载地址:CoUninitialize 退出时 m_pInterface->Release()崩溃 解决_Qyee16的博客-CSDN博客

调试在m_pInterface->Release时报错

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

#include "stdafx.h"  
#import "msxml3.dll"  
using namespace MSXML2;  
  
void myExit()  
{  
    ::CoUninitialize();  
}  
  
int main(void)  
{  
    ::CoInitialize(NULL);  
    MSXML2::IXMLDOMDocumentPtr     pDoc;            
    MSXML2::IXMLDOMElementPtr         xmlRoot     ;        
    HRESULT     hr     =     pDoc.CreateInstance(__uuidof(MSXML2::DOMDocument30));        
    if(!SUCCEEDED(hr))            
    {                                                            
        //MessageBox("无法创建DOMDocument对象,请检查是否安装了MS     XML     Parser     运行库!");            
    }            
  
    pDoc->raw_createElement((_bstr_t)(char*)"china",     &xmlRoot);        
    //MSXML2::IXMLDOMNodePtr     childnode     =     xmlnode;        
    pDoc->raw_appendChild(xmlRoot,     NULL);        
  
    MSXML2::IXMLDOMElementPtr         childNode     ;        
  
    pDoc->raw_createElement((_bstr_t)(char*)"City",     &childNode);        
    childNode->Puttext("WuHan");        
    childNode->setAttribute("population","8,000,000");        
    childNode->setAttribute("area","10000");        
    xmlRoot->appendChild(childNode);        
  
    pDoc->raw_createElement((_bstr_t)(char*)"City",     &childNode);        
    childNode->Puttext("ShangHai");        
    childNode->setAttribute("population","12,000,000");        
    childNode->setAttribute("area","12000");        
    xmlRoot->appendChild(childNode);        
  
    pDoc->save("f:\\he.xml");    
    pDoc=NULL;  
  
    //::CoUninitialize();  
    atexit(myExit);  
    return 0;  
}  

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
DISPID_WORKBOOKS_OPEN 是一个COM接口里的一个标识符,用于打开Excel工作簿。如果您想使用C语言来读取Excel表格内容,可以使用Microsoft Office的COM组件,以下是一个简单的示例代码: ```c #include <Windows.h> #include <ole2.h> #include <olectl.h> #include <stdio.h> int main() { HRESULT hr; CoInitialize(NULL); // 创建Excel应用程序对象 IDispatch* pExcelApp = NULL; hr = CoCreateInstance(CLSID_Application, NULL, CLSCTX_LOCAL_SERVER, IID_IDispatch, (void**)&pExcelApp); if (FAILED(hr)) { printf("创建Excel应用程序对象失败!\n"); CoUninitialize(); return -1; } // 设置Visible属性为true,使Excel窗口可见 DISPID dispid; OLECHAR* szProperty = L"Visible"; hr = pExcelApp->GetIDsOfNames(IID_NULL, &szProperty, 1, LOCALE_USER_DEFAULT, &dispid); if (FAILED(hr)) { printf("获取Visible属性的ID失败!\n"); pExcelApp->Release(); CoUninitialize(); return -1; } VARIANT var; VariantInit(&var); var.vt = VT_BOOL; var.boolVal = TRUE; DISPPARAMS dispParams = { &var, NULL, 1, 0 }; hr = pExcelApp->Invoke(dispid, IID_NULL, LOCALE_USER_DEFAULT, DISPATCH_PROPERTYPUT, &dispParams, NULL, NULL, NULL); if (FAILED(hr)) { printf("设置Visible属性为true失败!\n"); pExcelApp->Release(); CoUninitialize(); return -1; } // 打开工作簿文件 IDispatch* pWorkbooks = NULL; szProperty = L"Workbooks"; hr = pExcelApp->GetIDsOfNames(IID_NULL, &szProperty, 1, LOCALE_USER_DEFAULT, &dispid); if (FAILED(hr)) { printf("获取Workbooks属性的ID失败!\n"); pExcelApp->Release(); CoUninitialize(); return -1; } hr = pExcelApp->Invoke(dispid, IID_NULL, LOCALE_USER_DEFAULT, DISPATCH_PROPERTYGET, NULL, &var, NULL, NULL); if (FAILED(hr) || var.vt != VT_DISPATCH) { printf("获取Workbooks对象失败!\n"); pExcelApp->Release(); CoUninitialize(); return -1; } pWorkbooks = var.pdispVal; IDispatch* pWorkbook = NULL; szProperty = L"Open"; hr = pWorkbooks->GetIDsOfNames(IID_NULL, &szProperty, 1, LOCALE_USER_DEFAULT, &dispid); if (FAILED(hr)) { printf("获取Open方法的ID失败!\n"); pWorkbooks->Release(); pExcelApp->Release(); CoUninitialize(); return -1; } VARIANTARG args[2]; VariantInit(&args[1]); args[1].vt = VT_BSTR; args[1].bstrVal = SysAllocString(L"D:\\test.xlsx"); // Excel文件路径 VariantInit(&args[0]); args[0].vt = VT_BOOL; args[0].boolVal = FALSE; // 只读模式 dispParams.rgvarg = args; dispParams.cArgs = 2; hr = pWorkbooks->Invoke(dispid, IID_NULL, LOCALE_USER_DEFAULT, DISPATCH_METHOD, &dispParams, &var, NULL, NULL); if (FAILED(hr) || var.vt != VT_DISPATCH) { printf("打开Excel工作簿文件失败!\n"); SysFreeString(args[1].bstrVal); pWorkbooks->Release(); pExcelApp->Release(); CoUninitialize(); return -1; } pWorkbook = var.pdispVal; SysFreeString(args[1].bstrVal); // 读取表格内容 IDispatch* pSheets = NULL; szProperty = L"Sheets"; hr = pWorkbook->GetIDsOfNames(IID_NULL, &szProperty, 1, LOCALE_USER_DEFAULT, &dispid); if (FAILED(hr)) { printf("获取Sheets属性的ID失败!\n"); pWorkbook->Release(); pWorkbooks->Release(); pExcelApp->Release(); CoUninitialize(); return -1; } hr = pWorkbook->Invoke(dispid, IID_NULL, LOCALE_USER_DEFAULT, DISPATCH_PROPERTYGET, NULL, &var, NULL, NULL); if (FAILED(hr) || var.vt != VT_DISPATCH) { printf("获取Sheets对象失败!\n"); pWorkbook->Release(); pWorkbooks->Release(); pExcelApp->Release(); CoUninitialize(); return -1; } pSheets = var.pdispVal; IDispatch* pSheet = NULL; szProperty = L"Item"; hr = pSheets->GetIDsOfNames(IID_NULL, &szProperty, 1, LOCALE_USER_DEFAULT, &dispid); if (FAILED(hr)) { printf("获取Item属性的ID失败!\n"); pSheets->Release(); pWorkbook->Release(); pWorkbooks->Release(); pExcelApp->Release(); CoUninitialize(); return -1; } VariantInit(&args[0]); args[0].vt = VT_I4; args[0].intVal = 1; // 第一个工作表 dispParams.rgvarg = args; dispParams.cArgs = 1; hr = pSheets->Invoke(dispid, IID_NULL, LOCALE_USER_DEFAULT, DISPATCH_PROPERTYGET, &dispParams, &var, NULL, NULL); if (FAILED(hr) || var.vt != VT_DISPATCH) { printf("获取第一个工作表失败!\n"); pSheets->Release(); pWorkbook->Release(); pWorkbooks->Release(); pExcelApp->Release(); CoUninitialize(); return -1; } pSheet = var.pdispVal; IDispatch* pRange = NULL; szProperty = L"Range"; hr = pSheet->GetIDsOfNames(IID_NULL, &szProperty, 1, LOCALE_USER_DEFAULT, &dispid); if (FAILED(hr)) { printf("获取Range属性的ID失败!\n"); pSheet->Release(); pSheets->Release(); pWorkbook->Release(); pWorkbooks->Release(); pExcelApp->Release(); CoUninitialize(); return -1; } VariantInit(&args[0]); args[0].vt = VT_BSTR; args[0].bstrVal = SysAllocString(L"C1"); // 要读取的单元格 dispParams.rgvarg = args; dispParams.cArgs = 1; hr = pSheet->Invoke(dispid, IID_NULL, LOCALE_USER_DEFAULT, DISPATCH_PROPERTYGET, &dispParams, &var, NULL, NULL); if (FAILED(hr) || var.vt != VT_DISPATCH) { printf("获取要读取的单元格失败!\n"); SysFreeString(args[0].bstrVal); pSheet->Release(); pSheets->Release(); pWorkbook->Release(); pWorkbooks->Release(); pExcelApp->Release(); CoUninitialize(); return -1; } pRange = var.pdispVal; SysFreeString(args[0].bstrVal); szProperty = L"Value"; hr = pRange->GetIDsOfNames(IID_NULL, &szProperty, 1, LOCALE_USER_DEFAULT, &dispid); if (FAILED(hr)) { printf("获取Value属性的ID失败!\n"); pRange->Release(); pSheet->Release(); pSheets->Release(); pWorkbook->Release(); pWorkbooks->Release(); pExcelApp->Release(); CoUninitialize(); return -1; } hr = pRange->Invoke(dispid, IID_NULL, LOCALE_USER_DEFAULT, DISPATCH_PROPERTYGET, NULL, &var, NULL, NULL); if (FAILED(hr) || var.vt != VT_I4) { printf("读取单元格内容失败!\n"); pRange->Release(); pSheet->Release(); pSheets->Release(); pWorkbook->Release(); pWorkbooks->Release(); pExcelApp->Release(); CoUninitialize(); return -1; } printf("单元格内容为:%d\n", var.intVal); // 释放资源 pRange->Release(); pSheet->Release(); pSheets->Release(); pWorkbook->Release(); pWorkbooks->Release(); pExcelApp->Release(); CoUninitialize(); return 0; } ``` 这里仅展示了如何打开Excel工作簿并读取一个单元格的内容,您可以根据需要进行扩展和修改。同需要注意的是,上述代码使用了Microsoft Office的COM组件,因此需要安装Microsoft Office或者Visual Studio等开发工具。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值