AutoCAD二次開(kāi)發(fā)程序的自動(dòng)安裝處理
AutoCAD的二次開(kāi)發(fā)主要涉及以下內(nèi)容:(1)編寫(xiě)各種用戶自定義函數(shù)并形成若干LISP、ARX、VLX或ADS文件,以及一些DCL文件。(2)建立符合自己要求的菜單文件,一般可在AutoCAD原菜單文件內(nèi)添加自己的內(nèi)容,對(duì)于AutoCAD2000版本還可增加部分菜單文件,然后經(jīng)交互方式加入到系統(tǒng)中去。(3)在系統(tǒng)的ACAD.LSP或類似文件中加入某些內(nèi)容以便進(jìn)行各種初始化操作,如在啟動(dòng)時(shí)立即裝入一些文件等。(4)通過(guò)系統(tǒng)對(duì)話框設(shè)置某些路徑。這些操作在程序開(kāi)發(fā)成功后向其它AutoCAD系統(tǒng)上安裝應(yīng)用,特別是需要大批安裝時(shí),需要進(jìn)行很多文件檢索、內(nèi)容增刪、子目錄創(chuàng)建、文件拷貝、系統(tǒng)設(shè)置等繁瑣工作,如能令上述工作全部自動(dòng)進(jìn)行,使整個(gè)二次開(kāi)發(fā)程序在無(wú)人干預(yù)的情況下嵌入系統(tǒng),將大大提高工作效率。為此筆者用VC++開(kāi)發(fā)了一套自動(dòng)安裝程序,使原本需要五、六分鐘的人工操作在十幾秒內(nèi)即可自動(dòng)完成。 一、基本思路 整個(gè)安裝程序遵循以下思路: 1) 首先獲得所在機(jī)器AutoCAD2000系統(tǒng)的安裝路徑; 2) 尋找菜單文件AutoCAD2000\\support\\acad.mnu,打開(kāi)文件并將要添加的內(nèi)容加至末尾; 3) 尋找LISP文件AutoCAD2000\\support\\acad2000doc.lsp,打開(kāi)文件并將要添加的內(nèi)容加至末尾; 4) 創(chuàng)建一個(gè)預(yù)先命名的子目錄,將所有二次開(kāi)發(fā)形成的各類文件拷入; 5) 給出信息框,告知安裝成功,如有問(wèn)題則告知安裝失敗。 需要指出的是,在添入acad2000doc.lsp的內(nèi)容中須有如下語(yǔ)句: (command“_menu”(strcat (getvar "menuname") ".mnu")),目的是為了強(qiáng)制執(zhí)行菜單文件裝入命令,將改動(dòng)后的acad.mnu文件編譯后裝入。 另外,在添入acad2000doc.lsp的內(nèi)容中還有一賦值語(yǔ)句,將準(zhǔn)備創(chuàng)建的包含所有二次開(kāi)發(fā)生成文件的子目錄全路徑名賦予一全局變量,以供二次開(kāi)發(fā)程序在需要時(shí)調(diào)用,從而避免了在AutoCAD環(huán)境下交互設(shè)定路徑的麻煩。 境下交互設(shè)定路徑的麻煩。 二、實(shí)現(xiàn)方式及關(guān)鍵函數(shù) 為獲得AutoCAD2000的安裝路徑,需要利用WINDOWS系統(tǒng)注冊(cè)表的有關(guān)功能。 首先通過(guò)RegOpenKey函數(shù)打開(kāi)注冊(cè)表: HKEY hKey; LONGret=RegOpenKey( HKEY_LOCAL_MACHINE, "Software\\Autodesk\\AutoCAD\\R14.0\\ACAD-1:804", &hKey); 其中第一參數(shù)HKEY_LOCAL-MACHINE為注冊(cè)表中預(yù)定義的主鍵句柄,第二參數(shù)為注冊(cè)表中HKEY_LOCAL_M(jìn)ACHINE下的子鍵內(nèi)容,第三參數(shù)hKey將返回一子鍵句柄,用于接下來(lái)的鍵值查詢。若該函數(shù)運(yùn)行成功,將返回一長(zhǎng)整型數(shù)ERROR_SUCCESS。 接下來(lái)利用RegQueryValueEx函數(shù)進(jìn)行鍵值查詢: DWORD dwType=REG_SZ; BYTE szData[100]; DWORD dwSize=sizeof(szData); If (ret=ERROR_SUCCESS) ret=RegQueryValueEx(hKey, "AcadLocation", 0, &dwType, szData, &dwSize); 其中第一參數(shù)hKey為由RegOpenKey函數(shù)獲得的欲查詢的子鍵句柄;第二參數(shù)“AcadLocation”為欲查詢的鍵值名;第三參數(shù)為保留項(xiàng),要求添0;第四參數(shù)為鍵值數(shù)據(jù)類型;第六參數(shù)為鍵值緩沖器容量;最關(guān)鍵的是第五參數(shù)szData,欲查詢的鍵值結(jié)果將由其帶回,該鍵值即為所需要的AutoCAD2000的安裝路徑。 以上涉及到的有關(guān)注冊(cè)表中主鍵、子鍵、鍵值名、及鍵值的關(guān)系可通過(guò)下列方法由WINDOWS系列注冊(cè)表查出:?jiǎn)螕簟伴_(kāi)始”--“運(yùn)行”--添入“regedit”--“確定”--“HKEY_LOCAL_MACHINE”--“Software”--“Autodesk”--“Autocad”--“R15.0”--“ACAD-1:804”--“AcadLocation”--“e:\autocad2000”。其中的鍵值名“AcadLocation”所對(duì)應(yīng)的鍵值為“e:\autocad2000”,就是AutoCAD2000的安裝路徑,在不同的機(jī)器上可能內(nèi)容不同。 鍵值查詢函數(shù)若運(yùn)行成功,將返回長(zhǎng)整型數(shù)ERROR_SUCCESS。 : char szRootName[100]=\\support\\acad.mnu; if (ret=ERROR_SUCCESS) 1strcat((char*) szData, szRootName); 現(xiàn)在szData中裝有acad.mnu的全路徑,以下操作將打開(kāi)該文件并添入內(nèi)容: HANDLE hfile=CreateFile((char*) szData, GENERIC_READ|GENERIC_WRITE, 0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL); If(hfile!=INVALID_HANDLE_VALUE) { if (0xFFFFFFFF!=SetFilePointer(hfile, 0, NULL, FILE_END)) { char szBuf[1000]="\n***POP12\n**CAM\n[&CAM]\n[->基本參數(shù)]\n[卡盤原點(diǎn)]^c^cchuck_datam\n[換刀原點(diǎn)] ^c^ctool_datam\n[<-毛坯參數(shù)] ^c^cstock\n[工步設(shè)計(jì)] ^c^csteps\n[仿真加工] ^c^csimulation\n[代碼生成] ^c^cgen_code\n[代碼存盤] ^c^ccode_save\n[工藝存盤] ^c^csave_inf\n[工藝裝入] ^c^cload_inf\n[->刀具管理]\n《創(chuàng)建新刀》 ^c^ccreate_new_tool\n[<-刀庫(kù)增刪] ^c^ctool_manage\n"; DWORD dwWrite=0; BRet=WriteFile(hfile, szBuf, Lstrlen(szBuf), &dwWrite, NULL); If (!bRet) Printerror(); } CloseHandle(hfile); } 上述操作中用CreateFile函數(shù)打開(kāi)文件,SetFilePointer函數(shù)將指針移至文件末尾,字符串?dāng)?shù)組szBuf中裝有欲添加的內(nèi)容,以WriteFile函數(shù)寫(xiě)入,PrintError為自編的錯(cuò)誤處理函數(shù)。 以同樣的方法可以找到acad2000doc.lsp文件并添入內(nèi)容。 以下操作將創(chuàng)建一個(gè)名為“C:\hkcam”的子目錄,并將事先準(zhǔn)備好的本程序所在目錄下的所有文件拷貝進(jìn)去: Cstring nam1, nam2; BOOL bCreate=CreateDirectory("C:\\hkcam", NULL);//創(chuàng)建子目錄 CfileFind finder; //創(chuàng)建類對(duì)象 BOOL b Working=finder.FindFile("*.*");//利用類函數(shù)搜索所有文件 While(b Working)//循環(huán)搜索及文件拷貝 { b Working=finder.FindNextFile(); nam1= finder.GetFileName();//獲得文件名 nam2= " c:\\hkcam\\"; nam2=nam2+nam1;//組成全路徑 BOOL bCopy=CopyFile(nam1, nam2, FALSE);//文件拷貝 } 所有操作成功后,以信息框告知: MessageBox( NULL,“安裝成功,請(qǐng)按OK鈕繼續(xù)”,“安裝結(jié)果”,MB_OK); 整個(gè)程序以MFC靜態(tài)鏈接庫(kù)創(chuàng)建。上述所有內(nèi)容可以寫(xiě)入一個(gè)源文件內(nèi),這里稱其為Append.cpp。為使最終執(zhí)行文件盡可能小,應(yīng)刪去程序框架中所有不需要的內(nèi)容。為此,源文件中只保留Append.cpp,Append.rc,及StdAfx.cpp幾項(xiàng);而頭文件中只有Append.h,Resource.h,及StdAfx.h幾項(xiàng)。所定義的唯一派生類為class CappendApp:public CwinApp,置于Append.h之內(nèi)。 三、結(jié)束語(yǔ) 在VC++環(huán)境下利用有關(guān)WINDOWS系統(tǒng)注冊(cè)表操作函數(shù)獲得AutoCAD系統(tǒng)的安裝路徑,從而找出并改寫(xiě)AutoCAD有關(guān)文件;創(chuàng)建子目錄并拷入各種二次開(kāi)發(fā)形成文件,由此實(shí)現(xiàn)了AutoCAD二次開(kāi)發(fā)程序與AutoCAD系統(tǒng)的自動(dòng)銜接與嵌入。文中程序已由實(shí)踐驗(yàn)證,完全可用于AutoCAD二次開(kāi)發(fā)程序的自動(dòng)安裝。 | |
文章版權(quán)歸西部工控xbgk所有,未經(jīng)許可不得轉(zhuǎn)載。