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

源代码在线查看: component.cpp

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

相关代码

				// component.cpp
				#include 
				#include "Component\component.h" // Generated by MIDL
				#include "registry.h"
				
				const REG_DATA g_regData[] = {
				    { "CLSID\\{10000002-0000-0000-0000-000000000001}", 0, "Inside COM+: In Process Component" },
					{ "CLSID\\{10000002-0000-0000-0000-000000000001}\\InprocServer32", 0, (const char*)-1 }, 
					{ "CLSID\\{10000002-0000-0000-0000-000000000001}\\ProgID", 0, "Component.InsideCOM.1" },
					{ "CLSID\\{10000002-0000-0000-0000-000000000001}\\VersionIndependentProgID", 0, "Component.InsideCOM" },
					{ "Component.InsideCOM", 0, "Inside COM+: In Process Component" },
					{ "Component.InsideCOM\\CLSID", 0, "{10000002-0000-0000-0000-000000000001}" },
					{ "Component.InsideCOM\\CurVer", 0, "Component.InsideCOM.1" },
					{ "Component.InsideCOM.1", 0, "Inside COM+: In Process Component" },
					{ "Component.InsideCOM.1\\CLSID", 0, "{10000002-0000-0000-0000-000000000001}" },
					{ 0, 0, 0 }
				};
				
				HINSTANCE g_hInstance;
				long g_cLocks = 0;
				
				class CInsideCOM : public ISum
				{
				public:
					// IUnknown
					ULONG __stdcall AddRef();
					ULONG __stdcall Release();
					HRESULT __stdcall QueryInterface(REFIID riid, void** ppv);
				
					// ISum
					HRESULT __stdcall Sum(int x, int y, int* retval);
				
					CInsideCOM() : m_cRef(1) { g_cLocks++; }
					~CInsideCOM()
						{
						cout 						g_cLocks--;
						}
				
				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;
				//		*ppv = static_cast(this);
					}
					else if(riid == IID_ISum)
					{
						cout 						*ppv = (ISum*)this;
				//		*ppv = static_cast(this);
					}
					else 
					{
						*ppv = NULL;
						return E_NOINTERFACE;
					}
					AddRef();
				//	reinterpret_cast(*ppv)->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 riid, void** ppv);
				
					// IClassFactory
					HRESULT __stdcall CreateInstance(IUnknown *pUnknownOuter, REFIID riid, void** ppv);
					HRESULT __stdcall LockServer(BOOL bLock);
				
					CFactory() : m_cRef(1) { g_cLocks++; }
					~CFactory() { g_cLocks--; }
				
				private:
					ULONG m_cRef;
				};
				
				ULONG CFactory::AddRef()
				{
					cout 					return ++m_cRef;
				//	g_cLocks++;
				//	return 2;
				}
				
				ULONG CFactory::Release()
				{
					cout 					if(--m_cRef != 0)
						return m_cRef;
					delete this;
					return 0;
				//	g_cLocks--;
				//	return 1;
				}
				
				HRESULT CFactory::QueryInterface(REFIID riid, void** ppv)
				{
					if(riid == IID_IUnknown)
					{
						cout 						*ppv = (IUnknown*)this;
					}
					if(riid == IID_IClassFactory)
					{
						cout 						*ppv = (IClassFactory*)this;
					}
					else
					{
						*ppv = NULL;
						return E_NOINTERFACE;
					}
					AddRef();
					return S_OK;
				}
				
				HRESULT CFactory::CreateInstance(IUnknown *pUnknownOuter, REFIID riid, 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(riid, ppv);
					pInsideCOM->Release();
					return hr;
				}
				
				HRESULT CFactory::LockServer(BOOL bLock)
				{
					if(bLock)
						g_cLocks++;
					else
						g_cLocks--;
					return S_OK;
				}
				
				HRESULT __stdcall DllCanUnloadNow()
				{
					cout 					if(g_cLocks == 0)
						return S_OK;
					else
					    return S_FALSE;
				}
				
				HRESULT __stdcall DllGetClassObject(REFCLSID clsid, REFIID riid, 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(riid, ppv);
					pFactory->Release();
					return hr;
				}
				
				HRESULT __stdcall DllRegisterServer()
				{
					char DllPath[MAX_PATH];
					GetModuleFileName(g_hInstance, DllPath, sizeof(DllPath));
				
					OLECHAR wDllPath[MAX_PATH];
					mbstowcs(wDllPath, DllPath, sizeof(wDllPath));
				
					ITypeLib* pTypeLib;
					HRESULT hr = LoadTypeLibEx(wDllPath, REGKIND_REGISTER, &pTypeLib);
					if(FAILED(hr))
						return hr;
					pTypeLib->Release();
				
					return RegisterServerEx(g_regData, DllPath);
				}
				
				HRESULT __stdcall DllUnregisterServer()
				{
					UnRegisterTypeLib(LIBID_Component, 1, 0, LANG_NEUTRAL, SYS_WIN32);
					return UnregisterServerEx(g_regData);
				}
				
				BOOL WINAPI DllMain(HINSTANCE hInstance, DWORD dwReason, void* pv)
				{
					g_hInstance = hInstance;
					return TRUE;
				}			

相关资源