NeroBurn.cpp 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450
  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",
  48. majhi, majlo, minhi, minlo);
  49. strcpy(pcNeroFilesPath, "NeroFiles");
  50. strcpy(pcVendor, "nero");
  51. strcpy(pcSoftware, "Nero - Burning Rom");
  52. strcpy(pcLanguageFile, "Nero.txt");
  53. nsSettings.nstNeroFilesPath = pcNeroFilesPath;
  54. nsSettings.nstVendor = pcVendor;
  55. nsSettings.nstIdle.ncCallbackFunction = pDlg->IdleCallback;
  56. nsSettings.nstIdle.ncUserData = pDlg;
  57. nsSettings.nstSoftware = pcSoftware;
  58. nsSettings.nstUserDialog.ncCallbackFunction = pDlg->UserDialog;
  59. nsSettings.nstUserDialog.ncUserData = pDlg;
  60. nsSettings.nstLanguageFile =pcLanguageFile;
  61. // npProgress will be used during the burn process
  62. npProgress.npAbortedCallback = pDlg->AbortedCallback;
  63. npProgress.npAddLogLineCallback = pDlg->AddLogLine;
  64. npProgress.npDisableAbortCallback = NULL;
  65. npProgress.npProgressCallback = pDlg->ProgressCallback;
  66. npProgress.npSetPhaseCallback = pDlg->SetPhaseCallback;
  67. npProgress.npUserData = pDlg;
  68. npProgress.npSetMajorPhaseCallback=NULL;
  69. npProgress.npSubTaskProgressCallback=NULL;
  70. pndiDeviceInfos = NULL;
  71. NEROAPI_INIT_ERROR initErr;
  72. initErr = NeroInit(&nsSettings, NULL);
  73. switch (initErr)
  74. {
  75. case NEROAPI_INIT_OK:
  76. //AppendString("Initialization of the NeroAPI successful.");
  77. break;
  78. case NEROAPI_INIT_INVALID_ARGS:
  79. {
  80. AfxMessageBox("无效的参数, 请与系统管理员联系!", MB_ICONSTOP);
  81. return 0;
  82. }
  83. break;
  84. case NEROAPI_INIT_INVALID_SERIAL_NUM:
  85. {
  86. AfxMessageBox("刻录驱动未正确安装, 请与系统管理员联系!", MB_ICONSTOP);
  87. return 0;
  88. }
  89. break;
  90. default:
  91. {
  92. AfxMessageBox("出现未知错误, 请与系统管理员联系!", MB_ICONSTOP);
  93. return 0;
  94. }
  95. //AppendString("An error occured. The type of error cannot bedetermined.");
  96. break;
  97. }
  98. pndiDeviceInfos = NeroGetAvailableDrivesEx (MEDIA_CD, NULL);
  99. int lgl=1;
  100. if (!pndiDeviceInfos) {
  101. //AppendString("NeroGetAvailableDrives() returned no available devices.");
  102. {
  103. AfxMessageBox("未找到可用的刻录设备, 请与系统管理员联系!", MB_ICONSTOP);
  104. return 0;
  105. }
  106. }
  107. else
  108. {
  109. if (pndiDeviceInfos->nsdisNumDevInfos > 0)
  110. {
  111. //AppendString("Found the following devices:");
  112. for (DWORD dDeviceCounter = 0; dDeviceCounter < pndiDeviceInfos->nsdisNumDevInfos; dDeviceCounter++)
  113. {
  114. //AppendString(pndiDeviceInfos->nsdisDevInfos[dDeviceCounter].nsdiDeviceName);
  115. //int i = m_cbxDevices.AddString(pndiDeviceInfos->nsdisDevInfos[dDeviceCounter].nsdiDeviceName);
  116. //m_cbxDevices.SetItemDataPtr(i, &pndiDeviceInfos->nsdisDevInfos[dDeviceCounter]);
  117. }
  118. //m_cbxDevices.SelectString(-1, pndiDeviceInfos->nsdisDevInfos[0].nsdiDeviceName);
  119. }
  120. else
  121. {
  122. //AppendString("The number of available devices is 0.");
  123. return 0;
  124. }
  125. }
  126. return 1;
  127. }
  128. void CNeroBurn::NeroAPIFree()
  129. {
  130. if (pndiDeviceInfos)
  131. {
  132. NeroFreeMem(pndiDeviceInfos);
  133. }
  134. NeroClearErrors();
  135. NeroDone();
  136. NeroAPIGlueDone();
  137. return;
  138. }
  139. void GetChildArray(CString str, CStringArray *pArray, CStringArray &array)
  140. {
  141. CString dirname=str.Right (str.GetLength ()-str.ReverseFind ('\\')-1);
  142. CString temp;
  143. for(int i=0; i<pArray->GetSize (); i++)
  144. {
  145. temp=pArray->ElementAt (i);
  146. temp=temp.Left (temp.ReverseFind ('\\'));
  147. if(temp==str)
  148. array.Add (pArray->ElementAt (i));
  149. }
  150. }
  151. void GetChildPhotoArray(CString str, CStringArray *pArray, CStringArray &array)
  152. {
  153. // AfxMessageBox(str);
  154. CString temp;
  155. for(int i=0; i<pArray->GetSize (); i++)
  156. {
  157. temp=pArray->ElementAt (i);
  158. temp=temp.Left (temp.ReverseFind ('\\'));
  159. if(temp==str)
  160. {
  161. array.Add (pArray->ElementAt (i));
  162. /// AfxMessageBox(pArray->ElementAt (i));
  163. }
  164. }
  165. }
  166. void CNeroBurn::NeroAPIBurn()
  167. {
  168. for(int 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. for(int nn=0; nn<dircount+photocount; nn++)
  333. {
  334. NERO_ISO_ITEM *pMniiFile=new NERO_ISO_ITEM;
  335. m_photoMniiArray.Add(pMniiFile);
  336. m_nameArray.Add("");
  337. }
  338. int realpos=0;
  339. for( nn=0; nn<childdirarray.GetSize (); nn++)
  340. {
  341. str=childdirarray.ElementAt (nn);
  342. NERO_ISO_ITEM *pMniiFile=m_photoMniiArray.ElementAt(realpos+oldcount);
  343. m_nameArray.SetAt(realpos+oldcount, str);
  344. strcpy(pMniiFile->fileName,str.Right(str.GetLength()-str.ReverseFind('\\')-1));
  345. strcpy(pMniiFile->sourceFilePath,"c:\\");
  346. pMniiFile->isDirectory=true;
  347. pMniiFile->isReference=false;
  348. pMniiFile->unicodeFileName=NULL;
  349. if(nn==dircount+photocount-1)
  350. {
  351. pMniiFile->nextItem=NULL;
  352. }
  353. else
  354. {
  355. pMniiFile->nextItem=m_photoMniiArray.ElementAt(realpos+oldcount+1);
  356. }
  357. realpos++;
  358. }
  359. for(int j=0; j<childphotoarray.GetSize(); j++)
  360. {
  361. CString path=childphotoarray.ElementAt(j);
  362. NERO_ISO_ITEM *pMniiFile=m_photoMniiArray.ElementAt(realpos+oldcount);
  363. m_nameArray.SetAt(realpos+oldcount, path);
  364. strcpy(pMniiFile->fileName,path.Right(path.GetLength()-path.ReverseFind('\\')-1));
  365. strcpy(pMniiFile->sourceFilePath,path);
  366. pMniiFile->isDirectory=false;
  367. pMniiFile->isReference=false;
  368. pMniiFile->unicodeFileName=NULL;
  369. if(j==photocount-1)
  370. pMniiFile->nextItem=NULL;
  371. else
  372. pMniiFile->nextItem=m_photoMniiArray.ElementAt(realpos+oldcount+1);
  373. realpos++;
  374. }
  375. int pos=GetPosFromName(dirname);
  376. NERO_ISO_ITEM *pMniiFile=m_photoMniiArray.ElementAt(pos);
  377. pMniiFile->subDirFirstItem=m_photoMniiArray.ElementAt(oldcount);
  378. for( nn=0; nn<childdirarray.GetSize (); nn++)
  379. {
  380. JoinDir(childdirarray.ElementAt (nn));
  381. }
  382. }
  383. int CNeroBurn::GetDirPos(CString dir)
  384. {
  385. for(int i=0; i<m_pDir->GetSize(); i++)
  386. {
  387. if(dir==m_pDir->ElementAt(i))
  388. return i;
  389. }
  390. return -1;
  391. }
  392. //imapi.exe
  393. int CNeroBurn::GetPosFromName(CString dirname)
  394. {
  395. for(int i=0; i<m_nameArray.GetSize(); i++)
  396. {
  397. if(dirname==m_nameArray.ElementAt(i))
  398. return i;
  399. }
  400. return -1;
  401. }