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