BSOPCServer Development - 实现类工厂

类厂是COM对象的生产基地,COM库通过类厂创建COM对象。在这里,我们需要实现一类厂来创建COPCServer类的对象。

添加新类CBSClassFactory,继承IClassFactory接口,头文件内容如下:

#pragma once

#include "unknwn.h"

class CBSClassFactory :
public IClassFactory
{
public:
CBSClassFactory(void);
~CBSClassFactory(void);

HRESULT RegisterClassObject(void);
void RevokeClassObject(void);

// IUnknown methods
STDMETHODIMP QueryInterface(REFIID riid, void**ppv);
STDMETHODIMP_(ULONG) AddRef(void);
STDMETHODIMP_(ULONG) Release(void);

// IClassFactory methods
STDMETHODIMP CreateInstance(IUnknown *pUnkOuter,
REFIID riid,
void **ppv);
STDMETHODIMP LockServer(BOOL bLock);

private:
DWORD m_dwReg;
};

CBSClassFactory类要实现IUnknown接口函数和IClassFactory接口函数,同时添加两个函数RegisterClassObject()和RevokeClassObject()。

下面介绍几个主要函数:

1. QueryInterface

STDMETHODIMP CBSClassFactory::QueryInterface(REFIID riid, void**ppv)
{
    HRESULT hr = S_OK;
    *ppv = 0;

    if (riid == IID_IClassFactory)
    {
        *ppv = (IClassFactory*)this;
    }
    else if (riid == IID_IUnknown)
    {
        *ppv = (IUnknown*)this;
    }
    else 
    {
        hr = E_NOINTERFACE;
    }

    return hr;
}

2. AddRef

// This class is singleton, so just return a constant
STDMETHODIMP_(ULONG) CBSClassFactory::AddRef(void)
{
    return 2;
}

3. Release

// This class is singleton, so just return a constant
STDMETHODIMP_(ULONG) CBSClassFactory::Release(void)
{
    return 1;
}

4. CreateInstance

STDMETHODIMP CBSClassFactory::CreateInstance(IUnknown *pUnkOuter,
                                         REFIID riid,
                                         void **ppv)
{
    *ppv = 0;
  
    // can't aggregate an out of process object
    if (pUnkOuter)
        return CLASS_E_NOAGGREGATION;

    COPCServer* pServer = new CComObject<COPCServer>;
    if (pServer == NULL)
        return E_OUTOFMEMORY;

    HRESULT hr = pServer->QueryInterface(riid, ppv);

    return hr;
}

5. RegisterClassObject

HRESULT CBSClassFactory::RegisterClassObject(void)
{
    CLSID clsid;
    CLSIDFromProgID(L"BSOPCServer.OPCServer",&clsid);

    return CoRegisterClassObject( 
                                    clsid, 
                                    (IUnknown*)g_pPrivateFactory, 
                                    CLSCTX_LOCAL_SERVER | CLSCTX_REMOTE_SERVER, 
                                    REGCLS_MULTIPLEUSE, 
                                    &m_dwReg
                                    );
}

6. RevokeClassObject

void CBSClassFactory::RevokeClassObject(void)
{    
    CoRevokeClassObject(m_dwReg);
}

3.2 使用CBSClassFactory

在BSOPCServer.cpp中定义全局类工厂实例;

CBSClassFactory* g_pPrivateFactory = NULL;

在BSOPCServer.cpp中,函数CBSOPCServerApp::InitInstance(),

将下面的代码稍作修改:

if (FAILED(_AtlModule.RegisterClassObjects(CLSCTX_LOCAL_SERVER, REGCLS_MULTIPLEUSE)))

return FALSE;

替换成:

if (g_pPrivateFactory == NULL)

{

    g_pPrivateFactory = new CBSClassFactory();

    if (FAILED(g_pPrivateFactory->RegisterClassObject()))

    {

        TRACE("Register Class Object failed.");

        return FALSE;

    }

}

函数CBSOPCServerApp::ExitInstance(void)中,将

_AtlModule.RevokeClassObjects();

替换成:

if (g_pPrivateFactory != NULL)

{

    g_pPrivateFactory->RevokeClassObject();

    delete g_pPrivateFactory;

    g_pPrivateFactory = NULL;

}

到这里为止,创建类厂的工作基本完成。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值