CompA.cpp
上传用户:biuytresa
上传日期:2007-12-07
资源大小:721k
文件大小:3k
源码类别:

DNA

开发平台:

Visual C++

  1. // CompA.cpp : Defines the entry point for the DLL application.
  2. //
  3. #include "stdafx.h"
  4. #include <comutil.h>
  5. #include <stdio.h>
  6. #include "objbase.h"
  7. #include "olectl.h"
  8. #include "CompA.h"
  9. #include "factory.h"
  10. #include "registry.h"
  11. ULONG    g_LockNumber = 0;
  12. ULONG    g_CompANumber = 0;
  13. HANDLE  g_hModule;
  14. // {16DCB981-BEEB-11d2-B362-00104B08CC22}
  15. extern "C" const GUID CLSID_CompA = 
  16. { 0x16dcb981, 0xbeeb, 0x11d2, 
  17. { 0xb3, 0x62, 0x0, 0x10, 0x4b, 0x8, 0xcc, 0x22 } };
  18. // {16DCB982-BEEB-11d2-B362-00104B08CC22}
  19. extern "C" const GUID IID_SomeInterface = 
  20. { 0x16dcb982, 0xbeeb, 0x11d2, 
  21. { 0xb3, 0x62, 0x0, 0x10, 0x4b, 0x8, 0xcc, 0x22 } };
  22. BOOL APIENTRY DllMain( HANDLE hModule, 
  23.                        DWORD  ul_reason_for_call, 
  24.                        LPVOID lpReserved
  25.  )
  26. {
  27.     g_hModule = hModule;
  28.     return TRUE;
  29. }
  30. extern "C" HRESULT __stdcall DllGetClassObject(const CLSID& clsid, const IID& iid, void **ppv)
  31. {
  32. if (clsid == CLSID_CompA) {
  33. CAFactory *pFactory = new CAFactory;
  34. if (pFactory == NULL) {
  35. return E_OUTOFMEMORY ;
  36. }
  37. HRESULT result = pFactory->QueryInterface(iid, ppv);
  38. return result;
  39. } else {
  40. return CLASS_E_CLASSNOTAVAILABLE;
  41. }
  42. }
  43. extern "C" HRESULT __stdcall DllCanUnloadNow(void)
  44. {
  45. if ((g_CompANumber == 0) && (g_LockNumber == 0))
  46. return S_OK;
  47. else
  48. return S_FALSE;
  49. }
  50. //
  51. // Server registration
  52. //
  53. extern "C" HRESULT __stdcall DllRegisterServer()
  54. {
  55. char szModule[1024];
  56. DWORD dwResult = ::GetModuleFileName((HMODULE)g_hModule, szModule, 1024);
  57. if (dwResult == 0)
  58. return SELFREG_E_CLASS;
  59. return RegisterServer(CLSID_CompA,
  60.                       szModule, 
  61.   "CompA.Object",
  62.   "CompA Component",
  63.   NULL);
  64. }
  65. //
  66. // Server unregistration
  67. //
  68. extern "C" HRESULT __stdcall DllUnregisterServer()
  69. {
  70. return UnregisterServer(CLSID_CompA,
  71.                         "CompA.Object",NULL);
  72. }
  73. // Implemention of class CA
  74. CA::CA (IUnknown *pUnknownOuter)
  75. {
  76. m_Ref = 0;
  77. g_CompANumber ++ ;
  78. m_pUnknownOuter = pUnknownOuter;
  79. }
  80. CA::~CA()
  81. {
  82. }
  83. ULONG CA::NondelegatingAddRef()
  84. {
  85. m_Ref ++;
  86. return  (ULONG) m_Ref;
  87. }
  88. ULONG CA::NondelegationRelease ()
  89. {
  90. m_Ref --;
  91. if (m_Ref == 0 )
  92. {
  93. g_CompANumber -- ; 
  94. delete this;
  95. return 0;
  96. }
  97. return  (ULONG) m_Ref;
  98. }
  99. HRESULT CA::NondelegationQueryInterface(const IID& iid, void **ppv)
  100. {
  101. if ( iid == IID_IUnknown )
  102. {
  103. *ppv = (INondelegatingUnknown *) this ;
  104. ((IUnknown *)(*ppv))->AddRef() ;
  105. } else if ( iid == IID_SomeInterface ) 
  106. {
  107. *ppv = (ISomeInterface *) this ;
  108. ((ISomeInterface *)(*ppv))->AddRef() ;
  109. else
  110. {
  111. *ppv = NULL;
  112. return E_NOINTERFACE ;
  113. }
  114. return S_OK;
  115. }
  116. ULONG CA::AddRef ()
  117. {
  118. if  ( m_pUnknownOuter != NULL )
  119. return m_pUnknownOuter->AddRef();
  120. else
  121. return NondelegatingAddRef();
  122. }
  123. ULONG CA::Release ()
  124. {
  125. if  ( m_pUnknownOuter != NULL )
  126. return m_pUnknownOuter->Release ();
  127. else
  128. return NondelegationRelease();
  129. }
  130. HRESULT CA::QueryInterface(const IID& iid, void **ppv)
  131. {
  132. if  ( m_pUnknownOuter != NULL )
  133. return m_pUnknownOuter->QueryInterface(iid, ppv);
  134. else
  135. return NondelegationQueryInterface(iid, ppv);
  136. }
  137. HRESULT CA::SomeFunction()
  138. {
  139. printf("This is CA::SomeFunction!n");
  140. return S_OK;
  141. }