vc写的工程源代码打包工具
生活随笔
收集整理的這篇文章主要介紹了
vc写的工程源代码打包工具
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
大部分VC編程的朋友都遇到過這種情況:寫過的一大堆工程代碼在硬盤里放著,有時候想找某個工程的源代碼查看都找不到,同時一些不舍得刪又沒多大用的工程放在哪兒也占地方,像我就下載了很多教程的配套源代碼,大小差不多有兩三個多G,放在那兒實在是占地方。而且查看時得一個文件夾一個文件夾的找,太麻煩。所以沒事就借用了Mike Benzinger寫的的CppToHTML轉換代碼,寫了一個將VC工程目錄下的.cpp、.c、.h文件轉換成html網(wǎng)頁文件,同時將工程所需的所有項目文件、源文件、資源文件打包成rar的小工具。通過這個工具轉換之后,再用QuickCHM、EasyCHM或者瑣碎打包工具等等將這些轉換好的html文件或者rar文件編譯成chm幫助文件,即節(jié)省了大量空間(兩個多G的源代碼轉換打包之后只有兩三百來兆,經(jīng)過編譯成chm之后會更小),也方便查看。
?
源代碼打包下載地址:http://download.csdn.net/source/2245312
https://www.sugarsync.com/pf/D737057_194644_70653程序執(zhí)行界面: 轉換打包好后用QuickCHM編譯成的chm文件: 點擊CHM中“源代碼打包”中的rar可以將rar文件下載保存到本地,就跟VCKBase期刊chm版一樣: 以下介紹一下程序中幾個關鍵的地方: 這樣的程序當然用對話框比較方便。編輯好界面并添加好相關的變量:CString m_PrjPath; //用戶所選擇的VC 工程所在文件夾路徑 CString m_SavePath; //用戶選擇的轉換后保存到文件夾的位置 CString m_strShow; //程序執(zhí)行的結果顯示 BOOL m_bConverted; 用戶單擊選擇需轉換的VC++工程文件夾的響應函數(shù)(這個函數(shù)體中查找cpp、h、c文件時用到了唐勝寫的一個查找文件類:CFileFindExt, 具體見源代碼附件): void CVCPrjToHtmlDlg::OnBnClickedLiulan1() {// TODO: 在此添加控件通知處理程序代碼 //顯示選擇文件夾對話框 CString StrFolder;BROWSEINFO bi; memset(&bi, 0, sizeof(BROWSEINFO) );bi.hwndOwner = GetSafeHwnd();bi.ulFlags = BIF_RETURNONLYFSDIRS|BIF_STATUSTEXT;bi.lpszTitle=L"選擇VC工程文件夾";LPITEMIDLIST idl=SHBrowseForFolder(&bi);if(idl==NULL)return;SHGetPathFromIDList(idl,StrFolder.GetBuffer(MAX_PATH));StrFolder.ReleaseBuffer();m_PrjPath=StrFolder;UpdateData(false);//清空文件路徑保存鏈表 for(int i=0;i<m_Array.GetSize();i++){FileInfo* p=(FileInfo*)m_Array.GetAt(i);delete p;}m_Array.RemoveAll();FileHead.m_FileNames.RemoveAll(); //清空三個查找文件對象,準備查找文件 FileCpp.m_FileNames.RemoveAll();FileC.m_FileNames.RemoveAll();FileHead.SearchFiles(StrFolder,0,0,_T("*.h"));//查找三種類型的文件 FileCpp.SearchFiles(StrFolder,0,0,_T("*.cpp"));FileC.SearchFiles(StrFolder,0,0,_T("*.c"));//將查找到的三種類型文件的路徑都加入到一個鏈表中,然后傳遞給一個新建的線程來開始轉換文件 if(FileHead.m_FileNames.GetSize()>0){for(int i=0;i<FileHead.m_FileNames.GetSize();i++){CString str=StrFolder+_T("//")+FileHead.m_FileNames.GetAt(i);FileInfo* p=new FileInfo;p->FileName=FileHead.m_FileNames.GetAt(i);p->Path=str;m_Array.Add((void*)p);}}if(FileCpp.m_FileNames.GetSize()>0){for(int i=0;i<FileCpp.m_FileNames.GetSize();i++){CString str=StrFolder+_T("//")+FileCpp.m_FileNames.GetAt(i);FileInfo* p=new FileInfo;p->FileName=FileCpp.m_FileNames.GetAt(i);p->Path=str;m_Array.Add((void*)p);}}if(FileC.m_FileNames.GetSize()>0){for(int i=0;i<FileC.m_FileNames.GetSize();i++){CString str=StrFolder+_T("//")+FileC.m_FileNames.GetAt(i);FileInfo* p=new FileInfo;p->FileName=FileC.m_FileNames.GetAt(i);p->Path=str;m_Array.Add((void*)p);}}m_bConverted=false; }選擇好工程文件夾以及轉換后保存的位置之后,點擊”開始轉換“按鈕轉換打包: void CVCPrjToHtmlDlg::OnBnClickedConvert() {// TODO: 在此添加控件通知處理程序代碼 UpdateData(true);if(m_PrjPath.IsEmpty()){AfxMessageBox(_T("請先選擇需轉換的工程路徑!"));return;}if(m_SavePath.IsEmpty()){AfxMessageBox(_T("請先選擇保存路徑!"));return;}if(m_bConverted==true){AfxMessageBox(_T("該工程剛剛已經(jīng)轉換過!"));return;}GetDlgItem(IDC_CONVERT)->EnableWindow(false);//禁用”開始轉換"按鈕,以防止用戶誤操作再次打開轉換 m_strShow.Empty();//清空顯示內容 UpdateData(false);CFileStatus status;if(!CFile::GetStatus(m_CurrentFolder+_T("//7z.exe"),status))//利用7z的控制臺程序將工程打包成rar,這里是將運行所需的7z.exe和7z.dll釋放到文件中 {ReleaseEXERes(m_CurrentFolder+_T("//7z.exe"),IDR_7ZEXE,_T("EXE"));}if(!CFile::GetStatus(m_CurrentFolder+_T("//7z.dll"),status)){ReleaseEXERes(m_CurrentFolder+_T("//7z.dll"),IDR_7ZDLL,_T("DLL"));}hThread=CreateThread(NULL,NULL,ConvertThread,LPVOID(this),0,&ThreadID);//開啟轉換線程,轉換需要一定時間,這里為了防止程序出現(xiàn)假死狀況,新開一個線程來轉換 WaitForSingleObject(hThread,IGNORE );m_bConverted=true; }轉換線程函數(shù): DWORD WINAPI ConvertThread(LPVOID lp) {//通過傳遞過來的參數(shù)得到相關變量 CVCPrjToHtmlDlg* pDlg=(CVCPrjToHtmlDlg*)lp;CString m_PrjPath=pDlg->m_PrjPath;CString m_SavePath=pDlg->m_SavePath;int sep=m_PrjPath.ReverseFind('//');CString Path=m_PrjPath.Right(m_PrjPath.GetLength()-sep-1);//for循環(huán)開始轉換文件 for(int i=0;i<pDlg->m_Array.GetSize();i++){FileInfo* p=(FileInfo*)pDlg->m_Array.GetAt(i); CString srcPath=p->Path;CString srcName=p->FileName;CString strTip=_T("正在轉換: ")+srcName;pDlg->SendMessage(NM_UPDATE,1,(LPARAM)&strTip);//向主窗口發(fā)送消息,更新程序執(zhí)行狀況信息 /*一系列的文件路徑處理,為了保證轉換VC工程時相對路徑不變,例如原來的VC工程在“D:/編程開發(fā)/vc++/MFC練習/Test1”中,用戶選擇的路徑是“D:/編程開發(fā)/vc++/MFC練習”,用戶選擇轉換后保存到桌面,則轉換后的文件保存在“C:/Users/Administrator/Desktop/MFC練習/Test1”中,并且將頭文件和cpp文件分開保存,這樣在編譯成chm會更方便查看。假如“D:/編程開發(fā)/vc++/MFC練習”文件夾下還有其他更多的工程,則程序會將它們一起都轉換*/int sp=srcName.ReverseFind('//');if(sp!=-1)srcName=srcName.Right(srcName.GetLength()-sp-1);srcName.MakeLower();srcPath.MakeLower();sp=srcPath.Find(srcName);CString prjName=srcPath;m_PrjPath.MakeLower();prjName.Replace(m_PrjPath+_T("//"),_T(""));//sp=prjName.Find('//'); //prjName=prjName.Left(sp); sp=prjName.ReverseFind('//');prjName=prjName.Left(sp);CString folder;if(srcName.Right(4)==_T(".cpp") || srcName.Right(2)==_T(".c"))folder=m_SavePath+_T("//")+Path+_T("//")+prjName+_T("//")+_T("源文件"); elsefolder=m_SavePath+_T("//")+Path+_T("//")+prjName+_T("//")+_T("頭文件");SHCreateDirectoryExW(NULL,folder,NULL);CString dstPath=folder+_T("//")+srcName+_T(".html");ConvertToHtml(srcPath,dstPath); //調用cpptohtml.h中的ConvertToHtml函數(shù)轉換文件 delete p;}pDlg->m_Array.RemoveAll();//清空路徑鏈表 //查找工程。VC6.0的工程后綴名是dsp,VC7.0(VC2003)、VC8.0(VC2005)等版本的工程后綴名是vcproj。 CFileFindExt Filedsp; CFileFindExt Filevcproj;Filedsp.SearchFiles(m_PrjPath,0,0,_T("*.dsp"));Filevcproj.SearchFiles(m_PrjPath,0,0,_T("*.vcproj"));CString strPack=m_SavePath+_T("//")+Path+_T("//");SHCreateDirectoryExW(NULL,strPack,NULL);CStringArray m_Array;//轉換查找到的工程 for(int i=0;i<Filevcproj.m_FileNames.GetSize();i++){//路徑處理,保證轉換后的rar文件保存到轉好后的相應的工程文件夾內 CString strPath=m_PrjPath+_T("//")+Filevcproj.m_FileNames.GetAt(i);CString strFolder=strPath;CString strName=Filevcproj.m_FileNames.GetAt(i);int sp=strName.ReverseFind('//');if(sp!=-1)strName=strName.Right(strName.GetLength()-sp-1);strName.MakeLower();strFolder.MakeLower();strFolder.Replace(strName,_T(""));if(!pDlg->IsPacked(strFolder,m_Array)){m_Array.Add(strFolder);CString Release=strFolder.Left(strFolder.GetLength()-1);int sep=Release.ReverseFind('//');CString prjName=Release.Right(Release.GetLength()-sep-1);Release=Release.Left(sep);Release+=_T("//Release//");CString tip=_T("正在壓縮工程: ")+prjName+_T(".vcproj");pDlg->SendMessage(NM_UPDATE,1,(LPARAM)&tip);CString prj=strPath;prj.MakeLower();prj.Replace(m_PrjPath+_T("//"),_T(""));int nsp=prj.ReverseFind('//');prj=prj.Left(nsp);CString PackPath=strPack+prj+_T("//")+_T("源文件打包")+_T("//")+prjName+_T(".rar.rar");CFileStatus status;if(CFile::GetStatus(PackPath,status)){CString cs;cs.Format(_T("%d"),i);PackPath=strPack+prj+_T("//")+_T("源文件打包")+_T("//")+prjName+cs+_T(".rar.rar");}//篩選打包到rar中的文件類型,只打包工程所需的文件,其他的臨時文件等一律不打包,減小體積 CString Type=_T(" /"")+strFolder+_T("*//*.cpp/" ");Type+=_T(" /"")+strFolder+_T("*.cpp/" ");Type+=_T(" /"")+strFolder+_T("*.c/" ");Type+=_T(" /"")+strFolder+_T("*//*.c/" ");Type+=_T(" /"")+strFolder+_T("*//*.h/" ");Type+=_T(" /"")+strFolder+_T("*.h/" ");Type+=_T(" /"")+strFolder+_T("*//*.vcproj/" ");Type+=_T(" /"")+strFolder+_T("*.vcproj/" ");Type+=_T(" /"")+strFolder+_T("*//*.rc/" ");Type+=_T(" /"")+strFolder+_T("*.rc/" ");Type+=_T(" /"")+Release+_T("*.exe/" ");Type+=_T(" /"")+Release+_T("*.dll/" ");Type+=_T(" /"")+strFolder+_T("*.exe/" ");Type+=_T(" /"")+strFolder+_T("*.dll/" ");Type+=_T(" /"")+strFolder+_T("*.lib/" ");Type+=_T(" /"")+strFolder+_T("*//*.lib/" ");Type+=_T(" /"")+strFolder+_T("*//release//*.exe/" ");Type+=_T(" /"")+strFolder+_T("*//release//*.dll/" ");Type+=_T(" /"")+strFolder+_T("res///" ");Type+=_T(" /"")+strFolder+_T("*//res///" ");/**/CString cmdLine=_T("7z.exe a /"")+PackPath+_T("/" ")+Type; //構造命令行 STARTUPINFO si;GetStartupInfo(&si);si.dwFlags=STARTF_USESHOWWINDOW|STARTF_USESTDHANDLES;si.wShowWindow=SW_HIDE;PROCESS_INFORMATION ProcessInformation;int ret=CreateProcess(NULL, cmdLine.GetBuffer(),NULL,NULL,1,0,NULL,NULL, &si,&ProcessInformation); //用構造好的命令行打開7z.exe開始打包 WaitForSingleObject(ProcessInformation.hProcess,INFINITE);CloseHandle(ProcessInformation.hProcess);}}for(int i=0;i<Filedsp.m_FileNames.GetSize();i++){CString strPath=m_PrjPath+_T("//")+Filedsp.m_FileNames.GetAt(i);CString strFolder=strPath;CString strName=Filedsp.m_FileNames.GetAt(i);int sp=strName.ReverseFind('//');if(sp!=-1)strName=strName.Right(strName.GetLength()-sp-1);strName.MakeLower();strFolder.MakeLower();strFolder.Replace(strName,_T(""));if(!pDlg->IsPacked(strFolder,m_Array)){m_Array.Add(strFolder);CString Release=strFolder.Left(strFolder.GetLength()-1);int sep=Release.ReverseFind('//');CString prjName=Release.Right(Release.GetLength()-sep-1);CString tip=_T("正在壓縮工程: ")+prjName+_T(".dsp");pDlg->SendMessage(NM_UPDATE,1,(LPARAM)&tip);CString prj=strPath;prj.MakeLower();prj.Replace(m_PrjPath+_T("//"),_T(""));int nsp=prj.ReverseFind('//');prj=prj.Left(nsp);CString PackPath=strPack+prj+_T("//")+_T("源文件打包")+_T("//")+prjName+_T(".rar.rar");CFileStatus status;if(CFile::GetStatus(PackPath,status)){CString cs;cs.Format(_T("%d"),i);PackPath=strPack+prj+_T("//")+_T("源文件打包")+_T("//")+prjName+cs+_T(".rar.rar");}CString Type=_T(" /"")+strFolder+_T("*//*.cpp/" ");Type+=_T(" /"")+strFolder+_T("*.cpp/" ");Type+=_T(" /"")+strFolder+_T("*.c/" ");Type+=_T(" /"")+strFolder+_T("*//*.c/" ");Type+=_T(" /"")+strFolder+_T("*//*.h/" ");Type+=_T(" /"")+strFolder+_T("*.h/" ");Type+=_T(" /"")+strFolder+_T("*//*.dsp/" ");Type+=_T(" /"")+strFolder+_T("*.dsp/" ");Type+=_T(" /"")+strFolder+_T("*//*.dsw/" ");Type+=_T(" /"")+strFolder+_T("*.dsw/" ");Type+=_T(" /"")+strFolder+_T("*//*.clw/" ");Type+=_T(" /"")+strFolder+_T("*.clw/" ");Type+=_T(" /"")+strFolder+_T("*//*.rc/" ");Type+=_T(" /"")+strFolder+_T("*.rc/" ");Type+=_T(" /"")+strFolder+_T("*.exe/" ");Type+=_T(" /"")+strFolder+_T("*.dll/" ");Type+=_T(" /"")+strFolder+_T("*.lib/" ");Type+=_T(" /"")+strFolder+_T("*//*.lib/" ");Type+=_T(" /"")+strFolder+_T("release//*.exe/" ");Type+=_T(" /"")+strFolder+_T("*//release//*.exe/" ");Type+=_T(" /"")+strFolder+_T("release//*.dll/" ");Type+=_T(" /"")+strFolder+_T("*//release//*.dll/" ");Type+=_T(" /"")+strFolder+_T("res///" ");Type+=_T(" /"")+strFolder+_T("*//res///" ");/**/CString cmdLine=_T("7z.exe a /"")+PackPath+_T("/" ")+Type;STARTUPINFO si;GetStartupInfo(&si);si.dwFlags=STARTF_USESHOWWINDOW|STARTF_USESTDHANDLES;si.wShowWindow=SW_HIDE;PROCESS_INFORMATION ProcessInformation;int ret=CreateProcess(NULL, cmdLine.GetBuffer(),NULL,NULL,1,0,NULL,NULL, &si,&ProcessInformation);WaitForSingleObject(ProcessInformation.hProcess,INFINITE);CloseHandle(ProcessInformation.hProcess);}}pDlg->SendMessage(NM_UPDATE,0,0);pDlg->m_bConverted=true;return 0; }主窗口中刷新顯示信息的函數(shù)(不知為何,有時候刷新一會兒之后編輯框中顯示的信息就不動了,很奇怪,一直沒找到原因): LRESULT CVCPrjToHtmlDlg::OnUpdateTips(WPARAM wParam, LPARAM lParam) {UINT nState=(UINT)wParam;if(nState==0){UpdateData(true);GetDlgItem(IDC_CONVERT)->EnableWindow(true);int Len=m_strShow.GetLength();CEdit* pEdit=(CEdit*)GetDlgItem(IDC_SHOW);pEdit->SetSel(Len,Len,0);pEdit->ReplaceSel(_T("/r/n轉換完畢/r/n/r/n1、選擇VC工程所在的路徑/r/n/r/n2、選擇轉換成html后保存的位置/r/n/r/n3、點擊“開始轉換”執(zhí)行轉換/r/n/r/n/r/n"));m_bConverted=true;AfxMessageBox(_T("轉換完畢!"));return 0;}else if(nState==1){UpdateData(true);CString* strText=(CString*)lParam;int Len=m_strShow.GetLength();CEdit* pEdit=(CEdit*)GetDlgItem(IDC_SHOW);pEdit->SetSel(Len,Len,0);pEdit->ReplaceSel(*strText+_T("/r/n"));return 0;} }以上只是程序中幾個關鍵地方的簡單介紹,具體參見源代碼。本程序實際上只負責轉換和打包,最好是配合QuickCHM、EasyCHM或者瑣碎打包工具等等將這些轉換好的html文件和rar文件編譯成chm幫助文件。 由于能力有限程序中可能出現(xiàn)某些bug,哪位朋友發(fā)現(xiàn)后望請留言告知,以待改進,謝謝……總結
以上是生活随笔為你收集整理的vc写的工程源代码打包工具的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: QT的QScrollArea使用详解
- 下一篇: PayPal的一些注意事项