利用ATL创建com组件和如何在程序中使用组件的接口函数和设置接口的属性

这是一个ATL开发实例的流程:

1.       atl中插入一个atl实例,然后添加一个类,派生自ccmdtarget

2.       添加相应的属性或者方法,在这里需要明白一点的是,这个属性和方法其实是一个概念,只是添加一个属性就相当于添加了两个方法,一个用于获取属性的,一个用于设置属性的。

3.       注意一点:atl具有自注册的功能,我只需要对其进行build就可以实现注册的功能

4.       这就相当于创建了一个代码组件

接下来就是在工程中进行调用了:调用的步骤如下:

1.       首先我们用#import “…..dll”进行引入。注意这里引入的是dll而不是tlb(mfc写的组件调用的是tlb)

2.       afxoleinit()或者是Coinitialize(NULL)进行初始化。

3.       创建一个接口对象比如:IOperatorPtr m_p;

4.       对象实例化:eg:m_p.CreateInstance(__uuidof(Operator));即可

5.       用接口调用接口函数即可。

接下来是一个实例:

Atl中的主要代码:

STDMETHODIMP CFace::test(long Amount, BSTR *pbstrResult)

{

       // TODO: Add your implementation code here

 

       TCHAR szBuf[512];

       WCHAR *wszBuf=new WCHAR[512];

       BSTR bstrNew;

       if (m_balance+Amount<0)

       {

              wsprintf(szBuf,"不能借款");

              MultiByteToWideChar(CP_ACP,0,szBuf,-1,wszBuf,512);

              bstrNew=::SysAllocString(wszBuf);

              *pbstrResult=bstrNew;

       }

       else

       {

              wsprintf(szBuf,"借款成功");

              MultiByteToWideChar(CP_ACP,0,szBuf,-1,wszBuf,512);

              bstrNew=::SysAllocString(wszBuf);

              *pbstrResult=bstrNew;

       }

       return S_OK;

}

 

STDMETHODIMP CFace::get_Balance(long *pVal)

{

       // TODO: Add your implementation code here

       *pVal=m_balance;

       return S_OK;

}

 

STDMETHODIMP CFace::put_Balance(long newVal)

{

       // TODO: Add your implementation code here

       m_balance=newVal;

       return S_OK;

}

下面是在程序中对这个代码组件的调用的主要代码,初始化和实例化都已经在initialdialog中完成:

void CAaDlg::OnButton1()

{

       // TODO: Add your control notification handler code here

       UpdateData();

       BSTR str;

//     CoInitialize(NULL);

//  if (FAILED(m_p.CreateInstance(__uuidof(Face))))

//  {

//          AfxMessageBox("not found");

//    }

       str=m_p->test(m_data);

       CString s=(CString)str;

       AfxMessageBox(s);

}

 

void CAaDlg::OnButton2()

{

       // TODO: Add your control notification handler code here

       UpdateData();

//     IFacePtr ptr;

//     ptr.CreateInstance(__uuidof(Face));

//     ptr->put_Balance(m_money);

       m_p->put_Balance(m_money);

       MessageBox("存款成功");

}

 

void CAaDlg::OnButton3()

{

       // TODO: Add your control notification handler code here

//     CoInitialize(NULL);

       long l;

//    IFacePtr ptr;

//    if (FAILED(ptr.CreateInstance(__uuidof(Face))))

//    {

//           AfxMessageBox("not found");

//    }

//    ptr->get_Balance(&l);

       m_p->get_Balance(&l);

       CString str;

       str.Format("%d",l);

       MessageBox(str);

}

注意:在接口的设计的时候,方法的参数的第二个为输出参数,在程序中进行调用的时候,我们调用的接口方法的参数只有一个。如果写两个参数的话编译器是通不过的。可以再外面设置一个变量用来获取接口方法返回的值。

转载于:https://www.cnblogs.com/yangxiaoluck/archive/2009/11/25/1610289.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/549348.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

