• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>

            牽著老婆滿街逛

            嚴(yán)以律己,寬以待人. 三思而后行.
            GMail/GTalk: yanglinbo#google.com;
            MSN/Email: tx7do#yahoo.com.cn;
            QQ: 3 0 3 3 9 6 9 2 0 .

            resource dll

            resource dll
            許多細(xì)心的人也許已經(jīng)注意到,在VC的集成編譯環(huán)境 (IDE)中有一個功能,你可以選中一個資源,在上面點(diǎn)擊鼠標(biāo)右鍵,選擇Insert Copy,選擇一個不同的Condition。然而我用VC十多年,一直沒有用過這個特性,也從來不知道他是干嗎的。前兩天有個網(wǎng)友問我這個東西是干嗎的,才下決心去研究一下。仔細(xì)研究之后,才發(fā)現(xiàn)他是用于資源DLL的。
            ?
            對于提供國際化解決方案的程序設(shè)計(jì)者而言,根據(jù)用戶地區(qū)設(shè)置來顯示對應(yīng)的語言界面,將是非常有意義的。本文的目的是提供一個step by step的建議,讓沒有做過資源dll的人可以從中受益。由于我也沒做過資源dll,研究這個也就半天時間,因此如果有什么錯誤,也很正常。請發(fā)現(xiàn)錯誤的朋友直接發(fā)郵件給我。對于你的幫助,我將非常感謝。
            ?

            主工程的要求

            對于一個需要使用資源dll實(shí)現(xiàn)國際化的工程,我們必須保證每個展現(xiàn)給用戶的界面元素都必須從資源里獲得。這主要指得是名目繁多的字符串。程序設(shè)計(jì)者喜歡用AfxMessageBox顯示信息。在單語言情況下,這當(dāng)然沒有問題。但是如果是多語言環(huán)境,這樣做就很難控制這個顯示信息和當(dāng)前的區(qū)域設(shè)置匹配。

            ?

            另外,主工程的設(shè)計(jì)應(yīng)該在創(chuàng)建資源dll之前完成。這樣做的原因是,資源dll設(shè)計(jì)很簡單,花不了多少時間。而如果資源的修改,如果沒有正確反映到代碼上,有時候程序會莫名其妙的崩潰了,而你需要花很長的時間來找到原因。我自己的一個例子是:我在icon中插入了一個65535色的圖片,程序一直起不來,后來找了很久才找到原因。如果我們按照普通方式設(shè)計(jì)主工程,并經(jīng)過測試證明他工作正常,此時再做資源dll,就會避免在兩個工程之間調(diào)試并找原因。

            ?

            實(shí)際上對于增量開發(fā)情況,這種資源dll和主工程并存的情況可能難以避免,這時就需要增刪資源特別小心,避免導(dǎo)致錯誤。

            ?

            為了簡化起見,我創(chuàng)建一個缺省的對話框工程來做測試,步驟如下:

            1. 啟動Microsoft Visual Studio 6.0
            2. 點(diǎn)擊File, New
            3. 選擇Microsoft AppWizard(exe)工程,輸入工程名test,點(diǎn)擊OK
            4. 選擇Dialog Based,并在What language would you like your resources in?下選擇中文(此時選擇自己最喜歡的語言即可,我不熟悉英文,就選擇中文了)
            5. 點(diǎn)擊Finish創(chuàng)建工程

            ?創(chuàng)建資源dll工程

            我們可以按照下述步驟創(chuàng)建一個資源DLL:
            ?
            1. 創(chuàng)建一個普通的WIN32 Dynamic-Link Library(這里取名testdll)
            2. 把主工程中的所有資源相關(guān)的文件(rc,rc2,ico等)加入這個dll工程
            3. 點(diǎn)擊菜單Build, Configurations,此時,我們應(yīng)該有Release和Debug兩個配置
            4. 點(diǎn)擊Add按鈕,以Debug為模板創(chuàng)建DebugEN和DebugCN
            5. 重復(fù)上述步驟,以Release為模板,創(chuàng)建ReleaseEN和ReleaseCN
            6. 刪除原來的Debug和Release配置,然后點(diǎn)擊Close退出配置對話框
            7. 按組合鍵ALT+F7彈出Project Settings對話框
            8. 選擇Resources頁
            9. 左側(cè)選擇All Configurations
            10. 在Preprocessor Definitions中添加如下宏AFX_RESOURCE_DLL
            11. 左側(cè)選擇Multiple Configurations,選中DebugEN和ReleaseEN
            12. 重復(fù)第10步,輸入AFX_TARG_ENU宏(這是為美國英語而定義的宏English U.S)
            13. 重復(fù)11,12步,為DebugCN和ReleaseCN添加AFX_TARG_CHS宏(這是為簡體中文的宏Chinese Simplified)
            14. 選擇Link頁,為每個配置指定輸出文件名(我這里分別為testdll_end.dll, testdll_enr.dll, testdll_cnd.dll,testdll_cnr.dll,分別表示英文debug,英文release和中文相關(guān)文件)
            15. 關(guān)閉Project Settings對話框
            16. 選中Resource View
            17. 在每個資源ID上右擊,選擇Insert Copy,改變Language為English(U.S)
            18. 如果為同一種語言你還希望提供根據(jù)某個自定義的宏而選擇不同的界面(如UI模式和Service模式),在Condition中輸入你用以區(qū)分的宏名,如SERVICE_DLL。
            19. 打開每個新創(chuàng)建的資源,根據(jù)自己的需要修改資源(注意:這里只建議修改文字、字體,必須嚴(yán)格保證不刪除任何資源)
            20. 保存修改
            21. 編譯資源DLL

            修改主工程

            由于我們打算用資源dll來提供資源信息,我們必須對主工程做如下修改:
            1. 打開工程
            2. 選擇File View,刪除rc,rc2,ico等和資源密切相關(guān)的文件。resource.h請不要刪除
            3. 在CWinApp中添加一個私有的HMODULE類型的變量m_hResource
            4. 在InitInstance函數(shù)開頭添加如下代碼:
            ?LANGID id = ::GetUserDefaultLangID();
            ?switch(id)
            ?{
            ?case 0x804://中文
            #ifdef _DEBUG
            ?? m_hResource = LoadLibrary(_T("D:\\projects\\testdll\\DebugCN\\testdllcnd.dll"));
            #else
            ?? m_hResource = LoadLibrary(_T("D:\\projects\\testdll\\ReleaseCN\\testdllcnr.dll"));
            #endif
            ?? break;
            default:
            #ifdef _DEBUG
            ?? m_hResource = LoadLibrary(_T("D:\\projects\\testdll\\DebugEN\\testdllend.dll"));
            #else
            ??m_hResource = LoadLibrary(_T("D:\\projects\\testdll\\ReleaseCN\\testdllenr.dll"));
            #endif
            ?}
            ?if(m_hResource == NULL)
            ?{
            ?? return FALSE;
            ?}else{
            ?? AfxSetResourceHandle((HINSTANCE)m_hResource);
            ?}
            ?此后再做一點(diǎn)簡單的調(diào)試,應(yīng)該就可以了。具體調(diào)試,就已經(jīng)超出我這篇文章所能討論的范圍了。

            http://ronaldyan.spaces.msn.com/blog/cns!FA58BC446FBB14B9!107.entry

            posted on 2006-07-03 22:39 楊粼波 閱讀(427) 評論(0)  編輯 收藏 引用 所屬分類: 文章收藏

            国产精品熟女福利久久AV| 日本一区精品久久久久影院| 国内精品久久久久影院网站| 亚洲国产成人精品无码久久久久久综合| 久久av免费天堂小草播放| 国产精品99久久精品爆乳| 99久久精品免费看国产一区二区三区 | 亚洲国产成人久久综合碰| 国产激情久久久久久熟女老人| 99久久成人国产精品免费| 亚洲午夜久久久久久噜噜噜| 日本免费一区二区久久人人澡| 久久99精品综合国产首页| 久久久这里只有精品加勒比| 日韩精品无码久久久久久| 久久久久亚洲精品无码网址| 久久精品国产99久久久| 久久久久无码中| 久久人人爽人人爽人人av东京热 | 久久免费高清视频| 久久国产免费观看精品| 久久人妻少妇嫩草AV蜜桃| 久久久久亚洲av成人无码电影| 成人免费网站久久久| 久久精品国产黑森林| 国内精品人妻无码久久久影院导航| 国产成人精品久久亚洲高清不卡| 蜜桃麻豆www久久国产精品| 人妻少妇久久中文字幕一区二区| 久久九九亚洲精品| 久久人人爽人人爽人人片AV麻豆 | 色婷婷狠狠久久综合五月| 久久天天躁狠狠躁夜夜avapp| 国产成人无码精品久久久性色| 久久久久99精品成人片三人毛片| 久久无码专区国产精品发布| 亚洲国产成人久久精品影视| 99久久这里只精品国产免费| 久久精品一区二区三区中文字幕| 免费观看久久精彩视频| 久久免费视频观看|