DiscFormatData.cpp 6.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281
  1. ///////////////////////////////////////////////////////////////////////
  2. // DiscFormatData.cpp
  3. //
  4. // Wrapper for IDiscFormat2Data Interface
  5. //
  6. // Written by Eric Haddan
  7. //
  8. #include "StdAfx.h"
  9. #include "DiscFormatData.h"
  10. #include "DiscRecorder.h"
  11. #include "DiscFormatDataEvent.h"
  12. CDiscFormatData::CDiscFormatData(void)
  13. : m_discFormatData(NULL)
  14. , m_mediaTypesArray(NULL)
  15. , m_hResult(0)
  16. // , m_hNotificationWnd(NULL)
  17. , m_closeMedia(true)
  18. {
  19. }
  20. CDiscFormatData::~CDiscFormatData(void)
  21. {
  22. if (m_discFormatData != NULL)
  23. {
  24. m_discFormatData->Release();
  25. m_discFormatData = NULL;
  26. }
  27. }
  28. ///////////////////////////////////////////////////////////////////////
  29. //
  30. // CDiscFormatData::Initialize()
  31. //
  32. // Description:
  33. // Creates and initializes the IDiscFormat2Data interface
  34. //
  35. bool CDiscFormatData::Initialize(CDiscRecorder* pDiscRecorder, const CString& clientName)
  36. {
  37. ASSERT(m_discFormatData == NULL);
  38. ASSERT(pDiscRecorder != NULL);
  39. if (pDiscRecorder == NULL)
  40. {
  41. m_errorMessage = _T("Error - CDiscFormatData::Initialize - pDiscRecorder is NULL");
  42. return false;
  43. }
  44. //
  45. // Initialize the IDiscFormat2Data Interface
  46. //
  47. m_hResult = CoCreateInstance(__uuidof(MsftDiscFormat2Data), NULL, CLSCTX_INPROC_SERVER,
  48. __uuidof(IDiscFormat2Data), (void**)&m_discFormatData);
  49. if (!SUCCEEDED(m_hResult))
  50. {
  51. m_errorMessage.Format(_T("Unable to Initialize IDiscFormat2Data - Error:0x%08x"), m_hResult);
  52. return false;
  53. }
  54. //
  55. // Setup the Disc Format Information
  56. //
  57. m_hResult = m_discFormatData->get_SupportedMediaTypes(&m_mediaTypesArray); // 获取本系统内所有光驱支持的媒体格式 两个光驱则是罗列两个光驱的所有媒体格式
  58. if (!SUCCEEDED(m_hResult))
  59. {
  60. m_errorMessage.Format(_T("IDiscFormat2Data->get_SupportedMediaTypes Failed - Error:0x%08x"), m_hResult);
  61. return false;
  62. }
  63. //SAFEARRAY* pSafeArray;
  64. m_hResult = pDiscRecorder->GetInterface()->get_SupportedProfiles(&m_mediaTypesArray); // 此时是获取一个光驱的支持媒体格式
  65. if(!SUCCEEDED(m_hResult))
  66. {
  67. m_errorMessage.Format(_T("IDiscRecorder2->get_SupportedProfiles Failed - Error:0x%08x"), m_hResult);
  68. return false;
  69. }
  70. VARIANT_BOOL isSupported = VARIANT_FALSE;
  71. m_hResult = m_discFormatData->IsRecorderSupported(pDiscRecorder->GetInterface(), &isSupported); // 具体含义不清楚,只知道,如果是支持刻录的,将返回Supported,否则不支持
  72. if (isSupported == VARIANT_FALSE)
  73. {
  74. m_errorMessage = _T("Recorder not supported\r\n"); // maybe 检索刻录机是否支持刻录 数据流 形式的数据
  75. return false;
  76. }
  77. m_hResult = m_discFormatData->put_Recorder(pDiscRecorder->GetInterface());
  78. if (!SUCCEEDED(m_hResult))
  79. {
  80. m_errorMessage.Format(_T("IDiscFormat2Data->put_Recorder Failed - Error:0x%08x"), m_hResult);
  81. DWORD dwLastErr = GetLastError();
  82. return false;
  83. }
  84. m_hResult = m_discFormatData->put_ClientName(clientName.AllocSysString());
  85. if (!SUCCEEDED(m_hResult))
  86. {
  87. m_errorMessage.Format(_T("IDiscFormat2Data->put_ClientName Failed - Error:0x%08x"), m_hResult);
  88. return false;
  89. }
  90. return true;
  91. }
  92. ULONG CDiscFormatData::GetTotalSupportedMediaTypes()
  93. {
  94. if (m_mediaTypesArray == NULL)
  95. return 0;
  96. return m_mediaTypesArray->rgsabound[0].cElements;
  97. }
  98. int CDiscFormatData::GetSupportedMediaType(ULONG index)
  99. {
  100. ASSERT(index < GetTotalSupportedMediaTypes());
  101. if (index < GetTotalSupportedMediaTypes())
  102. {
  103. if (m_mediaTypesArray)
  104. {
  105. return ((VARIANT*)(m_mediaTypesArray->pvData))[index].intVal;
  106. }
  107. }
  108. return 0;
  109. }
  110. bool CDiscFormatData::Burn(HWND hNotificationWnd, IStream* streamData)
  111. {
  112. if (m_discFormatData == NULL)
  113. return false;
  114. // if (hNotificationWnd == NULL)
  115. // return false;
  116. if (streamData == NULL)
  117. return false;
  118. m_streamData = streamData;
  119. // m_hNotificationWnd = hNotificationWnd;
  120. // Create the event sink
  121. CDiscFormatDataEvent* eventSink = CDiscFormatDataEvent::CreateEventSink();
  122. if (eventSink == NULL)
  123. {
  124. m_errorMessage = _T("Unable to create event sink");
  125. return false;
  126. }
  127. if (!eventSink->ConnectDiscFormatData(this))
  128. {
  129. m_errorMessage = _T("Unable to connect event sink with interface");
  130. return false;
  131. }
  132. // eventSink->SetHwnd(m_hNotificationWnd);
  133. // m_discFormatData->put_ForceMediaToBeClosed( VARIANT_TRUE );
  134. m_hResult = m_discFormatData->Write(m_streamData);
  135. delete eventSink;
  136. if (SUCCEEDED(m_hResult))
  137. {
  138. return true;
  139. }
  140. m_errorMessage = GetWriteErrorMsg(m_hResult);
  141. m_errorMessage.Format(_T("IDiscFormat2Data->Write Failed! Error:0x%08x"),
  142. m_hResult);
  143. return false;
  144. }
  145. CString CDiscFormatData::GetWriteErrorMsg(HRESULT hr)
  146. {
  147. CString cstrWriteError;
  148. switch(hr)
  149. {
  150. case 0xC0AA020D:
  151. cstrWriteError = _T("超时");
  152. break;
  153. case 0xC0AA02FF:
  154. cstrWriteError = _T("异常或者数据无效");
  155. break;
  156. case 0xC0AA0204:
  157. cstrWriteError = _T("光盘放颠倒了");
  158. break;
  159. case 0xC0AA0205:
  160. cstrWriteError = _T("准备中,稍后可能需要继续调用Write函数");
  161. break;
  162. case 0xC0AA0202:
  163. cstrWriteError = _T("光驱中无光盘");
  164. break;
  165. case 0xC0AA0206:
  166. cstrWriteError = _T("media正在格式化,请稍等");
  167. break;
  168. case 0xC0AA0207:
  169. cstrWriteError = _T("光驱可能已经长时间工作,现在需要停止工作一会");
  170. break;
  171. case 0xC0AA0203:
  172. cstrWriteError = _T("光盘不兼容或者未知的物理格式");
  173. break;
  174. case 0xC0AA0201:
  175. cstrWriteError = _T("光驱要求的页模式,应用程序未提供");
  176. break;
  177. case 0xC0AA0208:
  178. cstrWriteError = _T("模式页不支持");
  179. break;
  180. case 0xC0AA0209:
  181. cstrWriteError = _T("光盘写保护");
  182. break;
  183. case 0xC0AA020F:
  184. cstrWriteError = _T("写入的速度不匹配");
  185. break;
  186. case 6:
  187. cstrWriteError = _T("句柄无效");
  188. break;
  189. case 55:
  190. cstrWriteError = _T("网络异常或者光驱被卸载");
  191. break;
  192. case 0xC0AA0210:
  193. cstrWriteError = _T("光驱正在被其他的写入独占"); //
  194. break;
  195. case 0xC0AA0301:
  196. cstrWriteError = _T("光驱报告异常");
  197. break;
  198. case 0xC0AA0003:
  199. cstrWriteError = _T("写入动作没有指定光驱");
  200. break;
  201. case 0x00AA0005:
  202. cstrWriteError = _T("要求的旋转时刻录,光驱不支持");
  203. break;
  204. case 0x00AA0004:
  205. cstrWriteError = _T("要求的刻录速度光驱不支持,光驱已自行调整刻录速度");
  206. break;
  207. case 0x00AA0006:
  208. cstrWriteError = _T("要求的旋转刻录和刻录速度不支持,光驱已经自行匹配");
  209. break;
  210. case 0xC0AA0407:
  211. cstrWriteError = _T("光驱不支持光盘的格式");
  212. break;
  213. case 0xC0AA0002:
  214. cstrWriteError = _T("操作取消");
  215. break;
  216. case 0xC0AA0400:
  217. cstrWriteError = _T("另一个写入操作与此操作冲突"); //
  218. break;
  219. case 0xC0AA0403:
  220. cstrWriteError = _T("提供的IStream大小无效.The size must be a multiple of the sector size, 2048.");
  221. break;
  222. case 0x80070057:
  223. cstrWriteError = _T("一个或多个操作无效");
  224. break;
  225. case 0x80004003:
  226. cstrWriteError = _T("指针无效");
  227. break;
  228. case 0x80004005:
  229. cstrWriteError = _T("未知的失败");
  230. break;
  231. case 0x8007000E:
  232. cstrWriteError = _T("内存不足");
  233. break;
  234. case 0x80004001:
  235. cstrWriteError = _T("未知");
  236. break;
  237. case 0xC0AA0300:
  238. cstrWriteError = _T("The write failed because the drive did not receive data quickly enough to continue writing");
  239. break;
  240. case 0xC0AA020E:
  241. cstrWriteError = _T("DVD设备未找到");
  242. break;
  243. }
  244. CString strTemp;
  245. strTemp .Format(_T(" 错误号:0x%x,"),hr);
  246. cstrWriteError += strTemp;
  247. return cstrWriteError;
  248. }