我总结的几种简单的调用Com组件的方法
2017-07-25 15:55
585 查看
1.假如我们创建的Com组件的工程名叫TestCom,在其中添加了一个接口叫MyCom,接口名会自动命名为IMyCom,在其中添加两个方法,分别为:
C++代码
HRESULT Add([in] long n1,[in] long n2,[out,retval]long * pVal);
HRESULT Cat([in] BSTR s1,[in] BSTR s2,[out,retval] BSTR * pVal);
编绎成功后,会生成TestCom.dll
注意此时我们生成的Com组件层次即为:TestCom.IMycom.方法;
2.下面总结出调用该Com的几种方法:
Cpp代码
#include "stdafx.h"
#include <atlbase.h>
#import "G:\\workspace\\VC_WorkSpace\\TestCom\\Debug\\TestCom.dll" no_namespace
/*
注意:在导入了com的dll后,会在工程的exe目录下生成两个文件:TestCom.tlh与TestCom.tli,一个为定义文件,一个为实现文件,打开TestCom.tlh定义文件,会发现有类似这样几句:
_COM_SMARTPTR_TYPEDEF(IMyCom, __uuidof(IMyCom)); //该宏定义了指向接口IMyCom的指针IMyComPtr,以后的程序中可以直接用IMyComPtr这个指针类型。
struct __declspec(uuid("92e83a37-399a-47b1-bf6c-0ab052650cfe"))
MyCom; //该句定义了CLSID为"{92e83a37-399a-47b1-bf6c-0ab052650cfe}",通过它我们可以通过CLSIDFromString获取clsid;
struct __declspec(uuid("103b4c6e-3d3e-4e38-ab50-b9348465fc13"))
IMyCom : IDispatch //该句定义了接口ID:IID为"{103b4c6e-3d3e-4e38-ab50-b9348465fc13}",通过它我们可以通过IIDFromString获取接口iid;
CoCreateInstance函数就用到了上面两个做为参数来创建Com对象.
*/
第一种方法:
Cpp代码
int impl0()
{
CoInitialize(NULL);
CLSID clsid;
IID iid;
HRESULT hr = CLSIDFromString(OLESTR("{92e83a37-399a-47b1-bf6c-0ab052650cfe}"),&clsid);
if(NOERROR != hr){
MessageBox(NULL,"ErrCLSIDFromString","ErrCLSIDFromString",MB_OK);
return -1;
}
HRESULT hriid = IIDFromString(OLESTR("{103b4c6e-3d3e-4e38-ab50-b9348465fc13}"),&iid);
if(S_OK != hriid){
MessageBox(NULL,"ErrIIDFromString","ErrIIDFromString",MB_OK);
return -1;
}
{
CComPtr<imycom> pMyCom;
pMyCom.CoCreateInstance(clsid);
long ret;
ret = pMyCom->Add(1,2);
}
CoUninitialize();
return 0;
}
第二种方法:
Cpp代码
int impl1()
{
CoInitialize(NULL);
CLSID clsid;
CLSIDFromProgID(OLESTR("TestCom.MyCom"),&clsid); //"TestCom.MyCom"即为Dll名+Com对象名
{
CComPtr<imycom> pMyCom;
pMyCom.CoCreateInstance(clsid);
long ret;
ret = pMyCom->Add(1,2);
}
CoUninitialize();
return 0;
}
第三种方法:
Cpp代码
int impl2()
{
CoInitialize(NULL);
IMyComPtr Pt ;
if (!SUCCEEDED(Pt.CreateInstance(__uuidof(MyCom))))
{
DWORD err;
err = GetLastError();
char Msg[128]={0};
sprintf(Msg,"%d",err);
MessageBox(NULL,Msg,"Err",MB_OK);
return -1;
}
long ret = Pt->Add(1,2);
CoUninitialize();
return 0;
}
第四种方法:
Cpp代码
int impl3()
{
CoInitialize(NULL);
IMyComPtr Pt(__uuidof(MyCom)) ;
long ret = Pt->Add(1,2);
CoUninitialize();
return 0;
}
第五种方法:
Cpp代码
int impl4()
{
CoInitialize(NULL);
IMyCom * pMyCom=NULL;
CLSID clsid;
IID iid;
HRESULT hr = CLSIDFromString(OLESTR("{92e83a37-399a-47b1-bf6c-0ab052650cfe}"),&clsid);
if(NOERROR != hr){
MessageBox (NULL,"ErrCLSIDFromString","ErrCLSIDFromString",MB_OK);
return -1;
}
HRESULT hriid = IIDFromString(OLESTR("{103b4c6e-3d3e-4e38-ab50-b9348465fc13}"),&iid);
if(S_OK != hriid){
MessageBox(NULL,"ErrIIDFromString","ErrIIDFromString",MB_OK);
return -1;
}
if (!SUCCEEDED(::CoCreateInstance(clsid,NULL,CLSCTX_INPROC_SERVER,iid,(void**)&pMyCom)))
{
DWORD err;
err = GetLastError();
char Msg[128]={0};
sprintf(Msg,"%d",err);
MessageBox(NULL,Msg,"Err",MB_OK);
return -1;
}
long ret;
ret = pMyCom->Add(1,2);
CoUninitialize();
return 0;
}
int main(int argc, char* argv[])
{
return impl0();
}
1.假如我们创建的Com组件的工程名叫TestCom,在其中添加了一个接口叫MyCom,接口名会自动命名为IMyCom,在其中添加两个方法,分别为:
C++代码
HRESULT Add([in] long n1,[in] long n2,[out,retval]long * pVal);
HRESULT Cat([in] BSTR s1,[in] BSTR s2,[out,retval] BSTR * pVal);
HRESULT Add([in] long n1,[in] long n2,[out,retval]long * pVal); HRESULT Cat([in] BSTR s1,[in] BSTR s2,[out,retval] BSTR * pVal);
编绎成功后,会生成TestCom.dll
注意此时我们生成的Com组件层次即为:TestCom.IMycom.方法;
2.下面总结出调用该Com的几种方法:
Cpp代码
#include "stdafx.h"
#include <atlbase.h>
#import "G:\\workspace\\VC_WorkSpace\\TestCom\\Debug\\TestCom.dll" no_namespace
#include "stdafx.h" #include <atlbase.h> #import "G:\\workspace\\VC_WorkSpace\\TestCom\\Debug\\TestCom.dll" no_namespace
/*
注意:在导入了com的dll后,会在工程的exe目录下生成两个文件:TestCom.tlh与TestCom.tli,一个为定义文件,一个为实现文件,打开TestCom.tlh定义文件,会发现有类似这样几句:
_COM_SMARTPTR_TYPEDEF(IMyCom, __uuidof(IMyCom)); //该宏定义了指向接口IMyCom的指针IMyComPtr,以后的程序中可以直接用IMyComPtr这个指针类型。
struct __declspec(uuid("92e83a37-399a-47b1-bf6c-0ab052650cfe"))
MyCom; //该句定义了CLSID为"{92e83a37-399a-47b1-bf6c-0ab052650cfe}",通过它我们可以通过CLSIDFromString获取clsid;
struct __declspec(uuid("103b4c6e-3d3e-4e38-ab50-b9348465fc13"))
IMyCom : IDispatch //该句定义了接口ID:IID为"{103b4c6e-3d3e-4e38-ab50-b9348465fc13}",通过它我们可以通过IIDFromString获取接口iid;
CoCreateInstance函数就用到了上面两个做为参数来创建Com对象.
*/
第一种方法:
Cpp代码
int impl0()
{
CoInitialize(NULL);
CLSID clsid;
IID iid;
HRESULT hr = CLSIDFromString(OLESTR("{92e83a37-399a-47b1-bf6c-0ab052650cfe}"),&clsid);
if(NOERROR != hr){
MessageBox(NULL,"ErrCLSIDFromString","ErrCLSIDFromString",MB_OK);
return -1;
}
HRESULT hriid = IIDFromString(OLESTR("{103b4c6e-3d3e-4e38-ab50-b9348465fc13}"),&iid);
if(S_OK != hriid){
MessageBox(NULL,"ErrIIDFromString","ErrIIDFromString",MB_OK);
return -1;
}
{
CComPtr<imycom> pMyCom;
pMyCom.CoCreateInstance(clsid);
long ret;
ret = pMyCom->Add(1,2);
}
CoUninitialize();
return 0;
}
int impl0() { CoInitialize(NULL); CLSID clsid; IID iid; HRESULT hr = CLSIDFromString(OLESTR("{92e83a37-399a-47b1-bf6c-0ab052650cfe}"),&clsid); if(NOERROR != hr){ MessageBox(NULL,"ErrCLSIDFromString","ErrCLSIDFromString",MB_OK); return -1; } HRESULT hriid = IIDFromString(OLESTR("{103b4c6e-3d3e-4e38-ab50-b9348465fc13}"),&iid); if(S_OK != hriid){ MessageBox(NULL,"ErrIIDFromString","ErrIIDFromString",MB_OK); return -1; } { CComPtr<imycom> pMyCom; pMyCom.CoCreateInstance(clsid); long ret; ret = pMyCom->Add(1,2); } CoUninitialize(); return 0; }
第二种方法:
Cpp代码
int impl1()
{
CoInitialize(NULL);
CLSID clsid;
CLSIDFromProgID(OLESTR("TestCom.MyCom"),&clsid); //"TestCom.MyCom"即为Dll名+Com对象名
{
CComPtr<imycom> pMyCom;
pMyCom.CoCreateInstance(clsid);
long ret;
ret = pMyCom->Add(1,2);
}
CoUninitialize();
return 0;
}
int impl1() { CoInitialize(NULL); CLSID clsid; CLSIDFromProgID(OLESTR("TestCom.MyCom"),&clsid); //"TestCom.MyCom"即为Dll名+Com对象名 { CComPtr<imycom> pMyCom; pMyCom.CoCreateInstance(clsid); long ret; ret = pMyCom->Add(1,2); } CoUninitialize(); return 0; }
第三种方法:
Cpp代码
int impl2()
{
CoInitialize(NULL);
IMyComPtr Pt ;
if (!SUCCEEDED(Pt.CreateInstance(__uuidof(MyCom))))
{
DWORD err;
err = GetLastError();
char Msg[128]={0};
sprintf(Msg,"%d",err);
MessageBox(NULL,Msg,"Err",MB_OK);
return -1;
}
long ret = Pt->Add(1,2);
CoUninitialize();
return 0;
}
int impl2() { CoInitialize(NULL); IMyComPtr Pt ; if (!SUCCEEDED(Pt.CreateInstance(__uuidof(MyCom)))) { DWORD err; err = GetLastError(); char Msg[128]={0}; sprintf(Msg,"%d",err); MessageBox(NULL,Msg,"Err",MB_OK); return -1; } long ret = Pt->Add(1,2); CoUninitialize(); return 0; }
第四种方法:
Cpp代码
int impl3()
{
CoInitialize(NULL);
IMyComPtr Pt(__uuidof(MyCom)) ;
long ret = Pt->Add(1,2);
CoUninitialize();
return 0;
}
int impl3() { CoInitialize(NULL); IMyComPtr Pt(__uuidof(MyCom)) ; long ret = Pt->Add(1,2); CoUninitialize(); return 0; }
第五种方法:
Cpp代码
int impl4()
{
CoInitialize(NULL);
IMyCom * pMyCom=NULL;
CLSID clsid;
IID iid;
HRESULT hr = CLSIDFromString(OLESTR("{92e83a37-399a-47b1-bf6c-0ab052650cfe}"),&clsid);
if(NOERROR != hr){
MessageBox (NULL,"ErrCLSIDFromString","ErrCLSIDFromString",MB_OK);
return -1;
}
HRESULT hriid = IIDFromString(OLESTR("{103b4c6e-3d3e-4e38-ab50-b9348465fc13}"),&iid);
if(S_OK != hriid){
MessageBox(NULL,"ErrIIDFromString","ErrIIDFromString",MB_OK);
return -1;
}
if (!SUCCEEDED(::CoCreateInstance(clsid,NULL,CLSCTX_INPROC_SERVER,iid,(void**)&pMyCom)))
{
DWORD err;
err = GetLastError();
char Msg[128]={0};
sprintf(Msg,"%d",err);
MessageBox(NULL,Msg,"Err",MB_OK);
return -1;
}
long ret;
ret = pMyCom->Add(1,2);
CoUninitialize();
return 0;
}
int impl4() { CoInitialize(NULL); IMyCom * pMyCom=NULL; CLSID clsid; IID iid; HRESULT hr = CLSIDFromString(OLESTR("{92e83a37-399a-47b1-bf6c-0ab052650cfe}"),&clsid); if(NOERROR != hr){ MessageBox (NULL,"ErrCLSIDFromString","ErrCLSIDFromString",MB_OK); return -1; } HRESULT hriid = IIDFromString(OLESTR("{103b4c6e-3d3e-4e38-ab50-b9348465fc13}"),&iid); if(S_OK != hriid){ MessageBox(NULL,"ErrIIDFromString","ErrIIDFromString",MB_OK); return -1; } if (!SUCCEEDED(::CoCreateInstance(clsid,NULL,CLSCTX_INPROC_SERVER,iid,(void**)&pMyCom))) { DWORD err; err = GetLastError(); char Msg[128]={0}; sprintf(Msg,"%d",err); MessageBox(NULL,Msg,"Err",MB_OK); return -1; } long ret; ret = pMyCom->Add(1,2); CoUninitialize(); return 0; }
int main(int argc, char* argv[])
{
return impl0();
}
相关文章推荐
- iOS里常见的几种信息编码、加密方法简单总结
- iOS ViewController跳转界面的几种方法简单总结
- iOS ViewController跳转界面的几种方法简单总结
- iOS ViewController跳转界面的几种方法简单总结
- iOS里常见的几种信息编码、加密方法简单总结
- 简单总结Python中几种字符串连接的方法
- PHP获取xml中值的几种方法简单总结
- asp.net的几种简单连接数据库方法
- 总结几种简单实用的数据恢复技巧
- IOS几种简单有效的数组排序方法
- ASP.NET页面间的传值的几种方法(总结)
- 黑马程序员——File类方法的简单总结
- maya开洞的几种方法总结之一
- ASP.NET页面跳转的几种方法简单介绍
- find、grep、wc使用方法简单总结
- 清楚浮动的几种方法总结
- PHP删除字符串最后一个字符的几种方法总结
- C#操作Excel(创建、打开、读写、保存)几种方法的总结
- Android编程实现异步消息处理机制的几种方法总结
- 总结一下query中ajax的几种方法