PidMpeg1.cpp
上传用户:tuheem
上传日期:2007-05-01
资源大小:21889k
文件大小:5k
源码类别:

多媒体编程

开发平台:

Visual C++

  1. // PidMpeg1.cpp : Defines the entry point for the DLL application.
  2. //
  3. #include <streams.h>          // quartz, includes windows
  4. #include <stdio.h>
  5. // Eliminate two expected level 4 warnings from the Microsoft compiler.
  6. // The class does not have an assignment or copy operator, and so cannot
  7. // be passed by value.  This is normal.  This file compiles clean at the
  8. // highest (most picky) warning level (-W4).
  9. #pragma warning(disable: 4511 4512)
  10. #include "CMPEG1Builder.h"
  11. #include <initguid.h>
  12. #include "FltGuids.h"
  13. //
  14. // setup data
  15. // List of class IDs and creator functions for the class factory. This
  16. // provides the link between the OLE entry point in the DLL and an object
  17. // being created. The class factory will call the static CreateInstance
  18. CFactoryTemplate g_Templates[] = 
  19. {
  20.     { 
  21. L"PID MPEG1 Builder",
  22. &CLSID_PID_MPEG1Builder,
  23. CMPEG1Builder::CreateInstance,
  24. NULL,
  25. NULL 
  26. }
  27. };
  28. int g_cTemplates = sizeof(g_Templates) / sizeof(g_Templates[0]);
  29. ////////////////////////////////////////////////////////////////////////
  30. //
  31. // Exported entry points for registration and unregistration 
  32. // (in this case they only call through to default implementations).
  33. //
  34. ////////////////////////////////////////////////////////////////////////
  35. HRESULT RegisterPIDInterface(CLSID  ClsidInterface, 
  36.  LPTSTR strName, 
  37.  CLSID  ClsidDistributor)
  38. {
  39. TCHAR   achKey[MAX_PATH];
  40. TCHAR   achClsidInterface[CHARS_IN_GUID];
  41. TCHAR   achClsidDistributor[CHARS_IN_GUID];
  42. OLECHAR achTemp[CHARS_IN_GUID];
  43. HKEY    hkey, hsubkey;
  44. LONG    lReturn;
  45. HRESULT hr;
  46. hr = StringFromGUID2(ClsidInterface, achTemp, CHARS_IN_GUID);
  47. if (SUCCEEDED(hr))
  48. {
  49. wsprintf(achClsidInterface, "%ls", achTemp);
  50. hr = StringFromGUID2(ClsidDistributor, achTemp, CHARS_IN_GUID);
  51. }
  52. if (FAILED(hr)) return hr;
  53. wsprintf(achClsidDistributor, "%ls", achTemp);
  54. wsprintf(achKey, "Interface\%s", achClsidInterface);
  55. lReturn = RegCreateKey(HKEY_CLASSES_ROOT, achKey, &hkey);
  56. if (ERROR_SUCCESS == lReturn)
  57. {
  58. if (NULL != strName)
  59. {
  60. // Set the interface name
  61. RegSetValue(hkey, NULL, REG_SZ, strName, lstrlen(strName)+1);
  62. }
  63. lReturn = RegCreateKey(hkey, "Distributor", &hsubkey);
  64. if (ERROR_SUCCESS == lReturn)
  65. {
  66. // Set the default value of "Distributor" key
  67. RegSetValue(hsubkey, NULL, REG_SZ, achClsidDistributor, 
  68. lstrlen(achClsidDistributor)+1);
  69. RegCloseKey(hsubkey);
  70. }
  71. RegCloseKey(hkey);
  72. }
  73. return HRESULT_FROM_WIN32(lReturn);
  74. }
  75. HRESULT UnregisterPIDInterface(REFCLSID ClsidInterface)
  76. {
  77. HKEY    hkey;
  78. LONG    lReturn;
  79. HRESULT hr;
  80. TCHAR   achClsidInterface[CHARS_IN_GUID];
  81. OLECHAR achTemp[CHARS_IN_GUID];
  82. // comvert CLSID to OLE string
  83. hr  = StringFromGUID2(ClsidInterface, achTemp, CHARS_IN_GUID);
  84. if (FAILED(hr)) return hr;
  85. // convert OLE string to ANSI (as that's
  86. // all that WIN95 Reg* calls can handle
  87. wsprintf(achClsidInterface, "%ls", achTemp);
  88. // open Interface key
  89. lReturn = RegOpenKeyEx(HKEY_CLASSES_ROOT, TEXT("Interface"), 
  90. 0, MAXIMUM_ALLOWED, &hkey);
  91. if (ERROR_SUCCESS == lReturn)
  92. {
  93. // if successful, eliminate subkey and close
  94. // Interface key
  95. EliminateSubKey(hkey, achClsidInterface);
  96. RegCloseKey(hkey);
  97. }
  98. return HRESULT_FROM_WIN32(lReturn);
  99. }
  100. //
  101. // DllRegisterServer
  102. //
  103. // Exported entry points for registration and unregistration
  104. //
  105. STDAPI DllRegisterServer()
  106. {
  107. HRESULT hr = NOERROR;
  108. // Register as DirectShow Plug-in Distributor
  109. // HKEY_CLASSES_ROOTInterfaceIIDDistributor
  110. hr = RegisterPIDInterface(IID_IMPEG1Builder, TEXT("IMPEG1Builder"), 
  111. CLSID_PID_MPEG1Builder);
  112. if (SUCCEEDED(hr))
  113. {
  114. hr = AMovieDllRegisterServer2(TRUE);
  115. }
  116. return hr;
  117. }
  118. //
  119. // DllUnregisterServer
  120. //
  121. STDAPI DllUnregisterServer()
  122. {
  123. HRESULT hr = NOERROR;
  124. // Remove DirectShow Plug-in Distributor entries
  125. hr = UnregisterPIDInterface(IID_IMPEG1Builder);
  126. if (SUCCEEDED(hr))
  127. {
  128. hr = AMovieDllRegisterServer2(FALSE);
  129. }
  130.     return hr;
  131. }
  132. //
  133. // DllEntryPoint
  134. //
  135. extern "C" BOOL WINAPI DllEntryPoint(HINSTANCE, ULONG, LPVOID);
  136. BOOL APIENTRY DllMain(HANDLE hModule, 
  137.                       DWORD  dwReason, 
  138.                       LPVOID lpReserved)
  139. {
  140. return DllEntryPoint((HINSTANCE)(hModule), dwReason, lpReserved);
  141. }
  142. CUnknown * WINAPI CMPEG1Builder::CreateInstance(LPUNKNOWN lpunk, HRESULT *phr)
  143. {
  144. ASSERT(phr);
  145. // Verify: we only allow filter graph manager to create us!
  146. if (!lpunk)
  147. {
  148. *phr = VFW_E_NEED_OWNER;
  149. return NULL;
  150. }
  151. IGraphBuilder * pGraphBuilder = NULL;
  152. if (FAILED(lpunk->QueryInterface(IID_IGraphBuilder, (void**)&pGraphBuilder)))
  153. {
  154. *phr = E_FAIL;
  155. return NULL;
  156. }
  157. if (pGraphBuilder)
  158. {
  159. pGraphBuilder->Release();
  160. }
  161. // Safe to create our COM object
  162. CUnknown *punk = new CMPEG1Builder(lpunk, phr);
  163. if (punk == NULL)
  164. {
  165. if (phr)
  166. {
  167. *phr = E_OUTOFMEMORY;
  168. }
  169. }
  170. return punk;
  171. }