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

Windows编程

开发平台:

Visual C++

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