NeroBurn.cpp 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453
  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. int i = 0;
  169. for(/*int*/ i=0; i<m_photoMniiArray.GetSize (); i++)
  170. delete [](m_photoMniiArray.ElementAt (i));
  171. m_photoMniiArray.RemoveAll();
  172. CString str;
  173. for(i=0;i<m_DirArray.GetSize ();i++)
  174. {
  175. NERO_ISO_ITEM *pMniiFile=new NERO_ISO_ITEM;
  176. m_photoMniiArray.Add(pMniiFile);
  177. m_nameArray.Add(m_DirArray.ElementAt(i));
  178. }
  179. for(i=0;i<m_DirArray.GetSize ();i++)
  180. {
  181. NERO_ISO_ITEM *pMniiFile=m_photoMniiArray.ElementAt (i);
  182. /* str=m_DirRealNameArray.ElementAt (i);
  183. str=str.Right(str.GetLength()-str.ReverseFind('\\')-1);
  184. strcpy(pMniiFile->fileName, str);
  185. strcpy(pMniiFile->sourceFilePath,"c:\\");*/
  186. str=m_DirRealNameArray.ElementAt (i);
  187. strcpy(pMniiFile->fileName,str.Right(str.GetLength()-str.ReverseFind('\\')-1));
  188. strcpy(pMniiFile->sourceFilePath,"c:\\");
  189. pMniiFile->isDirectory=true;
  190. pMniiFile->isReference=false;
  191. pMniiFile->unicodeFileName=NULL;
  192. if(i==m_DirArray.GetSize ()-1)
  193. {
  194. pMniiFile->nextItem=NULL;
  195. }
  196. else
  197. {
  198. pMniiFile->nextItem=m_photoMniiArray.ElementAt(i+1);
  199. }
  200. //////////////////////////
  201. pMniiFile->subDirFirstItem=NULL;
  202. //////////////////////////
  203. }
  204. for(i=0;i<m_DirArray.GetSize ();i++)
  205. {
  206. JoinDir(m_DirArray.ElementAt(i));
  207. }
  208. NERO_WRITE_CD writeCD;
  209. memset(&writeCD,0,sizeof(writeCD));
  210. writeCD.nwcdpCDStamp=NULL;
  211. writeCD.nwcdArtist=NULL;
  212. writeCD.nwcdTitle=NULL;
  213. writeCD.nwcdCDExtra=FALSE;
  214. writeCD.nwcdNumTracks=0;
  215. if(m_bDvd)
  216. {
  217. writeCD.nwcdMediaType = MEDIA_DVD_ANY;
  218. }
  219. NERO_SCSI_DEVICE_INFO* nsdiDevice;
  220. /* if (pndiDeviceInfos->nsdisNumDevInfos > 0)
  221. {
  222. CStringArray array;
  223. for (DWORD dDeviceCounter = 0; dDeviceCounter < pndiDeviceInfos->nsdisNumDevInfos; dDeviceCounter++)
  224. array.Add (pndiDeviceInfos->nsdisDevInfos[dDeviceCounter].nsdiDeviceName);
  225. SelBrunDevice dlg;
  226. dlg.pArray=&array;
  227. dlg.DoModal ();
  228. nsdiDevice =(NERO_SCSI_DEVICE_INFO*)&pndiDeviceInfos->nsdisDevInfos[dlg.m_cbxDevices.GetCurSel ()];
  229. }
  230. else*/
  231. nsdiDevice =(NERO_SCSI_DEVICE_INFO*)&pndiDeviceInfos->nsdisDevInfos[0];
  232. ndhDeviceHandle = NeroOpenDevice(nsdiDevice);
  233. if (!ndhDeviceHandle)
  234. {
  235. AfxMessageBox("刻录设备不能打开, 请与系统管理员联系!", MB_ICONSTOP);
  236. NeroWorkError=true;
  237. }
  238. else
  239. {
  240. CString title=g_title+"("+m_name;
  241. title+=")客照";
  242. /*
  243. NERO_ISO_ITEM mniiFile;
  244. strcpy(mniiFile.fileName, "1.png");
  245. strcpy(mniiFile.sourceFilePath, "e:\\1.png");
  246. mniiFile.isDirectory=FALSE;
  247. mniiFile.isReference=FALSE;
  248. mniiFile.unicodeFileName=NULL;
  249. // we only have one item
  250. mniiFile.nextItem=NULL;*/
  251. if(m_bDvd)
  252. writeCD.nwcdIsoTrack = NeroCreateIsoTrackEx(\
  253. m_photoMniiArray.ElementAt(0),title,NCITEF_USE_JOLIET|NCITEF_CREATE_ISO_FS);
  254. else
  255. writeCD.nwcdIsoTrack = NeroCreateIsoTrackEx(\
  256. m_photoMniiArray.ElementAt(0),title,NCITEF_USE_JOLIET);
  257. int iRes;
  258. if(m_bDvd)
  259. iRes= NeroBurn(ndhDeviceHandle, NERO_ISO_AUDIO_MEDIA, &writeCD,
  260. NBF_WRITE|NBF_CLOSE_SESSION, 10, &npProgress);
  261. else
  262. iRes= NeroBurn(ndhDeviceHandle, NERO_ISO_AUDIO_CD, &writeCD,
  263. NBF_WRITE|NBF_CLOSE_SESSION, 0, &npProgress);
  264. //NBF_WRITE|NBF_CLOSE_SESSION
  265. NeroFreeIsoTrack(writeCD.nwcdIsoTrack);
  266. NeroCloseDevice(ndhDeviceHandle);
  267. char* Log = NeroGetErrorLog();
  268. // AfxMessageBox(Log);
  269. switch(iRes)
  270. {
  271. case NEROAPI_BURN_OK:
  272. AfxMessageBox("刻录成功!", MB_ICONINFORMATION);
  273. NeroBurnOK=true;
  274. break;
  275. case NEROAPI_BURN_UNKNOWN_CD_FORMAT:
  276. AfxMessageBox("刻录失败:无效刻录盘格式!", MB_ICONSTOP);
  277. NeroWorkError=true;
  278. //AppendString ("BurnCD() : unknown CD format");
  279. break;
  280. case NEROAPI_BURN_INVALID_DRIVE:
  281. //AppendString ("BurnCD() : invalid drive");
  282. AfxMessageBox("刻录失败:驱动器无效!", MB_ICONSTOP);
  283. NeroWorkError=true;
  284. break;
  285. case NEROAPI_BURN_FAILED:
  286. AfxMessageBox("刻录失败!", MB_ICONSTOP);
  287. NeroWorkError=true;
  288. //AppendString ("BurnCD() : burn failed");
  289. break;
  290. case NEROAPI_BURN_FUNCTION_NOT_ALLOWED:
  291. //AppendString ("BurnCD() : function not allowed");
  292. case NEROAPI_BURN_DRIVE_NOT_ALLOWED:
  293. //AppendString ("BurnCD() : drive not allowed");
  294. AfxMessageBox("刻录失败:刻录驱动未安装正确!", MB_ICONSTOP);
  295. NeroWorkError=true;
  296. break;
  297. default:
  298. AfxMessageBox("刻录失败:未知错误!", MB_ICONSTOP);
  299. NeroWorkError=true;
  300. //AppendString ("BurnCD() : unknown error");
  301. break;
  302. }
  303. }
  304. }
  305. void CNeroBurn::JoinDir(CString dirname)
  306. {
  307. CString str;
  308. if(GetPosFromName(dirname)==-1)
  309. {//把根目录加进去
  310. NERO_ISO_ITEM *pMniiFile=new NERO_ISO_ITEM;
  311. m_photoMniiArray.Add(pMniiFile);
  312. m_nameArray.Add(dirname);
  313. str=dirname;
  314. strcpy(pMniiFile->fileName,str.Right(str.GetLength()-str.ReverseFind('\\')-1));
  315. strcpy(pMniiFile->sourceFilePath,"c:\\");
  316. pMniiFile->isDirectory=true;
  317. pMniiFile->isReference=false;
  318. pMniiFile->unicodeFileName=NULL;
  319. pMniiFile->nextItem=NULL;
  320. }
  321. CStringArray childdirarray;
  322. CStringArray childphotoarray;
  323. GetChildArray(dirname, m_pDir, childdirarray);
  324. GetChildPhotoArray(dirname, &(m_pPhotoArray[GetDirPos(dirname)]), childphotoarray);
  325. int dircount=childdirarray.GetSize ();
  326. int photocount=childphotoarray.GetSize ();
  327. int oldcount=m_photoMniiArray.GetSize();
  328. if( dircount==0 && photocount==0 )
  329. {
  330. NERO_ISO_ITEM *pMniiFile=m_photoMniiArray.ElementAt(GetPosFromName(dirname));
  331. pMniiFile->subDirFirstItem=NULL;return;
  332. }
  333. int nn = 0;
  334. for(/*int*/ nn=0; nn<dircount+photocount; nn++)
  335. {
  336. NERO_ISO_ITEM *pMniiFile=new NERO_ISO_ITEM;
  337. m_photoMniiArray.Add(pMniiFile);
  338. m_nameArray.Add("");
  339. }
  340. int realpos=0;
  341. for( nn=0; nn<childdirarray.GetSize (); nn++)
  342. {
  343. str=childdirarray.ElementAt (nn);
  344. NERO_ISO_ITEM *pMniiFile=m_photoMniiArray.ElementAt(realpos+oldcount);
  345. m_nameArray.SetAt(realpos+oldcount, str);
  346. strcpy(pMniiFile->fileName,str.Right(str.GetLength()-str.ReverseFind('\\')-1));
  347. strcpy(pMniiFile->sourceFilePath,"c:\\");
  348. pMniiFile->isDirectory=true;
  349. pMniiFile->isReference=false;
  350. pMniiFile->unicodeFileName=NULL;
  351. if(nn==dircount+photocount-1)
  352. {
  353. pMniiFile->nextItem=NULL;
  354. }
  355. else
  356. {
  357. pMniiFile->nextItem=m_photoMniiArray.ElementAt(realpos+oldcount+1);
  358. }
  359. realpos++;
  360. }
  361. for(int j=0; j<childphotoarray.GetSize(); j++)
  362. {
  363. CString path=childphotoarray.ElementAt(j);
  364. NERO_ISO_ITEM *pMniiFile=m_photoMniiArray.ElementAt(realpos+oldcount);
  365. m_nameArray.SetAt(realpos+oldcount, path);
  366. strcpy(pMniiFile->fileName,path.Right(path.GetLength()-path.ReverseFind('\\')-1));
  367. strcpy(pMniiFile->sourceFilePath,path);
  368. pMniiFile->isDirectory=false;
  369. pMniiFile->isReference=false;
  370. pMniiFile->unicodeFileName=NULL;
  371. if(j==photocount-1)
  372. pMniiFile->nextItem=NULL;
  373. else
  374. pMniiFile->nextItem=m_photoMniiArray.ElementAt(realpos+oldcount+1);
  375. realpos++;
  376. }
  377. int pos=GetPosFromName(dirname);
  378. NERO_ISO_ITEM *pMniiFile=m_photoMniiArray.ElementAt(pos);
  379. pMniiFile->subDirFirstItem=m_photoMniiArray.ElementAt(oldcount);
  380. for( nn=0; nn<childdirarray.GetSize (); nn++)
  381. {
  382. JoinDir(childdirarray.ElementAt (nn));
  383. }
  384. }
  385. int CNeroBurn::GetDirPos(CString dir)
  386. {
  387. for(int i=0; i<m_pDir->GetSize(); i++)
  388. {
  389. if(dir==m_pDir->ElementAt(i))
  390. return i;
  391. }
  392. return -1;
  393. }
  394. //imapi.exe
  395. int CNeroBurn::GetPosFromName(CString dirname)
  396. {
  397. for(int i=0; i<m_nameArray.GetSize(); i++)
  398. {
  399. if(dirname==m_nameArray.ElementAt(i))
  400. return i;
  401. }
  402. return -1;
  403. }