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;
}
#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;
}
相关文章推荐
- VB中创建可以输出函数的DLL 作者:TechnoFantasy
- 如何用asp调用dll组件里边的函数??
- 关于显式调用DLL、隐式调用DLL和查看DLL输出函数
- 关于显式调用DLL、隐式调用DLL和查看DLL输出函数
- VB中创建可以输出函数的DLL
- VB中创建可以输出函数的DLL
- VB中创建可以输出函数的DLL
- 取得某一dll所有输出函数名
- XP在安装windows组件时提示无法加载安装程序ntoc.dll,或是找不到函数NtOcSetupProc,0X7e
- DLL输入和输出函数—dllinport与dllexport
- 一个完整的DLL远程注入函数
- dll的输出函数使用__stdcall调用约定后,客户端用GetProcAddress出现的问题!
- 一个函数5行代码即可实现完整的面向方面AOP编程功能
- 一个完整的DLL远程注入函数
- 自己写 localtime 函数(含完整注释,代码)
- 取得某一dll所有输出函数名
- FormatRemoteUrl函数之asp实现格式化成当前网站完整的URL-将相对地址转换为绝对地址的代码
- VB中创建可以输出函数的DLL
- 关于输出对话框的DLL 函数
- 关于显式调用DLL、隐式调用DLL和查看DLL输出函数