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

Windows编程

开发平台:

Visual C++

  1. // local.cpp
  2. #define _WIN32_DCOM
  3. #include <windows.h>
  4. #include <iostream.h>  // For cout
  5. #include <conio.h>     // For getch
  6. #include "registry.h"  // For registry functions
  7. #include "Componentcomponent.h" // Generated by MIDL
  8. long g_cComponents = 0;
  9. long g_cServerLocks = 0;
  10. HANDLE g_hEvent;
  11. class CInsideCOM : public ISum
  12. {
  13. public:
  14. // IUnknown
  15. ULONG __stdcall AddRef();
  16. ULONG __stdcall Release();
  17. HRESULT __stdcall QueryInterface(REFIID riid, void** ppv);
  18. // ISum
  19. HRESULT __stdcall Sum(long cMax, MYTYPE* myarray);
  20. CInsideCOM() : m_cRef(1) { g_cComponents++; }
  21. ~CInsideCOM() { cout << "Component: CInsideCOM::~CInsideCOM()" << endl, g_cComponents--; }
  22. private:
  23. ULONG m_cRef;
  24. };
  25. ULONG CInsideCOM::AddRef()
  26. {
  27. cout << "Component: CInsideCOM::AddRef() m_cRef = " << m_cRef + 1 << endl;
  28. return ++m_cRef;
  29. }
  30. ULONG CInsideCOM::Release()
  31. {
  32. cout << "Component: CInsideCOM::Release() m_cRef = " << m_cRef - 1 << endl;
  33. if(--m_cRef != 0)
  34. return m_cRef;
  35. SetEvent(g_hEvent); // ADD THIS!!!
  36. delete this;
  37. return 0;
  38. }
  39. HRESULT CInsideCOM::QueryInterface(REFIID riid, void** ppv)
  40. {
  41. if(riid == IID_IUnknown)
  42. {
  43. cout << "Component: CInsideCOM::QueryInterface() for IUnknown returning " << this << endl;
  44. *ppv = reinterpret_cast<IUnknown*>(this);
  45. }
  46. else if(riid == IID_ISum)
  47. {
  48. cout << "Component: CInsideCOM::QueryInterface() for ISum returning " << this << endl;
  49. *ppv = (ISum*)this;
  50. }
  51. else 
  52. {
  53. *ppv = NULL;
  54. return E_NOINTERFACE;
  55. }
  56. AddRef();
  57. return S_OK;
  58. }
  59. HRESULT CInsideCOM::Sum(long cMax, MYTYPE* myarray)
  60. {
  61. for(int i = 0; i < cMax; i++)
  62. cout << "Component: CInsideCOM::Sum() " << myarray[i].a << " + " << myarray[i].b << " = " << myarray[i].a + myarray[i].b << endl;
  63. return S_OK;
  64. }
  65. class CFactory : public IClassFactory
  66. {
  67. public:
  68. // IUnknown
  69. ULONG __stdcall AddRef();
  70. ULONG __stdcall Release();
  71. HRESULT __stdcall QueryInterface(REFIID riid, void** ppv);
  72. // IClassFactory
  73. HRESULT __stdcall CreateInstance(IUnknown *pUnknownOuter, REFIID riid, void** ppv);
  74. HRESULT __stdcall LockServer(BOOL bLock);
  75. CFactory() : m_cRef(1) { }
  76. ~CFactory() { }
  77. private:
  78. ULONG m_cRef;
  79. };
  80. ULONG CFactory::AddRef()
  81. {
  82. cout << "Component: CFactory::AddRef() m_cRef = " << m_cRef + 1 << endl;
  83. return ++m_cRef;
  84. }
  85. ULONG CFactory::Release()
  86. {
  87. cout << "Component: CFactory::Release() m_cRef = " << m_cRef - 1 << endl;
  88. if(--m_cRef != 0)
  89. return m_cRef;
  90. delete this;
  91. return 0;
  92. }
  93. HRESULT CFactory::QueryInterface(REFIID riid, void** ppv)
  94. {
  95. if((riid == IID_IUnknown) || (riid == IID_IClassFactory))
  96. {
  97. cout << "Component: CFactory::QueryInteface() for IUnknown or IClassFactory " << this << endl;
  98. *ppv = (IClassFactory*)this;
  99. }
  100. else
  101. {
  102. *ppv = NULL;
  103. return E_NOINTERFACE;
  104. }
  105. AddRef();
  106. return S_OK;
  107. }
  108. HRESULT CFactory::CreateInstance(IUnknown *pUnknownOuter, REFIID riid, void** ppv)
  109. {
  110. if(pUnknownOuter != NULL)
  111. return CLASS_E_NOAGGREGATION;
  112. CInsideCOM *pInsideCOM = new CInsideCOM;
  113. cout << "Component: CFactory::CreateInstance() " << pInsideCOM << endl;
  114. if(pInsideCOM == NULL)
  115. return E_OUTOFMEMORY;
  116. // QueryInterface probably for IID_IUNKNOWN
  117. HRESULT hr = pInsideCOM->QueryInterface(riid, ppv);
  118. pInsideCOM->Release();
  119. return hr;
  120. }
  121. HRESULT CFactory::LockServer(BOOL bLock)
  122. {
  123. if(bLock)
  124. g_cServerLocks++;
  125. else
  126. g_cServerLocks--;
  127. return S_OK;
  128. }
  129. void RegisterComponent()
  130. {
  131. ITypeLib* pTypeLib;
  132. LoadTypeLibEx(L"component.exe", REGKIND_DEFAULT, &pTypeLib);
  133. RegisterServer("component.exe", CLSID_InsideCOM, "Inside COM+ Sample", "Component.InsideCOM", "Component.InsideCOM.1", NULL);
  134. }
  135. void CommandLineParameters(int argc, char** argv)
  136. {
  137. RegisterComponent();
  138. if(argc < 2)
  139. {
  140. cout << "No parameter, but registered anyway" << endl;
  141. exit(false);
  142. }
  143. char* szToken = strtok(argv[1], "-/"); 
  144. if(_stricmp(szToken, "RegServer") == 0)
  145. {
  146. RegisterComponent();
  147. cout << "RegServer" << endl;
  148. exit(true);
  149. }
  150. if(_stricmp(szToken, "UnregServer") == 0)
  151. {
  152. UnRegisterTypeLib(LIBID_Component, 1, 0, LANG_NEUTRAL, SYS_WIN32);
  153. UnregisterServer(CLSID_InsideCOM, "Component.InsideCOM", "Component.InsideCOM.1");
  154. cout << "UnregServer" << endl;
  155. exit(true);
  156. }
  157. if(_stricmp(szToken, "Embedding") != 0)
  158. {
  159. cout << "Invalid parameter" << endl;
  160. exit(false);
  161. }
  162. }
  163. void main(int argc, char** argv)
  164. {
  165. CommandLineParameters(argc, argv);
  166. cout << "Component: CoInitializeEx()" << endl;
  167. CoInitializeEx(NULL, COINIT_MULTITHREADED);
  168. IClassFactory *pClassFactory = new CFactory();
  169. cout << "Component: CoRegisterClassObject()" << endl;
  170. DWORD dwRegister;
  171. CoRegisterClassObject(CLSID_InsideCOM, pClassFactory, CLSCTX_LOCAL_SERVER, REGCLS_MULTIPLEUSE, &dwRegister);
  172. g_hEvent = CreateEvent(NULL, FALSE, FALSE, NULL);
  173. WaitForSingleObject(g_hEvent, INFINITE);
  174. CoRevokeClassObject(dwRegister);
  175. pClassFactory->Release();
  176. CoUninitialize();
  177. _getch();
  178. }