您的位置:首页 > 编程语言

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

2014-09-03 21:29 429 查看
//组件、类厂及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_CLASSNOT***AILABLE;

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;

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: