经验交流,从网上下载的好东西望大家分享

源代码在线查看: component.cpp

软件大小: 655 K
上传用户: KuFly
关键词: 经验 交流
下载地址: 免注册下载 普通下载 VIP

相关代码

				// component.cpp
				#include 
				#include "Component\component.h" // Generated by MIDL
				#include "registry.h" // Add This!!!
				
				// {10000002-0000-0000-0000-000000000001}
				const CLSID CLSID_InsideCOM = {0x10000002,0x0000,0x0000,{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01}};
				
				long g_cComponents = 0;
				long g_cServerLocks = 0;
				
				class CInsideCOM : public ISum
				{
				public:
					// IUnknown
					ULONG __stdcall AddRef();
					ULONG __stdcall Release();
					HRESULT __stdcall QueryInterface(REFIID iid, void** ppv);
				
					// ISum
					HRESULT __stdcall Sum(int x, int y, int* retval);
				
					CInsideCOM() : m_cRef(1) { g_cComponents++; }
					~CInsideCOM() { cout 				
				private:
					ULONG m_cRef;
				};
				
				ULONG CInsideCOM::AddRef()
				{
					cout 					return ++m_cRef;
				}
				
				ULONG CInsideCOM::Release()
				{
					cout 					if(--m_cRef != 0)
						return m_cRef;
					delete this;
					return 0;
				}
				
				HRESULT CInsideCOM::QueryInterface(REFIID riid, void** ppv)
				{
					if(riid == IID_IUnknown)
					{
						cout 						*ppv = (IUnknown*)this;
					}
					else if(riid == IID_ISum)
					{
						cout 						*ppv = (ISum*)this;
					}
					else 
					{
						*ppv = NULL;
						return E_NOINTERFACE;
					}
					AddRef();
					return S_OK;
				}
				
				HRESULT CInsideCOM::Sum(int x, int y, int* retval)
				{
					cout 					*retval = x + y;
					return S_OK;
				}
				
				class CFactory : public IClassFactory
				{
				public:
					// IUnknown
					ULONG __stdcall AddRef();
					ULONG __stdcall Release();
					HRESULT __stdcall QueryInterface(REFIID iid, void** ppv);
				
					// IClassFactory
					HRESULT __stdcall CreateInstance(IUnknown *pUnknownOuter, REFIID iid, void** ppv);
					HRESULT __stdcall LockServer(BOOL bLock);
				
					CFactory() : m_cRef(1) { }
					~CFactory() { }
				
				private:
					ULONG m_cRef;
				};
				
				ULONG CFactory::AddRef()
				{
					cout 					return ++m_cRef;
				}
				
				ULONG CFactory::Release()
				{
					cout 					if(--m_cRef != 0)
						return m_cRef;
					delete this;
					return 0;
				}
				
				HRESULT CFactory::QueryInterface(REFIID iid, void** ppv)
				{
					if((iid == IID_IUnknown) || (iid == IID_IClassFactory))
					{
						cout 						*ppv = (IClassFactory *)this;
					}
					else
					{
						*ppv = NULL;
						return E_NOINTERFACE;
					}
					AddRef();
					return S_OK;
				}
				
				HRESULT CFactory::CreateInstance(IUnknown *pUnknownOuter, REFIID iid, void** ppv)
				{
					if(pUnknownOuter != NULL)
						return CLASS_E_NOAGGREGATION;
				
					CInsideCOM *pInsideCOM = new CInsideCOM;
					cout 				
					if(pInsideCOM == NULL)
						return E_OUTOFMEMORY;
				
					// QueryInterface probably for IID_IUNKNOWN
					HRESULT hr = pInsideCOM->QueryInterface(iid, ppv);
					pInsideCOM->Release();
					return hr;
				}
				
				HRESULT CFactory::LockServer(BOOL bLock)
				{
					if(bLock)
						g_cServerLocks++;
					else
						g_cServerLocks--;
					return S_OK;
				}
				
				HRESULT __stdcall DllCanUnloadNow()
				{
					cout 					if(g_cServerLocks == 0 && g_cComponents == 0)
						return S_OK;
					else
						return S_FALSE;
				}
				
				HRESULT __stdcall DllGetClassObject(REFCLSID clsid, REFIID iid, void** ppv)
				{
					cout 					
					if(clsid != CLSID_InsideCOM)
						return CLASS_E_CLASSNOTAVAILABLE;
				
					CFactory* pFactory = new CFactory;
					if(pFactory == NULL)
						return E_OUTOFMEMORY;
				
					// QueryInterface probably for IClassFactory
					HRESULT hr = pFactory->QueryInterface(iid, ppv);
					pFactory->Release();
					return hr;
				}
				
				HRESULT __stdcall DllRegisterServer()
				{
					return RegisterServer("component.dll", CLSID_InsideCOM, "Inside COM Sample", "Component.InsideCOM", "Component.InsideCOM.1", NULL);
				}
				
				HRESULT __stdcall DllUnregisterServer()
				{
					return UnregisterServer(CLSID_InsideCOM, "Component.InsideCOM", "Component.InsideCOM.1");
				}			

相关资源