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控件做个记录. 正文 定义控件 ...
随机推荐
- Mysql授权远程登录
在命令行输入如下命令即可: Grant all privileges on *.* to ' with grant option; 再执行 flush privileges
- Django中url匹配规则的补充
Django中url匹配规则是在urls.py文件中配置的. 1.关于正则匹配优先级 在url匹配列表中,如果第一条和第二条同时满足匹配规则,则优先匹配第一条. 在url匹配列表中,如果第一条为正则模 ...
- 如何自定义JSR-303标准的validator
在web应用中为了保证数据的有效性而对用户提交的表单数据是必需的,而前台客户端的验证例如javascript并不总是那么安全和可靠,这样我们就需要一个健壮的后台验证框架来处理这个问题.好在java发布 ...
- winform控件背景透明问题(label..等)
在使用winform写界面的时候,要想label这种控件实现对背景色透明,并且也懒得每次拖动一次控件都要在后台写一遍label1.Parent=PictureBox1 那么下面方法就介绍了比较简单便捷 ...
- java 判断大小写、数字出现的次数
//定义一个字符串 String s = "Hello123World"; //定义三个统计变量 int bigCount = 0; int smallCount = 0; int ...
- Oracle数据库插入数据出错:ORA-06550
wpf应用调用oracle的存储过程,出错“ORA-06550:参数个数或参数类型出错”,如下图: 反复检查,存储过程的参数个数和参数类型都没错,觉得非常蹊跷.最后终于解决, 原因是当参数的值为nul ...
- windows禅道环境搭建
zentao官网的几个网址 http://www.zentao.net/ http://www.zentao.net/article-view-79863.html 搭建环境需要下载两个文件 1) ...
- OC工程调用Swift方法
1.建一个OC工程命名为SwiftOC.如图所示: 2.新建一个swfit文件命名为Test.swift,会弹出提示,选择Create Bridging Header建立桥接文件,系统会建立“工程名- ...
- iOSNSDate的相关操作
//获取当前时间 时间根据格林威治时间显示 //时间 8小时 英国格林威治 7小时 NSDate *date = [NSDate date]; NSLog(@"%@",date ...
- IIS:错误: 无法提交配置更改,因为文件已在磁盘上更改
文件名: \\?\C:\Windows\system32\inetsrv\config\applicationHost.config 错误: 无法提交配置更改,因为文件已在磁盘上更改 通过 Micro ...