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控件做个记录. 正文 定义控件 ...
随机推荐
- F#中的自定义隐式转换
我们知道隐式变换在可控情况下会使代码变得简洁.熟悉C#的都知道C#中可以自定义隐式变换,例如 public class A { private int data; public static impl ...
- 关于CSS样式的那些事_导航条菜单讲解
最近开始忙着开自己的个人博客了,自己的前端确实是渣渣.没办法,一步步来,从慕课网上慢慢学着先. 首先带来的是一个导航栏的设计: 垂直导航栏的设计: 直接上代码: <!DOCTYPE html P ...
- createThread和_beginthreadex区别
摘自:http://blog.csdn.net/morewindows/article/details/7421759 CreateThread()函数是Windows提供的API接口,在C/C++语 ...
- Openjudge-计算概论(A)-分数求和
描述: 输入n个分数并对他们求和,并用最简形式表示.所谓最简形式是指:分子分母的最大公约数为1:若最终结果的分母为1,则直接用整数表示. 如:5/6.10/3均是最简形式,而3/6需要化简为1/2, ...
- 循环移位法和数据拼接法基于led
功能描述 让led每隔0.5s从两边向中间闪烁,然后在从中间向两边闪烁,不断循环 项目实现 开发板 晶振为50M,那么达到0.5s时计数器count1需要达到24_999_999这么多次数 计数器代码 ...
- 常用 NHibernate.Criterion
Expression.Where<ScreenView>((v) => v.bizType != 0);
- runtime官方文档
OC是一种面向对象的动态语言,作为初学者可能大多数人对面向对象这个概念理解的比较深,而对OC是动态语言这一特性了解的比较少.那么什么是动态语言?动态语言就是在运行时来执行静态语言的编译链接的工作.这就 ...
- MySQL binlog 查看信息
1)按时间筛选 mysqlbinlog --start-datetime="2009-09-14 0:20:00" --stop-datetim="2009-09-15 ...
- git提交失败
git push "提示:更新被拒绝,因为您当前分支的最新提交落后于其对应的远程分支."的解决办法 本地已存在项目,需要先获取远端更新并与本地合并,再git push具体操作如下: ...
- js 禁止重复提交
/*分享按钮*/ var flag = true; $(".recommed a").click(function() { if (flag == true) { getServe ...