COM指南 (Step by Step COM Tutorial)-下(1)

原创 2004年02月01日 22:58:00

第七步 实现IClassFactory的方法<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />

 

实现类CAddFactory的方法。创建一个新文件(AddObjFactory.cpp)。提供类IUnknownIClassFactory的方法实现。AddRef,ReleaseQueryInterface方法实现和前面类CAddObj中这三个函数实现基本一样。在方法CreateInstance中,类CaddObj被实例化并且传回其接口指针。LockServer方法没有给出细节的实现。

 

HRESULT __stdcall CAddFactory::CreateInstance(IUnknown* pUnknownOuter,

                                           const IID& iid,

                                           void** ppv)

    {

    //

    //This method lets the client manufacture components en masse

    //The class factory provides a mechanism to control the way

    //the component is created. Within the class factory the

    //author of the component may decide to selectivey enable

    //or disable creation as per license agreements

    //

    //

 

    // Cannot aggregate.

    if (pUnknownOuter != NULL)

        {

        return CLASS_E_NOAGGREGATION ;

        }

 

    //

    // Create an instance of the component.

    //

    CAddObj* pObject = new CAddObj ;

    if (pObject == NULL)

        {

        return E_OUTOFMEMORY ;

        }

 

    //

    // Get the requested interface.

    //

    return pObject->QueryInterface(iid, ppv) ;

    }

 

 

HRESULT __stdcall CAddFactory::LockServer(BOOL bLock)

    {

    return E_NOTIMPL;

    }

/////////////////////////////////////////////////////////////////

 

第八步 实现DllGetClassObject的方法

 

一个进程内COM对象只是一个简单的WIN32DLL,他遵循既定的协议。每一个COM DLL必须有一个通过名字DllGetClassObject的出口函数。客户端将调用这个函数以得到类厂的接口(IUnknown or IClassFactory),之后就是调用CreateInstance方法。创建一个新文件(Exports.cpp),在其中实现DllGetClassObject。(代码如下)

 

STDAPI DllGetClassObject(const CLSID& clsid,

                         const IID& iid,

                         void** ppv)

    {

    //

    //Check if the requested COM object is implemented in this DLL

    //There can be more than 1 COM object implemented in a DLL

    //

 

    if (clsid == CLSID_AddObject)

        {

        //

        //iid specifies the requested interface for the factory object

        //The client can request for IUnknown, IClassFactory,

        //IClassFactory2

        //

        CAddFactory *pAddFact = new CAddFactory;

        if (pAddFact == NULL)

            return E_OUTOFMEMORY;

        else

            {

            return pAddFact->QueryInterface(iid , ppv);

            }

        }

   

 

    //

    //if control reaches here then that implies that the object

    //specified by the user is not implemented in this DLL

    //

 

    return CLASS_E_CLASSNOTAVAILABLE;

    }

/////////////////////////////////////////////////////////////////

 

第九步 实现DllCanUnloadNow

 

客户需要知道什么时候COM DLL可以被从内存中卸载。更进一步,一个进程内COM对象显示的通过调用API函数LoadLibrary装入内存中的客户程序的进程空间中。这个显示装载的DLL也可以使用FreeLibrary卸载。COM客户必须知道什么时候DLL可以被安全的卸载。一个客户必须确定没有任何来自于特别是DLL中的COM对象的实例仍在生命期中。要使得这个可以被简单的计算,在一个COM DLL中,我们在类CAddObjCAddFactory的构造函数中自加一个全局变量(g_nComObjsInUse)。类似的,在析构函数中,自减这个全局变量。

我们输出另一个COM规定的函数:DllCanUnloadedNow,实现如下:

 

STDAPI DllCanUnloadNow()

    {

    //

    //A DLL is no longer in use when it is not managing any existing objects

    // (the reference count on all of its objects is 0).

    //We will examine the value of g_nComObjsInUse

    //

 

    if (g_nComObjsInUse == 0)

        {

        return S_OK;

        }

    else

        {

        return S_FALSE;        }

 

}

 

 

 

COM指南 (Step by Step COM Tutorial)-上 COM指南 (Step by Step COM Tutorial)-中 COM指南 (Step by Step COM Tutorial)-下(2)     

【Caffe细致入微】Solver_Step

void Solver::Step(int iters) 简单的说,这个函数就是核心的优化方法,不断通过前向和反向传播来更新参数的过程。 【重要变量】 int average_loss...
  • u012816621
  • u012816621
  • 2016年12月30日 11:47
  • 2185

正则表达式(1) step by step

之前每次看到正则表达式,瞬间凌乱了,这都是些什么,这次好好学习一下,在此记录学习过程 先上个简单的实例,判断字符串是不是由数字组成 public static void main(String[]...
  • splove1107
  • splove1107
  • 2014年02月19日 16:49
  • 419

docker 入门准备step1

如何免 sudo 使用 docker 简介 默认安装完 docker 后,每次执行 docker 都需要运行 sudo 命令,非常浪费时间影响效率。如果不跟 sudo,直接执行 docke...
  • scut1135
  • scut1135
  • 2015年09月05日 23:07
  • 780

二维图像中Mat::setp、Mat::step1理解

一、前言        Mat中的step为构成图像的层次,考虑到Mat多应用于二维图像,本文讨论二维图像step的含义和应用。二维图像数据存储示意图如下:                      ...
  • AP1005834
  • AP1005834
  • 2017年02月01日 19:55
  • 721

OpenERP模块动态加载原理及启动代码分析

核心提示:一般来说我们在编程中,对象定义都是预先定义好的。一些 OOP 语言(包括 Python/Java)允许对象是 自省的(也称为 反射)。即,自省对象能够描述自己:实例属于哪个类?类有哪些祖先?...
  • angel20082008
  • angel20082008
  • 2014年09月28日 14:44
  • 363

Step.js 使用教程(附源码解析)

Step.js(https://github.com/creationix/step)是控制流程工具(大小仅 150 行代码),解决回调嵌套层次过多等问题。适用于读文件、查询数据库等回调函数相互依赖,...
  • zhangxin09
  • zhangxin09
  • 2013年10月25日 15:18
  • 8491

Python数据处理——numpy_3

通过前面两次的学习,基本上对numpy有了一定的认识,所以,接下来进一步对numpy学习。同时,最后以一个有趣的例子加深对numpy的理解。 import numpy as np xarr = np...
  • llh_1178
  • llh_1178
  • 2017年05月23日 20:25
  • 205

Python/scikit-learn机器学习库(特征选取)

去除方差小的特征 设置一个方差阈值,没有达到这个方差阈值的特征都会被丢弃。  VarianceThreshold,算法输入只要求特征(X),不需要输入结果(Y)。 from skle...
  • AnneQiQi
  • AnneQiQi
  • 2017年03月16日 13:58
  • 767

高次同余笔记(一):baby-step-giant-step算法

我们来看这个方程: a,b,p为常数且在int内。、p是质数。 这个怎么搞? 首先x的取值肯定在0到p-1之间。 暴搜?肯定超时啊。 优化暴搜?用meet-in-the-middle? ...
  • Quack_quack
  • Quack_quack
  • 2015年11月17日 00:35
  • 947

机器学习--线性回归R语言

回归分析就是利用样本,产生拟合方程,从而进行预测。简而言之,就是你用你手头上的数据进行模型的训练,然后用你得到的模型对于新数据进行预测。一元线性回归:例子:y...
  • dingchenxixi
  • dingchenxixi
  • 2016年01月20日 16:23
  • 3958
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:COM指南 (Step by Step COM Tutorial)-下(1)
举报原因:
原因补充:

(最多只允许输入30个字)