COM学习笔记(七):组件、类厂及DLL所输出函数的完整代码

//组件、类厂及DLL所输出函数的完整代码:Cmpnt.cpp

#include <iostream.h>

#include <objbase.h>

#include "Iface.h"

#include "Registry.h"

void trace(const char* msg){cout<<msg<<endl;}

static HMODULE g_hModule = NULL;

static long g_cComponents = 0;

static long g_cServerLocks = 0;

const char g_szFriendlyName[] = "inside COM: chapter 7 Example";

const char g_szVerIndProgID[] = "InsideCom_Chap07";

const char g_szProgID[] = "InsideCOM_Chap07.1";

class CA : public IX,public IY{

public:

virtual HRESULT __stdcall QueryInterrface(const IID& iid,void** ppv);

virtual ULONG __stdcall AddRef();

virtual ULONG __stdcall Release();

virtual void __stdcall Fx(){cout<<"Fx"<<endl;}

virtual void __stdcall  Fy(){cout<<"Fy"<<endl;}

CA();

~CA();

private:

long m_cRef;

};

CA::CA():m_cRef(1){   InterlockedIncrement(&g_cComponents);}

CA::~CA(){   

InterlockedDecrement(&g_cComponents);

trace("Component:\t\tDestroy self.");

}

HRESULT __stdcall CA::QueryInterface(const IID& iid,void** ppv){

if(iid == IID_IUnknown){

*ppv = static_cast<IX*>(this);

}

else if(iid == IID_IX){

*ppv =static_cast<IX*>(this);

trace("Component:\t\tReturn pointer to IX.");

}

else if(iid == IID_IY){

*ppv = static_cast<IY*>(this);

trace("Component:\t\tReturn pointer to IY.");

}

else{

*ppv = NULL;

return E_NOINTERFACE;

}

reinterpret_cast<IUnknown*>(*ppv)->AddRef();

return S_0K;

}

ULONG __stdcall CA::AddRef(){

return InterlockedIncrement(&m_cRef);

}

ULONG __stdcall CA::Release(){

if(InterlockedDecrement(&m_cRef) == 0){

delete this;

return 0;

}

return m_cRef;

}

class CFactory : public IClassFactory{

public:

virtual HRESULT __stdcall QueryInterface(const IID& iid,void** ppv);

virtual ULONG __stdcall AddRef();

virtual ULONG __stdcall Release();

virtual  HRESULT __stdcall CreateInstance(IUnknown* pUnknownOuter,const IID& iid,void** ppv);

virtual HRESULT __stdcall LockServer(BOOL bLock);

CFactory() : m_cRef(1){}

~CFactory(){trace("Class factory:\t\tDestroy seft.");}

private:

long m_cRef;

};

HRESULT __stdcall QueryInterface(const IID& iid,void ** ppv){

if((iid == IID_IUnknown) || (iid == IID_IClassFactory)){

*ppv = static_cast<IClassFactory*>(this);

}

else{

*ppv = NULL;

return E_NOINTERFACE;

}

reinterpret_cast<IUnknown*>(*ppv)->AddRef();

return S_OK;

}

ULONG __stdcall CFactory::AddRef(){

return InterlockedIncrement(&m_cRef);

}

ULONG __stdcall CFactory:: Release(){

if(InterlockedDecrement(&m_cRef) == 0){

delete this;

return 0;

}

return m_cRef;

}

HRESULT __stdcall CFactory::CreateInstance(IUnknown* pUnknownOuter,const IID& iid,void** ppv){

trace("Class factory:\t\tCreate component.");

if(pUnknownOuter != NULL)    return CLASS_E_NOAGGREGATION;

CA* pA = new CA;

if(pA == NULL)return E_OUTOFMEMORY;

HRESULT hr = pA->QueryInterface(iid,ppv);

pA->Release();

return hr;

}

HRESULT __stdcall CFactory::LockServer(BOOL bLock){

if(bLock) InterlockedIncrement(&g_cServerLocks);

else InterlockedDecrement(&g_cServerLocks);

return S_OK;

}

STDAPI DllCanUnloadNow(){

if((g_ccomponents == 0) && (g_cServerLocks == 0))     return S_OK;

else     return S_FALSE;

}

STDAPI DllGetClassObject(const CLSID& clsid,const IID& iid,void** ppv){

trace("DllGetClassObject: \t Create class factory.");

if(clsid != CLSID_Component1)      return CLASS_E_CLASSNOTAVAILABLE;

CFactory* pFactory = new CFactory;

if(pFactory == NULL)    return E_OUTOFMEMORY;

HRESULT hr = pFactory->QueryInterface(iid,ppv);

pFactory->Release();

return hr;

}

STDAPI  DllGegisterServer(){

return RegisterServer(g_hModule,CLSID_Component1,g_szFriendlyName,g_szVerIndProgID,g_szProgID);

}

STDAPI DllUnregisterServer(){

return UNregisterServer(CLSID_Component1,g_szVerIndProgID,g_szProgID);

}

BOOL APIENTRY DllMain(HANDLE hModule,DWORD dwReason,void* lpReserved){

if(dwReason == DLL_PROCESS_ATTACH)   g_hModule = hModule;

return TRUE;

}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值