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

Windows编程

开发平台:

Visual C++

  1. // local.cpp
  2. #define _WIN32_DCOM
  3. #include <windows.h>
  4. #include <iostream.h>  // For cout
  5. #include "registry.h"  // For registry functions
  6. #include "Componentcomponent.h" // Generated by MIDL
  7. HANDLE g_hEvent;
  8. class CPrime : public IPrime
  9. {
  10. public:
  11. // IUnknown
  12. ULONG __stdcall AddRef();
  13. ULONG __stdcall Release();
  14. HRESULT __stdcall QueryInterface(REFIID riid, void** ppv);
  15. // IPrime
  16. HRESULT __stdcall GetNextPrime(int* retval);
  17. CPrime(int start_number);
  18. ~CPrime();
  19. private:
  20. long m_cRef;
  21. int m_start_number;
  22. };
  23. void InitiateComponentShutdown()
  24. {
  25. cout << "InitiateComponentShutdown()" << endl;
  26. SetEvent(g_hEvent);
  27. }
  28. CPrime::CPrime(int start_number) : m_cRef(1),  m_start_number(start_number)
  29. {
  30. CoAddRefServerProcess();
  31. }
  32. CPrime::~CPrime()
  33. {
  34. cout << "Component: CPrime::~CPrime()" << endl;
  35. if(CoReleaseServerProcess() == 0)
  36. InitiateComponentShutdown();
  37. }
  38. ULONG CPrime::AddRef()
  39. {
  40. cout << "Component: CPrime::AddRef() m_cRef = " << m_cRef + 1 << endl;
  41. return InterlockedIncrement(&m_cRef);
  42. }
  43. ULONG CPrime::Release()
  44. {
  45. cout << "Component: CPrime::Release() m_cRef = " << m_cRef - 1 << endl;
  46. unsigned cRef = InterlockedDecrement(&m_cRef);
  47. if(cRef != 0)
  48. return cRef;
  49. delete this;
  50. return 0;
  51. }
  52. HRESULT CPrime::QueryInterface(REFIID riid, void** ppv)
  53. {
  54. if(riid == IID_IUnknown)
  55. {
  56. cout << "Component: CPrime::QueryInterface() for IUnknown" << endl;
  57. *ppv = (IUnknown*)this;
  58. }
  59. else if(riid == IID_IPrime)
  60. {
  61. cout << "Component: CInsideCOM::QueryInterface() for IPrime" << endl;
  62. *ppv = (IPrime*)this;
  63. }
  64. else 
  65. {
  66. *ppv = NULL;
  67. return E_NOINTERFACE;
  68. }
  69. AddRef();
  70. return S_OK;
  71. }
  72. bool IsPrime(int TestNumber)
  73. {
  74. int HalfNumber = TestNumber / 2 + 1;
  75. for(int count = 2; count < HalfNumber; count++)
  76. if(TestNumber % count == 0)
  77. return false;
  78. return true;
  79. }
  80. HRESULT CPrime::GetNextPrime(int* retval)
  81. {
  82. cout << "Component: CPrime::GetNextPrime()" << endl;
  83. while(!IsPrime(++m_start_number));
  84. *retval = m_start_number;
  85. return S_OK;
  86. }
  87. class CPrimeFactory : public IPrimeFactory, public IExternalConnection
  88. {
  89. public:
  90. // IUnknown
  91. ULONG __stdcall AddRef();
  92. ULONG __stdcall Release();
  93. HRESULT __stdcall QueryInterface(REFIID riid, void** ppv);
  94. // IPrimeFactory
  95. HRESULT __stdcall CreatePrime(int start_number, IPrime** ppPrime);
  96. // IExternalConnection
  97. DWORD __stdcall AddConnection(DWORD extconn, DWORD dwreserved);
  98. DWORD __stdcall ReleaseConnection(DWORD extconn, DWORD dwreserved, BOOL fLastReleaseCloses);
  99. CPrimeFactory() : m_cRef(1) { }
  100. ~CPrimeFactory() { cout << "Factory destructor" << endl; }
  101. private:
  102. long m_cRef;
  103. };
  104. ULONG CPrimeFactory::AddRef()
  105. {
  106. cout << "Component: CPrimeFactory::AddRef() m_cRef = " << m_cRef + 1 << endl;
  107. return InterlockedIncrement(&m_cRef);
  108. }
  109. ULONG CPrimeFactory::Release()
  110. {
  111. unsigned cRef = InterlockedDecrement(&m_cRef);
  112. cout << "Component: CPrimeFactory::Release() m_cRef = " << cRef << endl;
  113. if(cRef != 0)
  114. return cRef;
  115. delete this;
  116. return 0;
  117. }
  118. HRESULT CPrimeFactory::QueryInterface(REFIID riid, void** ppv)
  119. {
  120. if(riid == IID_IUnknown)
  121. {
  122. cout << "Component: CPrimeFactory::QueryInteface() for IUnknown or CPrimeFactory" << endl;
  123. *ppv = reinterpret_cast<IUnknown*>(this);
  124. }
  125. else if(riid == IID_IPrimeFactory)
  126. {
  127. cout << "Component: CPrimeFactory::QueryInteface() for IUnknown or CPrimeFactory" << endl;
  128. *ppv = (IPrimeFactory*)this;
  129. }
  130. else if(riid == IID_IExternalConnection)
  131. {
  132. cout << "Component: CPrimeFactory::QueryInteface() for IUnknown or CPrimeFactory" << endl;
  133. *ppv = (IExternalConnection*)this;
  134. }
  135. else
  136. {
  137. *ppv = NULL;
  138. return E_NOINTERFACE;
  139. }
  140. AddRef();
  141. return S_OK;
  142. }
  143. DWORD CPrimeFactory::AddConnection(DWORD extconn, DWORD dwreserved)
  144. {
  145. cout << "IExternalConnection::AddConnection" << endl;
  146. if(extconn & EXTCONN_STRONG)
  147. return CoAddRefServerProcess();
  148. return 0;
  149. }
  150. DWORD CPrimeFactory::ReleaseConnection(DWORD extconn, DWORD dwreserved, BOOL fLastReleaseCloses)
  151. {
  152. cout << "IExternalConnection::ReleaseConnection" << endl;
  153. if(CoReleaseServerProcess() == 0)
  154. {
  155. InitiateComponentShutdown();
  156. return 0;
  157. }
  158. return 1;
  159. }
  160. HRESULT CPrimeFactory::CreatePrime(int start_number, IPrime** ppPrime)
  161. {
  162. CPrime* pPrime = new CPrime(start_number);
  163. cout << "Component: CPrimeFactory::CreatePrime()" << endl;
  164. if(pPrime == NULL)
  165. return E_OUTOFMEMORY;
  166. HRESULT hr = pPrime->QueryInterface(IID_IPrime, (void**)ppPrime);
  167. pPrime->Release();
  168. return hr;
  169. }
  170. void RegisterComponent()
  171. {
  172. ITypeLib* pTypeLib;
  173. LoadTypeLibEx(L"component.exe", REGKIND_DEFAULT, &pTypeLib);
  174. RegisterServer("component.exe", CLSID_Prime, "Prime Number Sample", "Component.Prime", "Component.Prime.1", NULL);
  175. }
  176. void CommandLineParameters(int argc, char** argv)
  177. {
  178. RegisterComponent();
  179. if(argc < 2)
  180. {
  181. cout << "No parameter, but registered anyway" << endl;
  182. exit(false);
  183. }
  184. char* szToken = strtok(argv[1], "-/"); 
  185. if(_stricmp(szToken, "RegServer") == 0)
  186. {
  187. RegisterComponent();
  188. cout << "RegServer" << endl;
  189. exit(true);
  190. }
  191. if(_stricmp(szToken, "UnregServer") == 0)
  192. {
  193. UnRegisterTypeLib(LIBID_Component, 1, 0, LANG_NEUTRAL, SYS_WIN32);
  194. UnregisterServer(CLSID_Prime, "Component.Prime", "Component.Prime.1");
  195. cout << "UnregServer" << endl;
  196. exit(true);
  197. }
  198. if(_stricmp(szToken, "Embedding") != 0)
  199. {
  200. cout << "Invalid parameter" << endl;
  201. exit(false);
  202. }
  203. }
  204. void main(int argc, char** argv)
  205. {
  206. CommandLineParameters(argc, argv);
  207. cout << "Component: CoInitializeEx()" << endl;
  208. CoInitializeEx(NULL, COINIT_MULTITHREADED);
  209. IPrimeFactory *pPrimeFactory = new CPrimeFactory();
  210. cout << "Component: CoRegisterClassObject()" << endl;
  211. DWORD dwRegister;
  212. CoRegisterClassObject(CLSID_Prime, pPrimeFactory, CLSCTX_LOCAL_SERVER, REGCLS_MULTIPLEUSE, &dwRegister);
  213. g_hEvent = CreateEvent(NULL, FALSE, FALSE, NULL);
  214. WaitForSingleObject(g_hEvent, INFINITE);
  215. CloseHandle(g_hEvent);
  216. CoRevokeClassObject(dwRegister);
  217. pPrimeFactory->Release();
  218. CoUninitialize();
  219. }