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