LCC-Win32介紹
看來我的廢話也夠多的了,,讓我們切入正題。 這個指南是單頁的,,建議你等瀏覽器下載完畢后保存一份拷貝來離線閱讀,。
編譯器的安裝
雖然這些聽起來好像十分的簡單,,但是實際上并不是這個樣子的。編輯器和鏈接器需要你在命令行方式下鍵入你要建立的程序的所有信息,,這將需要你記住大量的命令行參數(shù)和各種各樣的開關(guān),,這時就需要IDE——集成開發(fā)環(huán)境(edit.exe)來提供方便了。 IDE的基本功能是編輯文本,,你可以在這個環(huán)境里編輯程序的源代碼,,但是遠(yuǎn)遠(yuǎn)不止有這個功能。它還給你提供了一個調(diào)用編譯器和鏈接器的簡單方法,,這樣在編譯程序的時候你就不用去記住那么多的命令行參數(shù)了,。 你可以簡單的把Wedit想象成你的控制臺,在這里你可以控制所有的流程,。 好吧,!現(xiàn)在你可以用你的鼠標(biāo)點一下Windows的“開始”按鈕,在程序項的子菜單了尋找“lcc-win32”,,好了嗎,?現(xiàn)在你已經(jīng)準(zhǔn)備好在Lcc-Win32中寫你的第一個程序了。
寫個小程序,! 現(xiàn)在你看到的是一個標(biāo)題為“hello.c”的空白窗口,,輸入下面的代碼: #include <stdio.h> void main (void) 保存我們的小程序,,在“File”菜單中選擇“Save”項,。 現(xiàn)在我們可以編譯這個程序了。選擇“Compiler”菜單中的“Compile hello.c”調(diào)用編譯器,。這時一個新窗口會出現(xiàn)在IDE的底部,,這是信息窗口,當(dāng)編譯器處理完成,,在這個窗口中將會顯示“HELLO.exe build successfully.”,,如果編譯出錯,出錯信息也將會被顯示在這里,。 如果編譯出錯了,,在信息窗口處雙擊信息顯示所在行,在編輯窗口內(nèi)將高亮度顯示出錯代碼行,,仔細(xì)的檢查一下你寫的程序和上面我寫的一樣,,這里需要注意的是C語言是大小寫敏感的程序語言,這意味著“printf”和“Printf”對編譯器是不相同,。 現(xiàn)在你已經(jīng)編譯好了這個程序,,按[Ctrl]+[F5]鍵運行一下,結(jié)果對嗎,?
你肯定不會想要每開發(fā)一個程序都要搜索一下硬盤的,,這種情況下你就要使用工程。 工程是一些編譯器要知曉的建立程序所需要的信息,。這包括程序源文件,、編譯好的文件的存放地點、要編譯為什么類型的可執(zhí)行文件,,一個好的想法是為每一個程序建立一個工程,。 事實上,對于我們的“HelloWorld”程序還是有一個工程的,,Lcc=Win32會為沒有指明工程的程序建立一個缺省的工程,。選擇“Project”菜單的“Erase...”項,Wedit會顯示一個工程列表,,你會看到一個項目叫做“HELLO”,,現(xiàn)在我們毫不留情的刪除它。 與其他的編譯器不同的是,,Lcc-Win32的工程信息不是存儲在硬盤上的,,而是存儲在Windows的注冊表項里,。這使得Wedit可以“記住”所有的工程,甚至于在不同的磁盤上,。但是優(yōu)勢我們也需要清除我們不再使用的工程,,在這種情況下,我們可以把工程信息導(dǎo)出到磁盤上,,然后在IDE中刪除它??匆幌?#8220;Project”菜單的選項,,你就會明白了。 現(xiàn)在你可以試著創(chuàng)建一個“HELLO”工程,。
#include <windows.h> int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) 編譯并運行這個程序,你會看到一個顯示hello信息的窗口,,點ok關(guān)閉退出,。 不幸的是,除了這樣的小之又小的Windows程序,,一般情況下Windows程序是很復(fù)雜的,,現(xiàn)在你已經(jīng)知道了如何創(chuàng)建工程和編譯程序,如果你是一個Windows編程新手,,去找一些有關(guān)的書來看看,,取得必要的基礎(chǔ),一些Windows編程知識在下面的部分是必須的,。 如果你是一個C語言的新手,,那么先好好的學(xué)一段時間再來看這個指南吧!
這就是生成向?qū)б瓿傻墓ぷ?。你可以在它的幫助下快速的生成?yīng)用程序的框架,。這個框架事實上就是一個什么功能也沒有的一個完整的程序,也許可能只是用來顯示一個空窗體,,因為使程序完成具體的功能是你的工作,。 讓我們看一下使用向?qū)Ы⒆詈唵蔚膽?yīng)用程序的處理。 通常,,第一步是創(chuàng)建程序代碼,,然后建立一個工程。在使用向?qū)У哪J较?,你并不需要寫一行代碼,,向?qū)槟憬⑺覀冎苯觼砜唇⒐こ谈鱾€步驟,。 在“Project”菜單下選擇“create”項,,給出項目名稱和路徑,選擇工程類型為“Windows executable”,,當(dāng)Wedit詢問你是否要使用向?qū)В╳izard),,回答“yes”,這樣就進(jìn)入了向?qū)J健? 向?qū)@示一個對話框叫做:“Application characteristics”,,這是向?qū)⒃趹?yīng)用程序中包含的基本特點,,你可以選擇以下情況的一種:單窗口、多窗口和DLL(動態(tài)鏈接庫),,現(xiàn)在我們要創(chuàng)建一個十分簡單的單窗口小應(yīng)用程序,,選擇單窗口類型并確保所有的特性復(fù)選按紐都未被選中,點擊“OK”進(jìn)行處理,。 現(xiàn)在向?qū)⒁崾灸爿斎胄畔⒃O(shè)置主窗口的“類”,,這里所說的“類”和C++中的類是不同的,它是Windows在內(nèi)存中存儲的一個結(jié)構(gòu),用來存儲正確顯示窗口所需要的信息,。最重要的是“回叫函數(shù)”(下面將具體介紹)的名稱,,現(xiàn)在只要簡單接受默認(rèn)的屬性值,點擊“NEXT”進(jìn)行處理,。 這個“Generate code for the main window creation”對話框用來設(shè)定相應(yīng)窗口的信息,。當(dāng)主窗體被創(chuàng)建的時候這些信息會被傳送到相應(yīng)的窗口。在這里你可以改變窗口的標(biāo)題欄的顯示內(nèi)容,,然后點擊“Finish”,。 向?qū)У墓ぷ骶鸵瓿闪耍酉聛淼墓こ虅?chuàng)建工作是通常的一些對編譯器,、鏈接器,、調(diào)試器的一些設(shè)置,這里只要簡單的接受缺省的選項就可以了,。 經(jīng)過上面的步驟,就完成了向?qū)У乃械墓ぷ?,你可以在IDE中看到兩個窗口,,一個是源程序編輯窗,另外的一個是用來定義應(yīng)用程序的主菜單的腳本,。 正象剛剛所說的那樣,,這個程序框架是全功能的,可以通過編譯并運行,,你可以看到一個有菜單的窗口,。唯一可以進(jìn)行的操作是“File”菜單的“Exit”項,你可以使用這個菜單項關(guān)閉這個簡單的窗口,,也可以使用[Ctrl]+[Q]完成同樣的操作,。 現(xiàn)在你可以看一下這個程序的源代碼,你會注意到這個程序比那個“Hello World!”程序復(fù)雜了許多,,我可以告訴你一個小竅門——從源代碼的結(jié)尾開始讀起,,因為通常那里才是一些功能函數(shù)的所在。
使用WeditRes創(chuàng)建資源 的確,WeditRes還是在不斷的完善的過程中,也就是說還沒有開發(fā)完成,。不過它已經(jīng)可以編輯一些手工編輯難以完成的資源了,,比如:菜單和對話框等等。在IDE下調(diào)用WeditRes,,在“Compiler”菜單下選擇“Resources”項,。 如果你正在開發(fā)的程序是用向?qū)傻模敲聪驅(qū)a(chǎn)生一個資源文件,,在這個文件里至少包括菜單資源,,WeditRes會打開這個資源文件,但是它不會找到相應(yīng)的頭文件,你應(yīng)該為它指明頭文件的路徑,。通常是在WeditRes當(dāng)前工作路徑的上一級目錄,。WeditRes要找的文件通常叫做prjnamewiz.h,這里的prjname是你指定的工程的名稱,。經(jīng)過這一步就可以修改工程所用的資源了,。 如果你的程序不是由向?qū)傻模敲碬editRes會提示你輸入資源文件的文件名,,輸入一個名稱后點擊“OK”,,這時WeditRes會說不能打開這個資源文件,沒有關(guān)系,,這是因為這個目錄下的確是沒有資源文件的,,還是在這個對話框中點擊“OK”,然后在“File”菜單中選擇“New”項,,這樣就會為你的工程創(chuàng)建一個新的資源工程,,鍵入一個工程名,一般情況是和應(yīng)用程序的工程名相同,,然后點擊“Validate”,,現(xiàn)在你需要手工在應(yīng)用程序工程列表里添加這個資源文件(一般以“RES”為擴(kuò)展名)。 在這里試舉一例——我們來為我們上面創(chuàng)建的程序創(chuàng)建一個“關(guān)于”對話框資源,。 運行WeditRes,,輸入頭文件的路徑后選擇“Objects”菜單的“New dialog”項,這時WeditRes會顯示一個對話框,,標(biāo)題欄為“Dialog box parameters”,,改變對話框的標(biāo)題為“About this application”或者隨便其它的什么東西,然后在“Identity”(標(biāo)識符)項鍵入一個你喜歡的東西,,比如:“DLG_ABOUT”,,在“standard buttons”選單中選擇“Validate”選項并點擊“OK”關(guān)閉對話框。 你在這個時候應(yīng)該可以看到一個新的對話框和一個浮動的工具條,,在對話框中也應(yīng)該有一個按紐,,你可以用鼠標(biāo)拖動它來重新指定它的位置,,如果你還想改變按紐上顯示的文字——雙擊它打開屬性對話框,或者先選定它,,然后在浮動工具條下改變顯示文字,。 下面我們添加一個靜態(tài)文本標(biāo)簽,在工具條上選擇文本工具,,光標(biāo)形狀變成由一個矩形包圍的指針,,在對話框的窗體上點擊一下,一個包含文本——“Text”——的矩形會出現(xiàn)在你點擊的地方,,可以通過鼠標(biāo)拖動來改變這個文本框的大小,,同樣也可以改變顯示的文本和文本框的位置。 我們還可以在這個對話框中添加其它的裝置,??招姆娇颉嵭姆娇蚝徒M件盒等可以對這個對話框進(jìn)行一些簡單的裝飾,。如果你想要刪除一個裝置,,選定它然后按[Ctrl] + [X],或者選擇“Edit”菜單的“Cut”項,。還可以選擇“Options”菜單的“Test”項測試這個對話框的外觀,。在工具欄里有一個按紐的功能是相同的,就是看起來象一個開關(guān)的那個,,如果想要繼續(xù)編輯這個對話框,只要再次選擇上述選項一次即可,。 編輯完成后在“File”菜單中選擇存盤,,然后關(guān)閉WeditRes,為了顯示這個對話框下面我們必須在程序中包含相應(yīng)的代碼,。 尋找“OnCommand”語句,,在那里肯定有一個switch語句的條件之一是菜單命令“Exit”的(IDM_EXIT),現(xiàn)在我們?yōu)槲覀兊男聦υ捒蛱砑右粋€新的case條件,輸入如下代碼: case IDM_ABOUT: 我們還需要編寫對話框函數(shù),。 BOOL CALLBACK AboutDlgProc (HWND hwnd,UINT msg,WPARAM wParam,LPARAM lParam) 你應(yīng)該已經(jīng)明白了,,由向?qū)砩纱a要簡單得多!現(xiàn)在編譯,、鏈接這個程序,,然后運行它,選擇“Compiler”中的“Execute prj.exe”項,,我們創(chuàng)建的對話框?qū)@示在屏幕上了,。
添加其它類型的資源 在資源創(chuàng)建完后,,你要把它添加到工程的資源描述文件里面去,。如果你是使用向?qū)?chuàng)建的工程。你只須要打開與工程名相同的*.RC文件就可以了,。 如果你沒有使用向?qū)?,那么你只能新?chuàng)建一個RC文件。如果你是使用WeditRes創(chuàng)建的資源,,在建立資源描述文件時有些事情是你必須知道的——必須包含WeditRes資源,,甚至于你并沒有使用任何由WeditRes創(chuàng)建的資源,你完全有可能在后續(xù)的工作中用到,,我建議無論什么情況都應(yīng)該象下面這樣做,。 WeditRes一般要建立三個文件:一個*.DLG文件、一個*.H頭文件和一個*.RES二進(jìn)制資源文件,。DLG文件描述了由WeditRes創(chuàng)建的資源的定義(如:資源串,、菜單和對話框等),H文件是所有資源的符號名的定義,,RES文件是編譯后的二進(jìn)制資源文件,,這個文件將被鏈接到工程最后生成的可執(zhí)行程序中。 資源描述文件(*.RC)的文件名一定要和RES文件的文件名相同,,當(dāng)Lcc-Win32的資源編譯器(lrc.exe)編譯資源時將覆蓋原來的RES文件,。你可以在Wedit中創(chuàng)建資源描述文件,如下: #include <windows.h> 第一行用來包含標(biāo)準(zhǔn)的Windows頭函數(shù),,在這個頭函數(shù)中定義了資源編譯器需要的信息,。 第二行包含由WeditRes產(chǎn)生的資源的符號名的頭文件,我在這里假定你的資源工程名為“resurces”,,可以改為你所定義的名稱,。第三行是WeditRes產(chǎn)生的資源描述文件,這樣不會丟失你已經(jīng)創(chuàng)建了的資源,。 下面你可以向資源描述文件中增加資源,,下面是一個例子: IDI_MYICON ICON myiconfile.ico 這一行定義了圖標(biāo)資源,在使用前,,一定要定義圖標(biāo)的符號名,。比如在“prjwiz.h”文件(或者“resource.h”,如果你沒有使用向?qū)В┲?,如果你沒有定義這個符號名,,那么編譯器將認(rèn)為它是一個字符串名。 添加光標(biāo)或者位圖資源的步驟是相同的,,只要把關(guān)鍵字改為“BITMAP”或者 下面要做的是把資源描述文件包含在工程文件列表中,,當(dāng)下一次你編譯工程,資源編譯器也將編譯這個資源描述文件,,并把產(chǎn)生的二進(jìn)制資源鏈接到執(zhí)行文件內(nèi),。 這樣你可以添加圖標(biāo)、光標(biāo)和位圖資源,,對于其它類型的資源可以使用RCDATA資源方式添加到資源文件內(nèi),,就是一系列的由逗號分隔的數(shù)值信息,這種方式可以使Lcc-Win32的資源編譯器不支持的資源得以添加到資源文件中去,,比如WAV文件等,。
使用非規(guī)格資源 但是這里的麻煩事是LCCLINK,,因為它并不認(rèn)識這些資源,因此也不可能把這些資源鏈接到你的執(zhí)行文件中去,,這和真是個大問題,,你可能不得不使用其它的鏈接器,這意味著可能需要其它類性的入口庫,。 我認(rèn)為這樣做不是一個好的解決方案,,主要的原因是Wedit不是設(shè)計成可以使用其它的鏈接器的,你將不得不在命令行下編譯你的程序,,放棄了Lcc-Win32 IDE提供的全部優(yōu)點,。 但是這里還是有一個可供選擇的方案,,——幸運的是LRC支持RCDATA資源類型,,這種資源類型用來包含二進(jìn)制數(shù)據(jù)類型的資源,使用一系列的數(shù)字列表表示,。 下面是具體的實現(xiàn)方法: 首先你需要轉(zhuǎn)換你要使用的二進(jìn)制文件到有一系列的有逗號分割數(shù)值表示的文本文件,,LRC缺省的認(rèn)為這些數(shù)據(jù)是16位長的,它同時也支持32位長度的整數(shù),,只要在數(shù)值后添加“L”字符就可以了,。 你可以從這里下載做這些工作的轉(zhuǎn)換器: Bin2Txt: 開發(fā)者:Josef Planeta. 十分的靈活方便; 然后一定要在資源數(shù)據(jù)中包含這些整數(shù)列表,,如果你的資源文件沒有使用資源描述文件,,如果你沒有使用向?qū)晒こ蹋@是有很大可能的,。你一定要建立一個資源描述文件,,一般是這個樣子的: #include <windows.h> //basic Windows header file MySound RCDATA 在這個例子中,我們包含了一個叫做“mysound.txt”的文件,,這個文件是由一個WAV文件轉(zhuǎn)換成的數(shù)據(jù)文件,。 要注意當(dāng)前版本的LRC(V981126)在RCDATA資源的大小上是有限制的,如果任何一個數(shù)據(jù)文件大于70Kb,,你有可能得到一個溢出信息(Overflow in resource data),,在未來的版本中可能會有所改進(jìn),但是在目前如果出現(xiàn)了這種情況可能只有使用其它的資源編譯器了,。 使用RCDATA類型定義資源意味著你不能直接的指定PlaySound來播放這些資源,,因為類型是不同的。 解決辦法是手工把這些數(shù)據(jù)讀入內(nèi)存,,下面的代碼說明了在PlaySound時要做的事情: BOOL PlayRcSound (HINSTANCE hInst, LPCTSTR lpszSndName) hr = FindResource (hInst, lpszSndName, RT_RCDATA); 如果你的資源在頭文件中定義有標(biāo)識符,,叫做:ID_MYSOUND,那么調(diào)用函數(shù)的方式應(yīng)該是:
另外,,如果你給出了一個字符串名,,比如:MySound,函數(shù)調(diào)用如下所示:
靜態(tài)庫和動態(tài)庫 靜態(tài)庫包含的代碼在編譯鏈接時將被添加在可執(zhí)行文件中,,它被稱為“靜態(tài)”庫是因為一旦它鏈接到可執(zhí)行文件中,,就將不可改變(除非重新編譯整個程序)。 而動態(tài)鏈接庫不會由編譯器鏈接到可執(zhí)行文件中,,而是在運行時由操作系統(tǒng)鏈接的,,這樣即使你改變了這個庫,也不會使整個可執(zhí)行程序重新編譯,。 靜態(tài)庫的編寫要簡單些,,只要創(chuàng)建一個類型為“Static library (lib)”的新工程,,添加你要在這個靜態(tài)庫中使用的原始資料——函數(shù)、數(shù)據(jù)等等,,編譯后就會得到一個LIB文件,,這個文件里面包括了所有你指定的函數(shù)和數(shù)據(jù)。如果你要使用這些函數(shù)或者數(shù)據(jù),,在“Configuration”對話框中的“Linker”表里的“Additional libraries”項中指定靜態(tài)庫名稱,,通知編譯器把這個靜態(tài)庫鏈接到工程里去,但是千萬不要忘了把你的靜態(tài)庫放到鏈接器能夠找到的地方,,比如:“\lcc\lib”路徑下,。 動態(tài)鏈接庫就有些麻煩了,你要使用兩個文件而不是一個文件:動態(tài)庫本身——DLL文件和關(guān)聯(lián)入口庫——LIB文件,。入口庫是給鏈接器使用的,,簡單的說它使用來哄騙鏈接器的,同時它也包含了使Windows正確的調(diào)用相應(yīng)動態(tài)庫中的函數(shù)的信息,。 而且,,動態(tài)庫的功能可以更加的強大,它有一個LibMain()函數(shù),,在程序每一次調(diào)用它時都要通過它來進(jìn)行初始化的工作,。 要創(chuàng)建一個動態(tài)鏈接庫,你要創(chuàng)建一個DLL工程,,然后你可以使用向?qū)蒐ibMain()函數(shù),。添加你要使用的函數(shù)和數(shù)據(jù),在編譯這個工程后,,你就可以得到DLL庫和接口庫文件,。 如果要使用動態(tài)鏈接庫,象使用靜態(tài)庫一樣,,要將接口庫放在“\lcc\lib”路徑下,,在“Options”對話框中添加這個接口庫。同時也要把DLL文件放置在Windows能夠搜索到的路徑下,,Windows搜索動態(tài)鏈接庫的缺省目錄是“\windows\system\”和應(yīng)用程序的起始目錄,,將動態(tài)鏈接庫放置在這兩個目錄下都是可以的。 |
|