C++调用com控件方法
转载自:http://blog.csdn.net/haijun286972766/article/details/6273414
最近要求做一个C++调用com组件的DEMO。由于自己对C++并无研究包括IDE工具。后来在网上查阅了些资料,经过努力终于告一段落。
网上对于C++加载com组件的方法已经说的很多了,我就仅贴下我所使用的方法(不用注册dll,当然网上推荐了一些更简单也更有实际意义的使用方式):
CLSID clsid;
HRESULT hr1=CLSIDFromProgID(OLESTR("PTA.iTrusPTA"),&clsid);//获得dll控件的clsid
typedef HRESULT (__stdcall * pfnGCO) (REFCLSID, REFIID, void**);
pfnGCO fnGCO = NULL;
HINSTANCE hdllInst = LoadLibrary(L"PTAExt.dll"); //加载dll
fnGCO = (pfnGCO)GetProcAddress(hdllInst, "DllGetClassObject"); //从dll中得到DllGetClassObject
if (fnGCO != 0)
{ IClassFactory* pcf = NULL;
HRESULT hr=(fnGCO)(clsid, IID_IClassFactory, (void**)&pcf); //创建工厂 if (SUCCEEDED(hr) && (pcf != NULL))
{
IiTrusPTA* pFoo = NULL;
hr = pcf->CreateInstance(NULL, __uuidof(IiTrusPTA), (void**)&pFoo); //通过工厂创建dll中IiTrusPTA接口
//调用IiTrusPTA具体的业务操作
if (SUCCEEDED(hr) && (pFoo != NULL))
{ ICertFilter *a = pFoo->Filter;
ICertificatesPtr certs = pFoo->MyCertificates;
long temp = certs->Count;
if(temp>0){
for(int i=1;i<=temp;i++){
_variant_t cert = certs->Item[i];
ICertificatePtr date = (ICertificatePtr)cert.pdispVal;
_bstr_t name = date->CommonName;
((CComboBox *)GetDlgItem(IDC_COMBO1))->AddString(name);
((CComboBox *)GetDlgItem(IDC_COMBO1))->SetCurSel(0);
}
}else{
((CComboBox *)GetDlgItem(IDC_COMBO1))->AddString(L"没有找到数字证书");
((CComboBox *)GetDlgItem(IDC_COMBO1))->SetCurSel(0); } } pFoo->Release();
}
pcf->Release(); }
FreeLibrary(hdllInst);//释放dll资源
整个流程就是通过LoadLibrary()加载dll,然后IClassFactory去创建com组件实例。整个操作过程中遇到唯一的问题处理dll返回的variant类型数据。在具体操作时我们可以根据我们variant中实际存在的类型去variant.*val;获得我们实际值;variant操作空间很大,使用灵活性也很大。因此当我们不能清楚的知道实际的值是什么时,我们可以去尝试强转等方式。(对于variant类型的操作网上也有很多说明。根据网上说明在结合我的代码我相信对于入门的C++程序员来说这个问题都不难解决了)
com组件详细接口说明:http://blog.csdn.net/haijun286972766/archive/2011/03/25/6278095.aspx
C++调用com控件方法的更多相关文章
- 谷歌浏览器调用activex控件方法
原文转自 https://jingyan.baidu.com/article/af9f5a2d0ebe5543140a4596.html activex是由微软开发,所以在支持上,目前原生态支持的只有 ...
- PHP调用OCX控件的具体方法
需要设置php.ini文件,找到这行com.allow_dcom=true,把com组件支持启用 使用PHP调用OCX控件,本不是个难题,但现实中采用flash回避的方法更通用.真正使用ocx的不多, ...
- Atitit.swt 线程调用ui控件的方法
Atitit.swt 线程调用ui控件的方法 1 SwingUtilities.invokeLater1 2 display.asyncExec方法1 3 display.timerExec(500 ...
- 袁创:使用反射动态调用ActiveX控件
■■■■前言 目前的基于.NET平台的软件研发中仍然存在大量的对COM及ActiveX控件的调用.使用C#调用ActiveX控件时一般是使用vs.net工具自动生成的互操作性程序集.这种方法操作简单, ...
- 使用反射动态调用ActiveX控件
使用反射动态调用ActiveX控件 袁永福 2018-3-2 ■■■■问题描述: 目前的基于.NET平台的软件研发中仍然存在大量的对COM及ActiveX控件的调用.使用C#调用ActiveX控件时一 ...
- C#跨线程调用窗体控件(比如TextBox)引发的线程安全问题
如何:对 Windows 窗体控件进行线程安全调用 访问 Windows 窗体控件本质上不是线程安全的. 如果有两个或多个线程操作某一控件的状态,则可能会迫使该控件进入一种不一致的状态. 还可能会出现 ...
- C# winform中自定义用户控件 然后在页面中调用用户控件的事件
下面是用户控件的代码: using System; using System.Collections.Generic; using System.ComponentModel; using Syste ...
- vs2010开发activex(MFC)控件/ie插件(三),js调用ocx控件的接口函数
原文:http://blog.csdn.net/yhhyhhyhhyhh/article/details/50802280 js调用ocx控件的接口函数,先看demo效果: 简单测试过程 ...
- Visual studio之C#跨线程调用UI控件
背景 当前串口通讯项目,多个线程需要同时利用richTextBoxMsg控件打印信息,直接调用会造成线程不安全,严重的时候会直接导致UI线程挂掉,因此本篇就跨线程调用UI控件做个记录. 正文 定义控件 ...
随机推荐
- POJ 1230 Pass-Muraille#贪心+vector迭代器用法
(- ̄▽ ̄)-* (注意下面代码中关于iterator的用法,此代码借鉴某大牛) #include<iostream> #include<cstdio> #include< ...
- Maven项目问题
Maven项目部署 svn检出的为普通项目 1.普通项目转换为Maven项目: 选择项目右击->Maven4MyEclipse->Update Project 2.tomcat项目空间WE ...
- redis的常用命令
键值得相关命令: keys * 返回满足给定patternd的所有key exists 确认一个key是否存在 del 删除一个key expire 设置一个key的过期时间 ttl 查看过期时间还有 ...
- Spring测试
测试类添加两个注解 @RunWith(SpringJUnit4ClassRunner.class)和@ContextConfiguration(locations = "classpath: ...
- 第2章 熟悉Eclipse开发工具----加减乘除,和差积商的英文写法
加减乘除表示运算:plus minus multiply divide和差积商表示运算结果:sum difference product quotient
- 28.按要求编写一个Java应用程序: (1)定义一个类,描述一个矩形,包含有长、宽两种属性,和计算面积方法。 (2)编写一个类,继承自矩形类,同时该类描述长方体,具有长、宽、高属性, 和计算体积的方法。 (3)编写一个测试类,对以上两个类进行测试,创建一个长方体,定义其长、 宽、高,输出其底面积和体积。
//矩形父类 package d922A; public class Rect { private double l,w; Rect(double c,double k) { l=c; w=k; } ...
- js 鸭式辨型法
无意中看到arr.length === +arr.length;这句代码,然后就去了解了下 这是一种鸭式辨型的判断方法. 鸭式辨型:像鸭子一样走路.游泳和嘎嘎叫的鸟就是鸭子 这句话表示: a.arr有 ...
- abstract和interface
1.abstract 的应用 abstract class ShapesClass { public abstract int Area(); } class Square : ShapesClass ...
- websphere安装验证报错 忘记密码的配置
http://blog.csdn.net/yulimin/article/details/4048897 ADMU7704E: 在尝试启动与服务器相关联的 Windows 服务时失败:server1: ...
- File文件操作类
public class FileTest { //遍历出E:根目录下所有的文件夹,并输出文件夹名 static void testOne(){ //构建File对象,设置文件路径 File ro ...