C++ Com控件调用
1.假如我们创建的Com组件的工程名叫TestCom,在其中添加了一个接口叫MyCom,接口名会自动命名为IMyCom,在其中添加两个方法,分别为:
- 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的几种方法:
- #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对象.
*/
第一种方法:
- 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 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 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 impl3()
- {
- CoInitialize(NULL);
- IMyComPtr Pt(__uuidof(MyCom)) ;
- long ret = Pt->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();
}
C++ Com控件调用的更多相关文章
- 用delphi的THTTPRIO控件调用了c#写的webservice。
用delphi的THTTPRIO控件调用了c#写的webservice. 下面是我调试时遇到的一些问题: 1,导入wsdl文件:file--new----other----wenservice---W ...
- 关于Winform控件调用插入点(光标)的用法
我们自定义控件中可能会有一些光标的使用,比如插入文字和图片提示,下面是调用WIN32 API的光标用法 Winform控件调用插入点的用法 // 导入处理光标的 Windows 32 位 API // ...
- 问题-PopupMenu是哪个控件调用弹出的?
相关资料: http://bbs.csdn.net/topics/310195683 问题现象:今天有朋友问我个简单的问题,在多个Edit上弹出菜单,怎么判断是哪个Edit调用的.我想了想这个我还真不 ...
- 开发ActiveX控件调用另一个ActiveX系列3——ActiveX调用另一个ActiveX
终于进入正题了,怎样在ActiveX中调用另一个ActiveX.我们的项目需要调用华视电子身份证识别仪的ActiveX控件 在这里有很多识别仪ActiveX插件下载:http://www.idukaq ...
- 开发ActiveX控件调用另一个ActiveX系列2——调试ActiveX
关于调试ActiveX控件,有若干方法,例如可以建一个MFC工程调用调试,我则倾向于使用附加到浏览器进程,因为浏览器才是真正运行的环境. 打开加载ActiveX的目标页面,当然希望我们的调试内容不是自 ...
- 开发ActiveX控件调用另一个ActiveX系列0——身份证识别仪驱动的问题
程序员要从0下表开始,这篇是介绍这个系列的背景的,没有兴趣的人可以直接跳过. 为什么要开发ActiveX控件 由于工作需要,我们开发了一个网站,使用了一款身份证识别仪的网页ActiveX(OCX)插件 ...
- .NET混合开发解决方案10 WebView2控件调用网页JS方法
系列目录 [已更新最新开发文章,点击查看详细] WebView2控件应用详解系列博客 .NET桌面程序集成Web网页开发的十种解决方案 .NET混合开发解决方案1 WebView2简介 .NE ...
- android include中的控件调用
项目中经常会有一些布局是重用的,但是如何来更好的利用这些布局中的控件 转: http://zhidao.baidu.com/link?url=GU93U8Wu31dfp7mKEx52hMJkxjFLC ...
- 【winform程序】自定义webrowser控件调用IE的版本
修改注册表: bit: HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Internet Explorer\MAIN\FeatureControl\FEATURE_BROW ...
- Js或 Activex 控件调用打印预览等操作
<input value="打印" type="button" onclick="javascript:window.print()" ...
随机推荐
- classmethod作用
>>> class A(object): bar = 1 def func1(self): print 'foo' >>> class A(object): bar ...
- python nose测试框架全面介绍十一---用例的发现
nose是怎么发现用例的??网上一大把说函数以test开头的都会自动发现,真的是这样吗???还是自己来试验下吧 首先,我们还是来看看官方文档怎么说的吧: If it looks like a test ...
- gym102007 E
我计划预习五个小时离散,然后hmc补了这道他自认为非常的裸并且很傻逼自己可以一眼秒的简单题,然后给我讲了讲,然后我失去了一整晚的生命迹象. 首先我们可以发现一个神奇的现象,啊,先排个序,然后我们会发现 ...
- socket.io 中文文档
Socket.io是一个WebSocket库,包括了客户端的js和服务器端的nodejs,它的目标是构建可以在不同浏览器和移动设备上使用的实时应用.它会自动根据浏览器从WebSocket.AJAX长轮 ...
- STL算法总览(部分)
下图将所有的STL算法(以及一些非标准的SGI STL算法)的名称.用途.文件分布等等,依算法名称的字母顺序列表.表格中凡是不在STL标准规格之内的SGI专属算法,都以 * 加以表示. 注:以下“质变 ...
- [No0000196]一文读懂Java 11的ZGC为何如此高效
导读:GC是大部分现代语言内置的特性,Java 11 新加入的ZGC号称可以达到10ms 以下的 GC 停顿,本文作者对这一新功能进行了深入解析.同时还对还对这一新功能带来的其他可能性做了展望.ZGC ...
- MySQL 连接数相关参数设置
当我们的数据库服务器遇到如下的错误:ERROR: Too many connections 一种可能性就是我们的压力确实很大,需要增加服务器硬件资源或者增加数据库服务器.但是大多数情况下是我们的连接数 ...
- h5新增标签及css3新增属性
- h5新增的标签 新增元素 说明 video 表示一段视频并提供播放的用户界面 audio 表示音频 canvas 表示位图区域 source 为video和audio提供数据源 track 为vi ...
- xshell 6评估已过期解决办法 / xftp 6 评估已过期解决办法
1.工具用途介绍 Xshell 是一个强大的安全终端模拟软件,它支持SSH1, SSH2, 以及Microsoft Windows 平台的TELNET 协议.Xshell 通过互联网到远程主机的安全 ...
- 我用MATLAB撸了一个2D LiDAR SLAM
0 引言 刚刚入门学了近一个月的SLAM,但对理论推导一知半解,因此在matlab上捣鼓了个简单的2D LiDAR SLAM的demo来体会体会SLAM的完整流程. (1)数据来源:德意志博物馆Deu ...