NeroBurn.cpp 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452
  1. // NeroBurn.cpp: implementation of the CNeroBurn class.
  2. //
  3. //////////////////////////////////////////////////////////////////////
  4. //这个类也是类之间相互引用的一个具体的成功的;例子
  5. #include "stdafx.h"
  6. #include "ylgl.h"
  7. #include "NeroDlg.h"
  8. #include "NeroBurn.h"
  9. #include "SelBrunDevice.h"
  10. #ifdef _DEBUG
  11. #undef THIS_FILE
  12. static char THIS_FILE[]=__FILE__;
  13. #define new DEBUG_NEW
  14. #endif
  15. //////////////////////////////////////////////////////////////////////
  16. // Construction/Destruction
  17. //////////////////////////////////////////////////////////////////////
  18. extern CNeroDlg* pDlg;
  19. CNeroBurn::CNeroBurn()
  20. {
  21. NeroBurnOK=false;
  22. NeroWorkError=false;
  23. }
  24. CNeroBurn::~CNeroBurn()
  25. {
  26. NeroAPIFree();
  27. for(int i=0; i<m_photoMniiArray.GetSize (); i++)
  28. delete [](m_photoMniiArray.ElementAt (i));
  29. m_photoMniiArray.RemoveAll();
  30. }
  31. BOOL CNeroBurn::NeroAPIInit()
  32. {
  33. DWORD id=FindAppProcessID("imapi.exe");
  34. if(id!=-1)
  35. {
  36. HANDLE ProcessHandle=OpenProcess(PROCESS_ALL_ACCESS,FALSE,id);
  37. if(ProcessHandle)TerminateProcess(ProcessHandle,0);
  38. }
  39. if(!NeroAPIGlueConnect (NULL))
  40. {
  41. AfxMessageBox("刻录驱动未安装, 请与系统管理员联系!", MB_ICONSTOP);
  42. return 0;
  43. }
  44. WORD majhi, majlo, minhi, minlo;
  45. NeroGetAPIVersionEx(&majhi, &majlo, &minhi, &minlo, NULL);
  46. CString strVersion;
  47. strVersion.Format("NeroAPI version %d.%d.%d.%d",majhi, majlo, minhi, minlo);
  48. strcpy(pcNeroFilesPath, "NeroFiles");
  49. strcpy(pcVendor, "nero");
  50. strcpy(pcSoftware, "Nero - Burning Rom");
  51. strcpy(pcLanguageFile, "Nero.txt");
  52. nsSettings.nstNeroFilesPath = pcNeroFilesPath;
  53. nsSettings.nstVendor = pcVendor;
  54. nsSettings.nstIdle.ncCallbackFunction = (void*)pDlg->IdleCallback;
  55. nsSettings.nstIdle.ncUserData = pDlg;
  56. nsSettings.nstSoftware = pcSoftware;
  57. nsSettings.nstUserDialog.ncCallbackFunction = (void*)pDlg->UserDialog;
  58. nsSettings.nstUserDialog.ncUserData = pDlg;
  59. nsSettings.nstLanguageFile =pcLanguageFile;
  60. // npProgress will be used during the burn process
  61. npProgress.npAbortedCallback = (NERO_ABORTED_CALLBACK)pDlg->AbortedCallback;
  62. npProgress.npAddLogLineCallback = (NERO_ADD_LOG_LINE_CALLBACK)pDlg->AddLogLine;
  63. npProgress.npDisableAbortCallback = NULL;
  64. npProgress.npProgressCallback = (NERO_PROGRESS_CALLBACK)pDlg->ProgressCallback;
  65. npProgress.npSetPhaseCallback = (NERO_SET_PHASE_CALLBACK)pDlg->SetPhaseCallback;
  66. npProgress.npUserData = pDlg;
  67. npProgress.npSetMajorPhaseCallback=NULL;
  68. npProgress.npSubTaskProgressCallback=NULL;
  69. pndiDeviceInfos = NULL;
  70. NEROAPI_INIT_ERROR initErr;
  71. initErr = NeroInit(&nsSettings, NULL);
  72. switch (initErr)
  73. {
  74. case NEROAPI_INIT_OK:
  75. //AppendString("Initialization of the NeroAPI successful.");
  76. break;
  77. case NEROAPI_INIT_INVALID_ARGS:
  78. {
  79. AfxMessageBox("无效的参数, 请与系统管理员联系!", MB_ICONSTOP);
  80. return 0;
  81. }
  82. break;
  83. case NEROAPI_INIT_INVALID_SERIAL_NUM:
  84. {
  85. AfxMessageBox("刻录驱动未正确安装, 请与系统管理员联系!", MB_ICONSTOP);
  86. return 0;
  87. }
  88. break;
  89. default:
  90. {
  91. AfxMessageBox("出现未知错误, 请与系统管理员联系!", MB_ICONSTOP);
  92. return 0;
  93. }
  94. //AppendString("An error occured. The type of error cannot bedetermined.");
  95. break;
  96. }
  97. pndiDeviceInfos = NeroGetAvailableDrivesEx (MEDIA_CD, NULL);
  98. int lgl=1;
  99. if (!pndiDeviceInfos) {
  100. //AppendString("NeroGetAvailableDrives() returned no available devices.");
  101. {
  102. AfxMessageBox("未找到可用的刻录设备, 请与系统管理员联系!", MB_ICONSTOP);
  103. return 0;
  104. }
  105. }
  106. else
  107. {
  108. if (pndiDeviceInfos->nsdisNumDevInfos > 0)
  109. {
  110. //AppendString("Found the following devices:");
  111. for (DWORD dDeviceCounter = 0; dDeviceCounter < pndiDeviceInfos->nsdisNumDevInfos; dDeviceCounter++)
  112. {
  113. //AppendString(pndiDeviceInfos->nsdisDevInfos[dDeviceCounter].nsdiDeviceName);
  114. //int i = m_cbxDevices.AddString(pndiDeviceInfos->nsdisDevInfos[dDeviceCounter].nsdiDeviceName);
  115. //m_cbxDevices.SetItemDataPtr(i, &pndiDeviceInfos->nsdisDevInfos[dDeviceCounter]);
  116. }
  117. //m_cbxDevices.SelectString(-1, pndiDeviceInfos->nsdisDevInfos[0].nsdiDeviceName);
  118. }
  119. else
  120. {
  121. //AppendString("The number of available devices is 0.");
  122. return 0;
  123. }
  124. }
  125. return 1;
  126. }
  127. void CNeroBurn::NeroAPIFree()
  128. {
  129. if (pndiDeviceInfos)
  130. {
  131. NeroFreeMem(pndiDeviceInfos);
  132. }
  133. NeroClearErrors();
  134. NeroDone();
  135. NeroAPIGlueDone();
  136. return;
  137. }
  138. void GetChildArray(CString str, CStringArray *pArray, CStringArray &array)
  139. {
  140. CString dirname=str.Right (str.GetLength ()-str.ReverseFind ('\\')-1);
  141. CString temp;
  142. for(int i=0; i<pArray->GetSize (); i++)
  143. {
  144. temp=pArray->ElementAt (i);
  145. temp=temp.Left (temp.ReverseFind ('\\'));
  146. if(temp==str)
  147. array.Add (pArray->ElementAt (i));
  148. }
  149. }
  150. void GetChildPhotoArray(CString str, CStringArray *pArray, CStringArray &array)
  151. {
  152. // AfxMessageBox(str);
  153. CString temp;
  154. for(int i=0; i<pArray->GetSize (); i++)
  155. {
  156. temp=pArray->ElementAt (i);
  157. temp=temp.Left (temp.ReverseFind ('\\'));
  158. if(temp==str)
  159. {
  160. array.Add (pArray->ElementAt (i));
  161. /// AfxMessageBox(pArray->ElementAt (i));
  162. }
  163. }
  164. }
  165. void CNeroBurn::NeroAPIBurn()
  166. {
  167. int i = 0;
  168. for( i=0; i<m_photoMniiArray.GetSize (); i++)
  169. delete [](m_photoMniiArray.ElementAt (i));
  170. m_photoMniiArray.RemoveAll();
  171. CString str;
  172. for(i=0;i<m_DirArray.GetSize ();i++)
  173. {
  174. NERO_ISO_ITEM *pMniiFile=new NERO_ISO_ITEM;
  175. m_photoMniiArray.Add(pMniiFile);
  176. m_nameArray.Add(m_DirArray.ElementAt(i));
  177. }
  178. for(i=0;i<m_DirArray.GetSize ();i++)
  179. {
  180. NERO_ISO_ITEM *pMniiFile=m_photoMniiArray.ElementAt (i);
  181. /* str=m_DirRealNameArray.ElementAt (i);
  182. str=str.Right(str.GetLength()-str.ReverseFind('\\')-1);
  183. strcpy(pMniiFile->fileName, str);
  184. strcpy(pMniiFile->sourceFilePath,"c:\\");*/
  185. str=m_DirRealNameArray.ElementAt (i);
  186. strcpy(pMniiFile->fileName,str.Right(str.GetLength()-str.ReverseFind('\\')-1));
  187. strcpy(pMniiFile->sourceFilePath,"c:\\");
  188. pMniiFile->isDirectory=true;
  189. pMniiFile->isReference=false;
  190. pMniiFile->unicodeFileName=NULL;
  191. if(i==m_DirArray.GetSize ()-1)
  192. {
  193. pMniiFile->nextItem=NULL;
  194. }
  195. else
  196. {
  197. pMniiFile->nextItem=m_photoMniiArray.ElementAt(i+1);
  198. }
  199. //////////////////////////
  200. pMniiFile->subDirFirstItem=NULL;
  201. //////////////////////////
  202. }
  203. for(i=0;i<m_DirArray.GetSize ();i++)
  204. {
  205. JoinDir(m_DirArray.ElementAt(i));
  206. }
  207. NERO_WRITE_CD writeCD;
  208. memset(&writeCD,0,sizeof(writeCD));
  209. writeCD.nwcdpCDStamp=NULL;
  210. writeCD.nwcdArtist=NULL;
  211. writeCD.nwcdTitle=NULL;
  212. writeCD.nwcdCDExtra=FALSE;
  213. writeCD.nwcdNumTracks=0;
  214. if(m_bDvd)
  215. {
  216. writeCD.nwcdMediaType = MEDIA_DVD_ANY;
  217. }
  218. NERO_SCSI_DEVICE_INFO* nsdiDevice;
  219. /* if (pndiDeviceInfos->nsdisNumDevInfos > 0)
  220. {
  221. CStringArray array;
  222. for (DWORD dDeviceCounter = 0; dDeviceCounter < pndiDeviceInfos->nsdisNumDevInfos; dDeviceCounter++)
  223. array.Add (pndiDeviceInfos->nsdisDevInfos[dDeviceCounter].nsdiDeviceName);
  224. SelBrunDevice dlg;
  225. dlg.pArray=&array;
  226. dlg.DoModal ();
  227. nsdiDevice =(NERO_SCSI_DEVICE_INFO*)&pndiDeviceInfos->nsdisDevInfos[dlg.m_cbxDevices.GetCurSel ()];
  228. }
  229. else*/
  230. nsdiDevice =(NERO_SCSI_DEVICE_INFO*)&pndiDeviceInfos->nsdisDevInfos[0];
  231. ndhDeviceHandle = NeroOpenDevice(nsdiDevice);
  232. if (!ndhDeviceHandle)
  233. {
  234. AfxMessageBox("刻录设备不能打开, 请与系统管理员联系!", MB_ICONSTOP);
  235. NeroWorkError=true;
  236. }
  237. else
  238. {
  239. CString title=g_title+"("+m_name;
  240. title+=")客照";
  241. /*
  242. NERO_ISO_ITEM mniiFile;
  243. strcpy(mniiFile.fileName, "1.png");
  244. strcpy(mniiFile.sourceFilePath, "e:\\1.png");
  245. mniiFile.isDirectory=FALSE;
  246. mniiFile.isReference=FALSE;
  247. mniiFile.unicodeFileName=NULL;
  248. // we only have one item
  249. mniiFile.nextItem=NULL;*/
  250. if(m_bDvd)
  251. writeCD.nwcdIsoTrack = NeroCreateIsoTrackEx(\
  252. m_photoMniiArray.ElementAt(0),title,NCITEF_USE_JOLIET|NCITEF_CREATE_ISO_FS);
  253. else
  254. writeCD.nwcdIsoTrack = NeroCreateIsoTrackEx(\
  255. m_photoMniiArray.ElementAt(0),title,NCITEF_USE_JOLIET);
  256. int iRes;
  257. if(m_bDvd)
  258. iRes= NeroBurn(ndhDeviceHandle, NERO_ISO_AUDIO_MEDIA, &writeCD,
  259. NBF_WRITE|NBF_CLOSE_SESSION, 10, &npProgress);
  260. else
  261. iRes= NeroBurn(ndhDeviceHandle, NERO_ISO_AUDIO_CD, &writeCD,
  262. NBF_WRITE|NBF_CLOSE_SESSION, 0, &npProgress);
  263. //NBF_WRITE|NBF_CLOSE_SESSION
  264. NeroFreeIsoTrack(writeCD.nwcdIsoTrack);
  265. NeroCloseDevice(ndhDeviceHandle);
  266. char* Log = NeroGetErrorLog();
  267. // AfxMessageBox(Log);
  268. switch(iRes)
  269. {
  270. case NEROAPI_BURN_OK:
  271. AfxMessageBox("刻录成功!", MB_ICONINFORMATION);
  272. NeroBurnOK=true;
  273. break;
  274. case NEROAPI_BURN_UNKNOWN_CD_FORMAT:
  275. AfxMessageBox("刻录失败:无效刻录盘格式!", MB_ICONSTOP);
  276. NeroWorkError=true;
  277. //AppendString ("BurnCD() : unknown CD format");
  278. break;
  279. case NEROAPI_BURN_INVALID_DRIVE:
  280. //AppendString ("BurnCD() : invalid drive");
  281. AfxMessageBox("刻录失败:驱动器无效!", MB_ICONSTOP);
  282. NeroWorkError=true;
  283. break;
  284. case NEROAPI_BURN_FAILED:
  285. AfxMessageBox("刻录失败!", MB_ICONSTOP);
  286. NeroWorkError=true;
  287. //AppendString ("BurnCD() : burn failed");
  288. break;
  289. case NEROAPI_BURN_FUNCTION_NOT_ALLOWED:
  290. //AppendString ("BurnCD() : function not allowed");
  291. case NEROAPI_BURN_DRIVE_NOT_ALLOWED:
  292. //AppendString ("BurnCD() : drive not allowed");
  293. AfxMessageBox("刻录失败:刻录驱动未安装正确!", MB_ICONSTOP);
  294. NeroWorkError=true;
  295. break;
  296. default:
  297. AfxMessageBox("刻录失败:未知错误!", MB_ICONSTOP);
  298. NeroWorkError=true;
  299. //AppendString ("BurnCD() : unknown error");
  300. break;
  301. }
  302. }
  303. }
  304. void CNeroBurn::JoinDir(CString dirname)
  305. {
  306. CString str;
  307. if(GetPosFromName(dirname)==-1)
  308. {//把根目录加进去
  309. NERO_ISO_ITEM *pMniiFile=new NERO_ISO_ITEM;
  310. m_photoMniiArray.Add(pMniiFile);
  311. m_nameArray.Add(dirname);
  312. str=dirname;
  313. strcpy(pMniiFile->fileName,str.Right(str.GetLength()-str.ReverseFind('\\')-1));
  314. strcpy(pMniiFile->sourceFilePath,"c:\\");
  315. pMniiFile->isDirectory=true;
  316. pMniiFile->isReference=false;
  317. pMniiFile->unicodeFileName=NULL;
  318. pMniiFile->nextItem=NULL;
  319. }
  320. CStringArray childdirarray;
  321. CStringArray childphotoarray;
  322. GetChildArray(dirname, m_pDir, childdirarray);
  323. GetChildPhotoArray(dirname, &(m_pPhotoArray[GetDirPos(dirname)]), childphotoarray);
  324. int dircount=childdirarray.GetSize ();
  325. int photocount=childphotoarray.GetSize ();
  326. int oldcount=m_photoMniiArray.GetSize();
  327. if( dircount==0 && photocount==0 )
  328. {
  329. NERO_ISO_ITEM *pMniiFile=m_photoMniiArray.ElementAt(GetPosFromName(dirname));
  330. pMniiFile->subDirFirstItem=NULL;return;
  331. }
  332. int nn = 0;
  333. for( nn=0; nn<dircount+photocount; nn++)
  334. {
  335. NERO_ISO_ITEM *pMniiFile=new NERO_ISO_ITEM;
  336. m_photoMniiArray.Add(pMniiFile);
  337. m_nameArray.Add("");
  338. }
  339. int realpos=0;
  340. for( nn=0; nn<childdirarray.GetSize (); nn++)
  341. {
  342. str=childdirarray.ElementAt (nn);
  343. NERO_ISO_ITEM *pMniiFile=m_photoMniiArray.ElementAt(realpos+oldcount);
  344. m_nameArray.SetAt(realpos+oldcount, str);
  345. strcpy(pMniiFile->fileName,str.Right(str.GetLength()-str.ReverseFind('\\')-1));
  346. strcpy(pMniiFile->sourceFilePath,"c:\\");
  347. pMniiFile->isDirectory=true;
  348. pMniiFile->isReference=false;
  349. pMniiFile->unicodeFileName=NULL;
  350. if(nn==dircount+photocount-1)
  351. {
  352. pMniiFile->nextItem=NULL;
  353. }
  354. else
  355. {
  356. pMniiFile->nextItem=m_photoMniiArray.ElementAt(realpos+oldcount+1);
  357. }
  358. realpos++;
  359. }
  360. for(int j=0; j<childphotoarray.GetSize(); j++)
  361. {
  362. CString path=childphotoarray.ElementAt(j);
  363. NERO_ISO_ITEM *pMniiFile=m_photoMniiArray.ElementAt(realpos+oldcount);
  364. m_nameArray.SetAt(realpos+oldcount, path);
  365. strcpy(pMniiFile->fileName,path.Right(path.GetLength()-path.ReverseFind('\\')-1));
  366. strcpy(pMniiFile->sourceFilePath,path);
  367. pMniiFile->isDirectory=false;
  368. pMniiFile->isReference=false;
  369. pMniiFile->unicodeFileName=NULL;
  370. if(j==photocount-1)
  371. pMniiFile->nextItem=NULL;
  372. else
  373. pMniiFile->nextItem=m_photoMniiArray.ElementAt(realpos+oldcount+1);
  374. realpos++;
  375. }
  376. int pos=GetPosFromName(dirname);
  377. NERO_ISO_ITEM *pMniiFile=m_photoMniiArray.ElementAt(pos);
  378. pMniiFile->subDirFirstItem=m_photoMniiArray.ElementAt(oldcount);
  379. for( nn=0; nn<childdirarray.GetSize (); nn++)
  380. {
  381. JoinDir(childdirarray.ElementAt (nn));
  382. }
  383. }
  384. int CNeroBurn::GetDirPos(CString dir)
  385. {
  386. for(int i=0; i<m_pDir->GetSize(); i++)
  387. {
  388. if(dir==m_pDir->ElementAt(i))
  389. return i;
  390. }
  391. return -1;
  392. }
  393. //imapi.exe
  394. int CNeroBurn::GetPosFromName(CString dirname)
  395. {
  396. for(int i=0; i<m_nameArray.GetSize(); i++)
  397. {
  398. if(dirname==m_nameArray.ElementAt(i))
  399. return i;
  400. }
  401. return -1;
  402. }