component.cpp
上传用户:bjlvip
上传日期:2010-02-08
资源大小:744k
文件大小:7k
源码类别:

Windows编程

开发平台:

Visual C++

  1. // component.cpp
  2. #include <iostream.h>
  3. #include <stdio.h>
  4. #include "Componentcomponent.h" // Generated by MIDL
  5. #include "registry.h"  // Need this
  6. HINSTANCE g_hInstance;
  7. long g_cComponents = 0;
  8. long g_cServerLocks = 0;
  9. class CInsideCOM : public ISum
  10. {
  11. public:
  12. // IUnknown
  13. ULONG __stdcall AddRef();
  14. ULONG __stdcall Release();
  15. HRESULT __stdcall QueryInterface(REFIID iid, void** ppv);
  16. // IDispatch
  17. HRESULT __stdcall GetTypeInfoCount(UINT* pCountTypeInfo);
  18. HRESULT __stdcall GetTypeInfo(UINT iTypeInfo, LCID lcid, ITypeInfo** ppITypeInfo);
  19. HRESULT __stdcall GetIDsOfNames(REFIID riid, LPOLESTR* rgszNames, UINT cNames, LCID lcid, DISPID* rgDispId);
  20. HRESULT __stdcall Invoke(DISPID dispIdMember, REFIID riid, LCID lcid, WORD wFlags, DISPPARAMS* pDispParams, VARIANT* pVarResult, EXCEPINFO* pExcepInfo, UINT* puArgErr);
  21. // ISum
  22. HRESULT __stdcall Sum(int x, int y, int* retval);
  23. HRESULT __stdcall get_x(int* retvalue);
  24. HRESULT __stdcall put_x(int newvalue);
  25. HRESULT __stdcall get_y(int* retvalue);
  26. HRESULT __stdcall put_y(int newvalue);
  27. CInsideCOM() : m_cRef(1) { g_cComponents++; }
  28. ~CInsideCOM() { cout << "Component: CInsideCOM::~CInsideCOM()" << endl, g_cComponents--; }
  29. bool Init(void);
  30. private:
  31. ULONG m_cRef;
  32. ITypeInfo* m_pTypeInfo;
  33. int m_x;
  34. int m_y;
  35. };
  36. HRESULT CInsideCOM::get_x(int* retvalue)
  37. {
  38. *retvalue = m_x;
  39. return S_OK;
  40. }
  41. HRESULT CInsideCOM::put_x(int newvalue)
  42. {
  43. m_x = newvalue;
  44. return S_OK;
  45. }
  46. HRESULT CInsideCOM::get_y(int* retvalue)
  47. {
  48. *retvalue = m_y;
  49. return S_OK;
  50. }
  51. HRESULT CInsideCOM::put_y(int newvalue)
  52. {
  53. m_y = newvalue;
  54. return S_OK;
  55. }
  56. HRESULT CInsideCOM::GetTypeInfoCount(UINT* pCountTypeInfo)
  57. {
  58. *pCountTypeInfo = 1;
  59. return S_OK;
  60. }
  61. HRESULT CInsideCOM::GetTypeInfo(UINT iTypeInfo, LCID lcid, ITypeInfo** ppITypeInfo)
  62. {
  63. *ppITypeInfo = NULL;
  64. if(iTypeInfo != 0)
  65. return DISP_E_BADINDEX;
  66. m_pTypeInfo->AddRef();
  67. *ppITypeInfo = m_pTypeInfo;
  68. return S_OK;
  69. }
  70. HRESULT CInsideCOM::GetIDsOfNames(REFIID riid, LPOLESTR* rgszNames, UINT cNames, LCID lcid, DISPID* rgDispId)
  71. {
  72. if(riid != IID_NULL)
  73. return DISP_E_UNKNOWNINTERFACE;
  74. return DispGetIDsOfNames(m_pTypeInfo, rgszNames, cNames, rgDispId);
  75. }
  76. HRESULT CInsideCOM::Invoke(DISPID dispIdMember, REFIID riid, LCID lcid, WORD wFlags, DISPPARAMS* pDispParams, VARIANT* pVarResult, EXCEPINFO* pExcepInfo, UINT* puArgErr)
  77. {
  78. if(riid != IID_NULL)
  79. return DISP_E_UNKNOWNINTERFACE;
  80. return DispInvoke(this, m_pTypeInfo, dispIdMember, wFlags, pDispParams, pVarResult, pExcepInfo, puArgErr); 
  81. }
  82. bool CInsideCOM::Init(void)
  83. {
  84. ITypeLib* pTypeLib;
  85. if(FAILED(LoadRegTypeLib(LIBID_Component, 1, 0, LANG_NEUTRAL, &pTypeLib)))
  86. return false;
  87. HRESULT hr = pTypeLib->GetTypeInfoOfGuid(IID_ISum, &m_pTypeInfo);
  88. pTypeLib->Release();
  89. if(FAILED(hr))
  90. return false;
  91. return true;
  92. }
  93. ULONG CInsideCOM::AddRef()
  94. {
  95. cout << "Component: CInsideCOM::AddRef() m_cRef = " << m_cRef + 1 << endl;
  96. return ++m_cRef;
  97. }
  98. ULONG CInsideCOM::Release()
  99. {
  100. cout << "Component: CInsideCOM::Release() m_cRef = " << m_cRef - 1 << endl;
  101. if(--m_cRef != 0)
  102. return m_cRef;
  103. m_pTypeInfo->Release();
  104. delete this;
  105. return 0;
  106. }
  107. HRESULT CInsideCOM::QueryInterface(REFIID riid, void** ppv)
  108. {
  109. if(riid == IID_IUnknown)
  110. *ppv = (IUnknown*)this;
  111. else if(riid == IID_ISum)
  112. *ppv = (ISum*)this;
  113. else if(riid == IID_IDispatch)
  114. *ppv = (IDispatch*)this;
  115. else 
  116. {
  117. *ppv = NULL;
  118. return E_NOINTERFACE;
  119. }
  120. AddRef();
  121. return S_OK;
  122. }
  123. HRESULT CInsideCOM::Sum(int x, int y, int* retval)
  124. {
  125. if(x == -1 && y == -1)
  126. *retval = m_x + m_y;
  127. else
  128. *retval = x + y;
  129. return S_OK;
  130. }
  131. class CFactory : public IClassFactory
  132. {
  133. public:
  134. // IUnknown
  135. ULONG __stdcall AddRef();
  136. ULONG __stdcall Release();
  137. HRESULT __stdcall QueryInterface(REFIID iid, void** ppv);
  138. // IClassFactory
  139. HRESULT __stdcall CreateInstance(IUnknown *pUnknownOuter, REFIID iid, void** ppv);
  140. HRESULT __stdcall LockServer(BOOL bLock);
  141. CFactory() : m_cRef(1) { }
  142. ~CFactory() { }
  143. private:
  144. long m_cRef;
  145. };
  146. ULONG CFactory::AddRef()
  147. {
  148. cout << "Component: CFactory::AddRef() m_cRef = " << m_cRef + 1 << endl;
  149. return ++m_cRef;
  150. }
  151. ULONG CFactory::Release()
  152. {
  153. cout << "Component: CFactory::Release() m_cRef = " << m_cRef - 1 << endl;
  154. if(--m_cRef != 0)
  155. return m_cRef;
  156. delete this;
  157. return 0;
  158. }
  159. HRESULT CFactory::QueryInterface(REFIID iid, void** ppv)
  160. {
  161. if((iid == IID_IUnknown) || (iid == IID_IClassFactory))
  162. {
  163. cout << "Component: CFactory::QueryInteface() for IUnknown or IClassFactory " << this << endl;
  164. *ppv = (IClassFactory *)this;
  165. }
  166. else
  167. {
  168. *ppv = NULL;
  169. return E_NOINTERFACE;
  170. }
  171. AddRef();
  172. return S_OK;
  173. }
  174. HRESULT CFactory::CreateInstance(IUnknown *pUnknownOuter, REFIID iid, void** ppv)
  175. {
  176. if(pUnknownOuter != NULL)
  177. return CLASS_E_NOAGGREGATION;
  178. CInsideCOM *pInsideCOM = new CInsideCOM;
  179. cout << "Component: CFactory::CreateInstance() " << pInsideCOM << endl;
  180. if(pInsideCOM == NULL)
  181. return E_OUTOFMEMORY;
  182. // Call the Init method to load the type information
  183. pInsideCOM->Init();
  184. HRESULT hr = pInsideCOM->QueryInterface(iid, ppv);
  185. pInsideCOM->Release();
  186. return hr;
  187. }
  188. HRESULT CFactory::LockServer(BOOL bLock)
  189. {
  190. if(bLock)
  191. g_cServerLocks++;
  192. else
  193. g_cServerLocks--;
  194. return S_OK;
  195. }
  196. HRESULT __stdcall DllCanUnloadNow()
  197. {
  198. cout << "Component: DllCanUnloadNow() " << (g_cServerLocks == 0 && g_cComponents == 0 ? "Yes" : "No") << endl;
  199. if(g_cServerLocks == 0 && g_cComponents == 0)
  200. return S_OK;
  201. else
  202. return S_FALSE;
  203. }
  204. HRESULT __stdcall DllGetClassObject(REFCLSID clsid, REFIID iid, void** ppv)
  205. {
  206. cout << "Component: DllGetClassObject" << endl;
  207. if(clsid != CLSID_InsideCOM)
  208. return CLASS_E_CLASSNOTAVAILABLE;
  209. CFactory* pFactory = new CFactory;
  210. if(pFactory == NULL)
  211. return E_OUTOFMEMORY;
  212. // QueryInterface probably for IClassFactory
  213. HRESULT hr = pFactory->QueryInterface(iid, ppv);
  214. pFactory->Release();
  215. return hr;
  216. }
  217. HRESULT __stdcall DllRegisterServer()
  218. {
  219. char DllPath[256];
  220. OLECHAR wDllPath[256];
  221. GetModuleFileName(g_hInstance, DllPath, 256);
  222. mbstowcs(wDllPath, DllPath, 256);
  223. ITypeLib* pTypeLib;
  224. HRESULT hr = LoadTypeLibEx(wDllPath, REGKIND_REGISTER, &pTypeLib);
  225. if(FAILED(hr))
  226. return hr;
  227. pTypeLib->Release();
  228. return RegisterServer("component.dll", CLSID_InsideCOM, "Inside COM+ Sample", "Component.InsideCOM", "Component.InsideCOM.1", NULL);
  229. }
  230. HRESULT __stdcall DllUnregisterServer()
  231. {
  232. UnRegisterTypeLib(LIBID_Component, 1, 0, LANG_NEUTRAL, SYS_WIN32);
  233. return UnregisterServer(CLSID_InsideCOM, "Component.InsideCOM", "Component.InsideCOM.1");
  234. }
  235. BOOL WINAPI DllMain(HINSTANCE hInstance, DWORD dwReason, void* pv)
  236. {
  237. g_hInstance = hInstance;
  238. return TRUE;
  239. }