java 课外练习题

1.下列哪些是Thread类中的方法&#xff08;&#xff09; A start() B run() C exit() D getPriority() 解析&#xff1a;线程的就绪状态&#xff1a;新建线程后start()方法的调用&#xff0c;来启动线程&#xff0c;但此时线程并没有进入运行状态&#xff0c;只是…

关于ubuntu 是否需要使用std::到问题。

首先是在ubuntu下编译c要使用g&#xff0c;比如 g -Wall 01knap2.cpp -o 01knap2 而如果是编译c语言文件的话则需要用 gcc -Wall 01knap2.c -o 01knap2 即可&#xff0c;g编译得到的是.cpp文件&#xff0c;而gcc编译得到的是.c文件。 第二个是关于是否能够直接使用cout&#…

对一道基础string题及其变式题的思考与解析

1、下面程序的运行结果是&#xff08;&#xff09;&#xff08;选择一项&#xff09; String str1“hello”; String str2new String(“hello”); System.out.println(str1str2); A.true B.false C.hello D.he 答案&#xff1a;B 分析&#xff1a;str1没有使用new关键字&am…

Redo Log 和Checkpoint not complete

首先我们来看下 alertSID.log 日志&#xff1a; Mon Nov 30 17:31:54 2009 Thread 1 advanced to log sequence 14214 (LGWR switch) Current log# 3 seq# 14214 mem# 0: /u03/oradata/newccs/redo03.log Mon Nov 30 17:34:29 2009 Thread 1 advanced to log sequence 14215 (L…

组合数学中的项链计数

给c种不同颜色宝石能穿成多少种长度为s的宝石项链&#xff08;本质不同&#xff09; Burnside定理的应用&#xff1a; 当n为奇数时&#xff0c;有n种翻转&#xff0c;每种翻转都是以一个顶点和该顶点对边的中点对称。有k^(n/21)*n种。 当n为偶数时&#xff0c;有n种翻转&#x…

蓝桥杯 算法训练(四)结点选择(树形动态规划)

结点选择&#xff08;树形动态规划&#xff09;C语言 问题描述 有一棵 n 个节点的树&#xff0c;树上每个节点都有一个正整数权值。如果一个点被选择了&#xff0c;那么在树上和它相邻的点都不能被选择。求选出的点的权值和最大是多少&#xff1f; 输入格式 第一行包含一个整数…

SCVMM

通过SCVMM实现并管理虚拟机高可用性 1、 添加群集主机2、 创建虚拟网络3、 创建虚拟机并实现高可用性接着上一篇文章&#xff0c;这次我们来看一下&#xff0c;如果通过SCVMM R2来实现虚拟机的高可用性。首先将群集主机添加到SCVMM 1、 登陆到计算机Win2008R2&#xff0c;打开S…

机器学习统计学相关书籍

1. 《统计学完全教程》 All of statistics 卡耐基梅隆 沃塞曼 2. 第四版《概率论与数理统计》 莫里斯。德格鲁特&#xff08;Morris H.DeGroot&#xff09;和马克。舍维什&#xff08;Mark J.Shervish&#xff09; 3. 《线性代数导论》 吉尔伯特。斯特朗--网上视频教程堪称经…

序列化包含多种不明类型的集合

序列化包含多种不明类型的集合 代码&#xff1a;/Files/zhuqil/Kirin.rar 导言: 你是否曾经想过序列化构造对象&#xff0c;它里面有一个集合&#xff0c;这个集合包含接口或者抽象类&#xff1f;你是否不知道所有的你要序列化的类型&#xff1f;好吧&#xff0c;如果这样&…

机器学习入门方法推荐(少走弯路)入门视频推荐

