C++ 调用COM 接口函数出错
要实现的功能是调用Arcgis 控件的接口函数。
具体步骤如下:
1.在stdafx.h头文件导入控件:
//import esriGISClient.olb
#import "libid:746F6817-89BB-4490-9829-83CA25FD505A" raw_interfaces_only raw_native_types named_guids exclude("OLE_HANDLE", "OLE_COLOR" ),
在debug目录下已经生产 esriGISClient.tlh 接口文件。
esriGISClient.tlh 内有个IPropertySet类.
IPropertySet : IUnknown
{ // Raw methods provided by interface
virtual HRESULT __stdcall get_Count (
/*[out,retval]*/ long * Count ) = 0;
virtual HRESULT __stdcall GetProperty (
/*[in]*/ BSTR Name,
/*[out,retval]*/ VARIANT * Value ) = 0;
virtual HRESULT __stdcall GetProperties (
/*[in]*/ VARIANT names,
/*[out]*/ VARIANT * values ) = 0;
virtual HRESULT __stdcall GetAllProperties (
/*[out]*/ VARIANT * names,
/*[out]*/ VARIANT * values ) = 0;
virtual HRESULT __stdcall SetProperty (
/*[in]*/ BSTR Name,
/*[in]*/ VARIANT Value ) = 0;
virtual HRESULT __stdcall SetProperties (
/*[in]*/ VARIANT names,
/*[in]*/ VARIANT values ) = 0;
virtual HRESULT __stdcall IsEqual (
/*[in]*/ struct IPropertySet * PropertySet,
/*[out,retval]*/ VARIANT_BOOL * IsEqual ) = 0;
virtual HRESULT __stdcall RemoveProperty (
/*[in]*/ BSTR Name ) = 0;
};
现在就是要调用这个类的方法.
比如我要实现 get_Count,尝试了如下方法
第一种方法:
IPropertySet *mySetData= NULL;
mySetData->get_Count(0);//报错,如下:
//....exe 中的 0x00ad5e01 处未处理的异常: 0xC0000005: 读取位置 0x00000000 时发生访问冲突.
第二种方法:
IUnknown *pUnk=NULL;
IPropertySet *mySetData=NULL;
CoCreateInstance(CLSID_PropertySet,(LPUNKNOWN)CLSCTX_INPROC_SERVER,NULL,IID_IUnknown,(void **)&pUnk);
pUnk->QueryInterface(IID_IPropertySet,(void**)&mySetData);
//报错,内容同上:
//....exe 中的 0x001f7c50处未处理的异常: 0xC0000005: 读取位置 0x00000000 时发生访问冲突.
pUnk->Release();
mySetData->get_Count(0);
mySetData->Release();
CoUninitialize();
初学COM,多谢大家赐教!
具体步骤如下:
1.在stdafx.h头文件导入控件:
//import esriGISClient.olb
#import "libid:746F6817-89BB-4490-9829-83CA25FD505A" raw_interfaces_only raw_native_types named_guids exclude("OLE_HANDLE", "OLE_COLOR" ),
在debug目录下已经生产 esriGISClient.tlh 接口文件。
esriGISClient.tlh 内有个IPropertySet类.
IPropertySet : IUnknown
{ // Raw methods provided by interface
virtual HRESULT __stdcall get_Count (
/*[out,retval]*/ long * Count ) = 0;
virtual HRESULT __stdcall GetProperty (
/*[in]*/ BSTR Name,
/*[out,retval]*/ VARIANT * Value ) = 0;
virtual HRESULT __stdcall GetProperties (
/*[in]*/ VARIANT names,
/*[out]*/ VARIANT * values ) = 0;
virtual HRESULT __stdcall GetAllProperties (
/*[out]*/ VARIANT * names,
/*[out]*/ VARIANT * values ) = 0;
virtual HRESULT __stdcall SetProperty (
/*[in]*/ BSTR Name,
/*[in]*/ VARIANT Value ) = 0;
virtual HRESULT __stdcall SetProperties (
/*[in]*/ VARIANT names,
/*[in]*/ VARIANT values ) = 0;
virtual HRESULT __stdcall IsEqual (
/*[in]*/ struct IPropertySet * PropertySet,
/*[out,retval]*/ VARIANT_BOOL * IsEqual ) = 0;
virtual HRESULT __stdcall RemoveProperty (
/*[in]*/ BSTR Name ) = 0;
};
现在就是要调用这个类的方法.
比如我要实现 get_Count,尝试了如下方法
第一种方法:
IPropertySet *mySetData= NULL;
mySetData->get_Count(0);//报错,如下:
//....exe 中的 0x00ad5e01 处未处理的异常: 0xC0000005: 读取位置 0x00000000 时发生访问冲突.
第二种方法:
IUnknown *pUnk=NULL;
IPropertySet *mySetData=NULL;
CoCreateInstance(CLSID_PropertySet,(LPUNKNOWN)CLSCTX_INPROC_SERVER,NULL,IID_IUnknown,(void **)&pUnk);
pUnk->QueryInterface(IID_IPropertySet,(void**)&mySetData);
//报错,内容同上:
//....exe 中的 0x001f7c50处未处理的异常: 0xC0000005: 读取位置 0x00000000 时发生访问冲突.
pUnk->Release();
mySetData->get_Count(0);
mySetData->Release();
CoUninitialize();
初学COM,多谢大家赐教!
...全文
相关推荐
c#调用c++库函数参数类型转换.docx
c#调用c++库函数参数类型转换.docx
C 与 C++ 接口函数相互调用的实现
一、C 或 C++ 编译的四个步骤 (一) 预处理 在该步骤中,编译器将源程序中以“#”开头的语句进行处理。其中,#include 的原理是将目标文件内容导入本文件。 (二) 编译 在该步骤中,编译器将第一步生成的各个文件分别转换成汇编语言文件。在该过程中,所有函数的名称都会被转换成一个符号作为汇编文件中的唯一标识,对 C 语言函数一般直接用函数名称作为其唯一标识的符号,而对于 C++ 函数在多数情况下需要在函数名称加上各种前缀或后缀才能作为其标识,比如函数 void Print(int num),如果编译器将其视为 C 语言编译,则该函数在汇编文件中的符号为 Print,若视为 C++
C++ 导出dll接口函数 C++ 导出dll接口函数 C++ 导出dll接口函数
C++ 导出dll接口函数 C++ 导出dll接口函数 C++ 导出dll接口函数
c++如何采用com组件的方法直接调用动态库
com组件方法调用dll
c++开发activex控件和js传参,js调用ocx控件接口函数的代码(
vs2010开发activex(MFC)控件/ie插件(一),测试ocx控件加载 vs2010开发activex(MFC)控件/ie插件(二),js传参数 vs2010开发activex(MFC)控件/ie插件(三),js调用ocx控件的接口函数


