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

Windows编程

开发平台:

Visual C++

  1. // component.cpp
  2. #include <ocidl.h>
  3. #include <iostream.h>
  4. #include "Componentcomponent.h" // Generated by MIDL
  5. #include "registry.h"
  6. const REG_DATA g_regData[] = {
  7.     { "CLSID\{10000002-0000-0000-0000-000000000001}", 0, "Inside COM+: In Process Component" },
  8. { "CLSID\{10000002-0000-0000-0000-000000000001}\InprocServer32", 0, (const char*)-1 }, 
  9. { "CLSID\{10000002-0000-0000-0000-000000000001}\ProgID", 0, "Component.InsideCOM.1" },
  10. { "CLSID\{10000002-0000-0000-0000-000000000001}\VersionIndependentProgID", 0, "Component.InsideCOM" },
  11. { "Component.InsideCOM", 0, "Inside COM+: In Process Component" },
  12. { "Component.InsideCOM\CLSID", 0, "{10000002-0000-0000-0000-000000000001}" },
  13. { "Component.InsideCOM\CurVer", 0, "Component.InsideCOM.1" },
  14. { "Component.InsideCOM.1", 0, "Inside COM+: In Process Component" },
  15. { "Component.InsideCOM.1\CLSID", 0, "{10000002-0000-0000-0000-000000000001}" },
  16. { 0, 0, 0 }
  17. };
  18. HINSTANCE g_hInstance;
  19. long g_cLocks = 0;
  20. class CInsideCOM : public ISum, public IPersistStream, public IPersistStreamInit
  21. {
  22. public:
  23. // IUnknown
  24. ULONG __stdcall AddRef();
  25. ULONG __stdcall Release();
  26. HRESULT __stdcall QueryInterface(REFIID riid, void** ppv);
  27. // ISum
  28. HRESULT __stdcall Sum(int x, int y, int* retval);
  29. HRESULT __stdcall SumPersist(int* retval);
  30. // IPersistStream
  31.     HRESULT __stdcall IsDirty(void);
  32.     HRESULT __stdcall Load(IStream *pStm);
  33.     HRESULT __stdcall Save(IStream *pStm, BOOL fClearDirty);
  34.     HRESULT __stdcall GetSizeMax(ULARGE_INTEGER *pcbSize);
  35. // IPersistStreamInit
  36.     HRESULT __stdcall InitNew(void);
  37. // IPersist
  38. HRESULT __stdcall GetClassID(CLSID* pClassID);
  39. CInsideCOM() : m_cRef(1) { g_cLocks++; }
  40. ~CInsideCOM()
  41. {
  42. cout << "Component: CInsideCOM::~CInsideCOM()" << endl;
  43. g_cLocks--;
  44. }
  45. private:
  46. ULONG m_cRef;
  47. int m_x;
  48. int m_y;
  49. };
  50. HRESULT CInsideCOM::InitNew(void)
  51. {
  52. MessageBox(NULL, "InitNew", "Test", MB_OK);
  53. return S_OK;
  54. }
  55. HRESULT CInsideCOM::GetClassID(CLSID* pClassID)
  56. {
  57. MessageBox(NULL, "GetClassID", "Test", MB_OK);
  58. *pClassID = CLSID_InsideCOM;
  59. return S_OK;
  60. }
  61. HRESULT CInsideCOM::IsDirty(void)
  62. {
  63. MessageBox(NULL, "IsDirty", "Test", MB_OK);
  64. return S_OK;
  65. }
  66. HRESULT CInsideCOM::Load(IStream *pStm)
  67. {
  68. ULONG read = 0;
  69. int data[2] = { 0, 0 };
  70. pStm->Read(data, sizeof(data), &read);
  71. m_x = data[0];
  72. m_y = data[1];
  73. char say[255];
  74. wsprintf(say, "IPersistStream::Load read = %d, x = %d, y = %d, %0x", read, m_x, m_y, this);
  75. MessageBox(NULL, say, "Test", MB_OK);
  76. return S_OK;
  77. }
  78. HRESULT CInsideCOM::Save(IStream *pStm, BOOL fClearDirty)
  79. {
  80. ULONG written = 0;
  81. int data[2] = { m_x, m_y };
  82. HRESULT hr = pStm->Write(data, sizeof(data), &written);
  83. char say[255];
  84. wsprintf(say, "IPersistStream::Save written = %d", written);
  85. MessageBox(NULL, say, "Test", MB_OK);
  86. return S_OK;
  87. }
  88. HRESULT CInsideCOM::GetSizeMax(ULARGE_INTEGER *pcbSize)
  89. {
  90. MessageBox(NULL, "GetSizeMax", "Test", MB_OK);
  91. (*pcbSize).QuadPart = 8;
  92. return S_OK;
  93. }
  94. ULONG CInsideCOM::AddRef()
  95. {
  96. return ++m_cRef;
  97. }
  98. ULONG CInsideCOM::Release()
  99. {
  100. if(--m_cRef != 0)
  101. return m_cRef;
  102. delete this;
  103. return 0;
  104. }
  105. HRESULT CInsideCOM::QueryInterface(REFIID riid, void** ppv)
  106. {
  107. if(riid == IID_IUnknown)
  108. *ppv = (ISum*)this;
  109. else if(riid == IID_ISum)
  110. *ppv = (ISum*)this;
  111. else if(riid == IID_IPersistStream)
  112. *ppv = (IPersistStream*)this;
  113. else if(riid == IID_IPersistStreamInit)
  114. *ppv = (IPersistStreamInit*)this;
  115. else 
  116. {
  117. *ppv = NULL;
  118. return E_NOINTERFACE;
  119. }
  120. AddRef();
  121. return S_OK;
  122. }
  123. HRESULT CInsideCOM::SumPersist(int* retval)
  124. {
  125. *retval = m_x + m_y;
  126. char say[255];
  127. wsprintf(say, "ISum::SumPersist x = %d, y = %d, %0x", m_x, m_y, this);
  128. MessageBox(NULL, say, "Test", MB_OK);
  129. return S_OK;
  130. }
  131. HRESULT CInsideCOM::Sum(int x, int y, int* retval)
  132. {
  133. *retval = x + y;
  134. // store values for SumPersist
  135. m_x = x;
  136. m_y = y;
  137. return S_OK;
  138. }
  139. class CFactory : public IClassFactory
  140. {
  141. public:
  142. // IUnknown
  143. ULONG __stdcall AddRef();
  144. ULONG __stdcall Release();
  145. HRESULT __stdcall QueryInterface(REFIID riid, void** ppv);
  146. // IClassFactory
  147. HRESULT __stdcall CreateInstance(IUnknown *pUnknownOuter, REFIID riid, void** ppv);
  148. HRESULT __stdcall LockServer(BOOL bLock);
  149. CFactory() : m_cRef(1) { g_cLocks++; }
  150. ~CFactory() { g_cLocks--; }
  151. private:
  152. ULONG m_cRef;
  153. };
  154. ULONG CFactory::AddRef()
  155. {
  156. cout << "Component: CFactory::AddRef() m_cRef = " << m_cRef + 1 << endl;
  157. return ++m_cRef;
  158. }
  159. ULONG CFactory::Release()
  160. {
  161. cout << "Component: CFactory::Release() m_cRef = " << m_cRef - 1 << endl;
  162. if(--m_cRef != 0)
  163. return m_cRef;
  164. delete this;
  165. return 0;
  166. }
  167. HRESULT CFactory::QueryInterface(REFIID riid, void** ppv)
  168. {
  169. if(riid == IID_IUnknown)
  170. *ppv = (IUnknown*)this;
  171. else if(riid == IID_IClassFactory)
  172. *ppv = (IClassFactory*)this;
  173. else
  174. {
  175. *ppv = NULL;
  176. return E_NOINTERFACE;
  177. }
  178. AddRef();
  179. return S_OK;
  180. }
  181. HRESULT CFactory::CreateInstance(IUnknown *pUnknownOuter, REFIID riid, void** ppv)
  182. {
  183. if(pUnknownOuter != NULL)
  184. return CLASS_E_NOAGGREGATION;
  185. CInsideCOM *pInsideCOM = new CInsideCOM;
  186. if(pInsideCOM == NULL)
  187. return E_OUTOFMEMORY;
  188. // QueryInterface probably for IID_IUnknown
  189. HRESULT hr = pInsideCOM->QueryInterface(riid, ppv);
  190. pInsideCOM->Release();
  191. return hr;
  192. }
  193. HRESULT CFactory::LockServer(BOOL bLock)
  194. {
  195. if(bLock)
  196. g_cLocks++;
  197. else
  198. g_cLocks--;
  199. return S_OK;
  200. }
  201. HRESULT __stdcall DllCanUnloadNow()
  202. {
  203. if(g_cLocks == 0)
  204. return S_OK;
  205. else
  206.     return S_FALSE;
  207. }
  208. HRESULT __stdcall DllGetClassObject(REFCLSID clsid, REFIID riid, void** ppv)
  209. {
  210. if(clsid != CLSID_InsideCOM)
  211. return CLASS_E_CLASSNOTAVAILABLE;
  212. CFactory* pFactory = new CFactory;
  213. if(pFactory == NULL)
  214. return E_OUTOFMEMORY;
  215. // QueryInterface probably for IClassFactory
  216. HRESULT hr = pFactory->QueryInterface(riid, ppv);
  217. pFactory->Release();
  218. return hr;
  219. }
  220. HRESULT __stdcall DllRegisterServer()
  221. {
  222. char DllPath[MAX_PATH];
  223. GetModuleFileName(g_hInstance, DllPath, sizeof(DllPath));
  224. OLECHAR wDllPath[MAX_PATH];
  225. mbstowcs(wDllPath, DllPath, sizeof(wDllPath));
  226. ITypeLib* pTypeLib;
  227. HRESULT hr = LoadTypeLibEx(wDllPath, REGKIND_REGISTER, &pTypeLib);
  228. if(FAILED(hr))
  229. return hr;
  230. pTypeLib->Release();
  231. return RegisterServerEx(g_regData, DllPath);
  232. }
  233. HRESULT __stdcall DllUnregisterServer()
  234. {
  235. UnRegisterTypeLib(LIBID_Component, 1, 0, LANG_NEUTRAL, SYS_WIN32);
  236. return UnregisterServerEx(g_regData);
  237. }
  238. BOOL WINAPI DllMain(HINSTANCE hInstance, DWORD dwReason, void* pv)
  239. {
  240. g_hInstance = hInstance;
  241. return TRUE;
  242. }