转载自: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控件方法的更多相关文章

  1. 谷歌浏览器调用activex控件方法

    原文转自 https://jingyan.baidu.com/article/af9f5a2d0ebe5543140a4596.html activex是由微软开发,所以在支持上,目前原生态支持的只有 ...

  2. PHP调用OCX控件的具体方法

    需要设置php.ini文件,找到这行com.allow_dcom=true,把com组件支持启用 使用PHP调用OCX控件,本不是个难题,但现实中采用flash回避的方法更通用.真正使用ocx的不多, ...

  3. Atitit.swt 线程调用ui控件的方法

    Atitit.swt 线程调用ui控件的方法 1 SwingUtilities.invokeLater1 2 display.asyncExec方法1 3  display.timerExec(500 ...

  4. 袁创:使用反射动态调用ActiveX控件

    ■■■■前言 目前的基于.NET平台的软件研发中仍然存在大量的对COM及ActiveX控件的调用.使用C#调用ActiveX控件时一般是使用vs.net工具自动生成的互操作性程序集.这种方法操作简单, ...

  5. 使用反射动态调用ActiveX控件

    使用反射动态调用ActiveX控件 袁永福 2018-3-2 ■■■■问题描述: 目前的基于.NET平台的软件研发中仍然存在大量的对COM及ActiveX控件的调用.使用C#调用ActiveX控件时一 ...

  6. C#跨线程调用窗体控件(比如TextBox)引发的线程安全问题

    如何:对 Windows 窗体控件进行线程安全调用 访问 Windows 窗体控件本质上不是线程安全的. 如果有两个或多个线程操作某一控件的状态,则可能会迫使该控件进入一种不一致的状态. 还可能会出现 ...

  7. C# winform中自定义用户控件 然后在页面中调用用户控件的事件

    下面是用户控件的代码: using System; using System.Collections.Generic; using System.ComponentModel; using Syste ...

  8. vs2010开发activex(MFC)控件/ie插件(三),js调用ocx控件的接口函数

    原文:http://blog.csdn.net/yhhyhhyhhyhh/article/details/50802280   js调用ocx控件的接口函数,先看demo效果:      简单测试过程 ...

  9. Visual studio之C#跨线程调用UI控件

    背景 当前串口通讯项目,多个线程需要同时利用richTextBoxMsg控件打印信息,直接调用会造成线程不安全,严重的时候会直接导致UI线程挂掉,因此本篇就跨线程调用UI控件做个记录. 正文 定义控件 ...

随机推荐

  1. HDU 2509 Be the Winner(取火柴博弈2)

    传送门 #include<iostream> #include<cstdio> #include<cstring> using namespace std; int ...

  2. html的表单表格...

    <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...

  3. CEdit实现文本换行

    CEdit控件若要在字符串中插入换行字符("\r\n")实现换行效果,必须指定两个风格 ES_MULTILINE和ES_WANTRETURN. 1: DWORD dwStyle = ...

  4. UI弹出键盘和收回键盘

    点击textfield,会自动弹出键盘 要让键盘收回来,先设置个代理:[field setTextFieldDelegate:self];  可设置成自己,也可设置成其他对象,只要在对应的类中,遵循U ...

  5. tableIView 区头的一点问题

    要记得设置区头的高度 否则会出现第一行没区头问题

  6. POJ 1696 Space Ant 极角排序(叉积的应用)

    题目大意:给出n个点的编号和坐标,按逆时针方向连接着n个点,按连接的先后顺序输出每个点的编号. 题目思路:Cross(a,b)表示a,b的叉积,若小于0:a在b的逆时针方向,若大于0a在b的顺时针方向 ...

  7. C++侵入式链表

    C++标准模板库中的list是非侵入式的链表,当我们通过对象来删除容器中的对象时,需要从头到尾查找一次得到iterator,最后通过iterator来删除对象.这样删除容器中的对象时比较缓慢,所以就实 ...

  8. java 图形界面

    1.创建一个窗口框架 /** * java 用户界面框架 * 2016/5/10 */ package org.windows; import javax.swing.*; public class ...

  9. memcached + php 扩展 for ubuntu

    1.安装memcached apt-get install memcached 2.安装php memcached 扩展 apt-get install php5-memcache 3.启动memca ...

  10. linux常用服务软件搭建及使用技巧

    一.Webmin安装: Webmin 是一个基于浏览器的管理工具,可以应用于Linux 和其他一些平台,提供了可以完成很多管理和操作任务的图形化界面 •安装完成后,root 用户会被自动创建,密码为系 ...