入门可以看看下列的几个课程。第一第二个公认的经典了。1、首先当然是吴恩达的经典机器学习了&#xff0c; 可以在万能的b站搜&#xff0c;也可以在网易公开课搜 吴恩达机器学习http://study.163.com/course/courseMain.htm?courseId10045700292、台大林轩田教授的机器学习基石…

NLP大神推荐的机器学习入门书单(附大量百度网盘电子书)

转载自&#xff1a;http://blog.csdn.net/surgent777/article/details/53895048 继NLP之后&#xff0c;我又开了ML这个大坑。这是因为NLP涉及到太多的ML模型&#xff0c;仅仅拿过来用的话&#xff0c;我实现的HanLP已经快到个人极限了。而模型背后的原理、如何优化、如何并行化…

$HOME/$user/.权限导致用户无法登陆图形界面

在redhat linux下&#xff0c;用户登陆图形界面时将在$HOME/$user/.目中添加隐藏文件&#xff08;以.开头的文件&#xff09;&#xff0c;如果在无意中将$HOME/$user/.的写权限去除&#xff0c;将会导致用户无法成功登陆gnome&#xff0c;在正确输入用户名和密码的情况下&#…

想要入坑机器学习?这是MIT在读博士的AI心得

从科研社区中汲取营养找论文AI 领域的论文可以在 arXiv 上找到和发布。现在的论文数量非常令人振奋。社区中的许多人降低了从噪声中分辨出信号的难度。Andrej Karpathy 开发了 arXiv sanity preserver&#xff0c;帮助分类、搜索和过滤特征。Miles Brundage 每晚都在推特上发布…

修改EIGRP 路径cost 值,以及分析和实现等价与非等价负载均衡

一、拓扑图&#xff1a;二、配置各路由器的IP和EIGRP 协议&#xff0c;并保证邻接关系的形成。1、我要达到的目的是要让R2到192.168.14.0/24这个网段能在R2和R1断开之后&#xff0c;形成网网络的快速收敛。因为根据EIGRP 的次优路径进拓扑关系的形成条件是要满足FC&#xff08;…

C++函数的用法:erase函数

前面的文章中提到过如何向容器中添加元素&#xff0c;这里介绍一个如何删除容器中元素的函数&#xff0c;包括顺序容器和关联容器。 就是这个erase函数&#xff0c;基本用法如下&#xff1a; c.erase(p)------------------------------从c中删除迭代器p指定的元素&#xff0c;…

关注BLUEBEE的浏览器发展

其实我并不认识蓝峰这个人。只是偶尔发现这个人在我的博客中转了一下。怀着好奇的心情回访了一下。发现此人正在开发浏览器。目前IE内核的浏览器实在太多了。除了IE本身如遨游&#xff0c;世界之窗&#xff0c;包括360&#xff0c;还有腾讯的TT。。。。。但我为什么要关注蓝峰的…

Ubuntu 9.10 升级到ext4

最近一直在使用ubuntu系统&#xff0c;当时升级到9&#xff0c;04的时候&#xff0c;也没有在意系统的文件系统变了&#xff1b;当使用一段时间之后&#xff0c;发现系统没有8.10时使用的顺畅&#xff0c;这时才发现9.04之后心内核都支持ext4文件系统&#xff0c;该文件系统要比…

史上最简单的软件破解——5行脚本代码完美破解99%的过期软件

如果你看到了这篇博文&#xff0c;绝对保证不虚此行。仅仅5行脚本代码&#xff0c;即可破解99%的过期软件。 这件事的背景&#xff1a;最近在找了一些学习资料&#xff0c;其中有Rational Rose画的图&#xff0c;好久没用过它了。今天安装好&#xff0c;导入许可文件&#xff…

Jquery getJSON方法分析(二)

getJSON与aspx准备工作Customer类publicclassCustomer{ publicintUnid { get; set; } publicstringCustomerName { get; set; } publicstringMemo { get; set; } publicstringOther { get; set; }}&#xff08;一&#xff09;ashxCustomer customer newCustomer …