COM技术初探(三):一个真正的COM

一、实现ISmipleMath,IAdvancedMath接口和DllGetClassObject()

1.1 实现ISmipleMath和IAdvancedMath接口

让我们将原来的CMath 类(CMath其实就是"COM技术初探(二)COM基础知识"里的那个CMath类)修改来实现ISmipleMath接口和IAdvancedMath接口。

修改的地方如下:

1) Math.h文件 /*@**#---2003-10-29 21:33:44 (tulip)---#**@
#include "interface.h"*/
#include "MathCOM.h"//新增加的,以替换上面的东东
class CMath : public ISimpleMath,
       public IAdvancedMath
{
private:
  ULONG m_cRef;
private:
  int calcFactorial(int nOp);
  int calcFabonacci(int nOp);
public:
  CMath();
  //IUnknown Method
  STDMETHOD(QueryInterface)(REFIID riid, void **ppv);
  STDMETHOD_(ULONG, AddRef)();
  STDMETHOD_(ULONG, Release)();
  //  ISimpleMath Method
  STDMETHOD (Add)(int nOp1, int nOp2,int * pret);
  STDMETHOD (Subtract)(int nOp1, int nOp2,int *pret);
  STDMETHOD (Multiply)(int nOp1, int nOp2,int *pret);
  STDMETHOD (Divide)(int nOp1, int nOp2,int * pret);
  //  IAdvancedMath Method
  STDMETHOD (Factorial)(int nOp,int *pret);
  STDMETHOD (Fabonacci)(int nOp,int *pret);
};
2) Math.cpp文件 /*@**#---2003-10-29 21:32:35 (tulip)---#**@
#include "math.h"
STDMETHODIMP CMath::QueryInterface(REFIID riid, void **ppv)
{//  这里这是实现dynamic_cast的功能,但由于dynamic_cast与编译器相关。
  if(riid == IID_ISimpleMath)
    *ppv = static_cast<ISimpleMath *>(this);
  else if(riid == IID_IAdvancedMath)
    *ppv = static_cast<IAdvancedMath *>(this);
  else if(riid == IID_IUnknown)
    *ppv = static_cast<ISimpleMath *>(this);
  else {
    *ppv = 0;
    return E_NOINTERFACE;
  }
  //这里要这样是因为引用计数是针对组件的
  reinterpret_cast<IUnknown *>(*ppv)->AddRef();
  return S_OK;
}
STDMETHODIMP_(ULONG) CMath::AddRef()
{
  return ++m_cRef;
}
STDMETHODIMP_(ULONG) CMath::Release()
{
  // 使用临时变量把修改后的引用计数值缓存起来
  ULONG res = --m_cRef;
  // 因为在对象已经销毁后再引用这个对象的数据将是非法的
  if(res == 0)
    delete this;
  return res;
}
STDMETHODIMP CMath::Add(int nOp1, int nOp2,int * pret)
{
   *pret=nOp1+nOp2;
   return S_OK;
}
STDMETHODIMP CMath::Subtract(int nOp1, int nOp2,int * pret)
{
  *pret= nOp1 - nOp2;
  return S_OK;
}
STDMETHODIMP CMath::Multiply(int nOp1, int nOp2,int * pret)
{
  *pret=nOp1 * nOp2;
  return S_OK;
}
STDMETHODIMP CMath::Divide(int nOp1, int nOp2,int * pret)
{
  *pret= nOp1 / nOp2;
  return S_OK;
}
int CMath::calcFactorial(int nOp)
{
  if(nOp <= 1)
    return 1;
  return nOp * calcFactorial(nOp - 1);
}
STDMETHODIMP CMath::Factorial(int nOp,int * pret)
{
  *pret=calcFactorial(nOp);
  return S_OK;
}
int CMath::calcFabonacci(int nOp)
{
  if(nOp <= 1)
    return 1;
  return calcFabonacci(nOp - 1) + calcFabonacci(nOp - 2);
}
STDMETHODIMP CMath::Fabonacci(int nOp,int * pret)
{
  *pret=calcFabonacci(nOp);
  return S_OK;
}
CMath::CMath()
{
  m_cRef=0;
}

时间: 2024-10-03 18:38:42

COM技术初探(三):一个真正的COM的相关文章

Android NFC技术(三)——初次开发Android NFC你须知道NdefMessage和NdefRecord

Android NFC技术(三)--初次开发Android NFC你须知道NdefMessage和NdefRecord 这最近也是有好多天没写博客了,除了到处张罗着搬家之外,依旧还是许许多多的琐事阻碍着学习,加上使用NFC开发,也是需要具有NFC功能的测试机,也到买了一个,所以,也说了两天的概念 Android NFC开发(一)--初探NFC,了解当前前沿技术 Android NFC开发(二)--Android世界里的NFC所具备的条件以及使用方法 今天,咋们就来用一个小栗子做药引,一起进入An

网络存储技术初探

1 IP技术介绍 IP存储涉及到了一系列的技术,它可以使块级存储的数据存基于IP的网路中传输,这里面有两个技术需要阐明:IP技术的利用和块级存储.网络中块级存储的数据传输不是新技术,今天的存储区域网络SAN即便采用是光纤通道FC技术业仍旧如此.然而,新的IP存储协议则可将多个SAN通过IP如以太网的结构建立起来,并且完全互联.通用互联网文件系统CIFS和网络文件系统NFS是将文件级的请求发送到拥有这些文件系统的服务器上,这些请求得到那些文件服务器或网络存储NAS设备的响应,并发送到网络上的主机.

3dmax插件 下载 模板-请教技术大牛们一个关于3dmax二次开发的问题

问题描述 请教技术大牛们一个关于3dmax二次开发的问题 做一个3dmax的插件,将浏览器中的超链接拖动到3dmax中(其中包括鼠标的点击.拖动.按下),然后3dmax会自动把链接中的内容(已经做好的模型.图片.位图)下载下来,将这些内容作为模板加载到3dmax中.请问实现这样的功能流程是什么?怎么去入手呢?可行性是怎样的? 解决方案 参考:http://docs.autodesk.com/3DSMAX/15/ENU/3ds-Max-SDK-Programmer-Guide/index.html

创业技术入股三步曲:入股估值、签订合同、工商变更

目前来说大部分技术大神,尤其是在互联网产业,还是作为公司勤勤恳恳地"码农打工仔".原因就在于那句老话:"创业有风险,投资需谨慎!"技术作为一种无形资产本身具有极高的投资价值,却自甘为他人作嫁衣裳,或许很多专心做技术的人认为自己不懂资本不懂股权,怕一下海就被"资本家"坑了.其实你的技术对于需要创业的"资本家"来说才是真正宝贵的资源!当双方都有需求创业且存在优势互补的切口时,一场创业合作是非常有利的.合伙创业的风险是固然存在的,但

接口-请教技术大牛们一个问题 谢谢

问题描述 请教技术大牛们一个问题 谢谢 能详细讲解一下创建公众接口程序么 selvet Javaweb class都 命的名字是什么 解决方案 所有你需要的资料都可以在这里看到http://mp.weixin.qq.com/wiki/home/index.html 解决方案二: 已解决 又有新的问题了 解决方案三: 有什么新问题? 解决方案四: )企业号开启回调模式 echostr校验失败,请您检查是否正确解密并输出明文echostr 在新浪日志中看到签名验证失败,ase解密失败 .大牛们能不能

命令-求网络技术高手看一个静态网关绑定的问题。

问题描述 求网络技术高手看一个静态网关绑定的问题. 局域网有人私接路由器导致不停的断网,用arp -s命令绑定静态网关后,过几分钟或者更长一段时间后,该绑定的静态网关又变成动态网关了,这期间电脑没有重启,求大神指点如何禁止绑定的静态网关变成动态的. 解决方案 使用netsh命令 netsh i i show in netsh -c 'i i' add neighbors Idx 192.168.1.1 00-22-b0-f8-00 解决方案二: 这个是碰到局域网内,有个高手,把静态绑定又改成了动

字符串混淆技术应用 设计一个字符串混淆程序 可混淆.NET程序集中的字符串

原文:字符串混淆技术应用 设计一个字符串混淆程序 可混淆.NET程序集中的字符串 关于字符串的研究,目前已经有两篇. 原理篇:字符串混淆技术在.NET程序保护中的应用及如何解密被混淆的字符串  实践篇:字符串反混淆实战 Dotfuscator 4.9 字符串加密技术应对策略 今天来讲第三篇,如何应用上面所学内容,设计一个字符串混淆程序. 先设计一个控制台程序,它是将要被我混淆的程序集文件: public static void Main() { try { RunSnippet(); } cat

企业级与云遥感服务平台技术初探

企业级与云遥感服务平台技术初探 邓书斌 田德山 陈秋锦 遥感图像处理软件一直以桌面系统为主,随着数据量的增加,出现了基于并行运算和GPU计算技术的遥感影像处理系统.云计算以服务的方式提供动态可伸缩的虚拟化资源的计算模式,并行计算也是云计算系统核心技术之一.云计算的技术优势为遥感领域提供了一种全新的应用思路,既可以高效完成大数据处理,还能以服务方式快速共享遥感信息.本文探讨了云遥感的背景.关键技术和应用前景.相信云遥感服务平台将成为遥感领域一个新的应用方向. 企业级与云遥感服务平台技术初探

帖子链接批量下载-请教技术大牛们一个问题 谢谢

问题描述 请教技术大牛们一个问题 谢谢 我想批量下载帖子里的附件资料,现在已经拿到帖子的链接,手动操作的流程是 先打开帖子的网页链接,找到网页上的资料链接,点开资料链接才能下载.如果要批量处理这部分帖子,提取所有的附件,该如何处理呢?有什么软件可以先批量提取附件的链接,然后可以把这些所有附件的链接粘贴到迅雷中下载啊 谢谢哦