• <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>

            在VC項目中使用自定義資源



              在VC環境中除了我們所常用的Dialog、Menu和Bitmap等標準資源類型之外,它還支持自定義資源類型(Custom Resource),我們自定義的資源類型能做些什么呢?呵呵,用處多多。
            1. 默認的皮膚壓縮包或語言包。一些支持換膚的軟件特別是一些媒體播放器常常有自定義的皮膚文件(你可以嘗試將Media Player或千千靜聽等軟件的Skins目錄下的文件的擴展名改為.zip,然后使用WinZip打開看一下),但為了防止Skin文件丟失導致軟件無法顯示,他們常常會在EXE文件中內置一套Skin作為默認的皮膚文件。同樣,一些支持多語言的EXE文件中存在默認語言包也是這個道理(當然也可以使用"String Table"資源類型);
            2. 做為一些病毒/木馬程序的寄生方式。如果不小心執行了帶有病毒/木馬的程序,它們會在你運行時釋放出病毒/木馬文件。當然許多病毒是將自身寫入PE文件頭來實現;
            3. 合并EXE與它所需要的DLL文件。出于某些原因程序作者有時可能需要將DLL文件嵌入到可執行的EXE文件中,這可以通過使用自定義資源來實現;
            4. 其它需要在程序中播放一個AVI動畫等等,都可以通過將二進制的數據文件作為自定義資源加入到可執行文件中來實現;

            二、添加

              添加資源時選擇自定義,IDE會為你生成一個新的二進制資源,然后你就可以將你已經存在的二進制文件作為自定義的資源類型導入到項目中來了。

            三、使用

              要使用自定義資源,我們可能要用到的幾個API函數有FindResource、LoadResource和LockResource等,這里每一個函數的返回值分別作為下一個函數的參數,我來簡要介紹一下。

            1. FindResource用來在一個指定的模塊中定位所指定的資源:
              HRSRC FindResource(
                  HMODULE hModule,		//包含所需資源的模塊句柄,如果是程序本身,可以置為NULL
                  LPCTSTR lpName,		//可以是資源名稱或資源ID
                  LPCTSTR lpType		//資源類型,在這里也就是我們自己指定的資源類型
                  );      
            2. LoadResource用來將所指定的資源加載到內存當中;
              HGLOBAL LoadResource(
                  HMODULE hModule,		//模塊句柄,同上
                  HRSRC hResInfo		//需要加載的資源句柄,這里也就是FindResource的返回值
                  );		
            3. LockResource用來鎖定內存中的資源數據塊,它的返回值也就是我們要使用的直系指向資源數據的內存指針;
              LPVOID LockResource(
                  HGLOBAL hResData		//指向內存中要鎖定的資源數據塊,這里也就是LoadResource的返回值
                  );		
              另外我們還需要用SizeofResource來確定資源的尺寸,我們在操作資源時要用到它。在資源使用完畢后我們不需要使用UnlockResource和FreeResource來手動地釋放資源,因為它們都是16位Windows遺留下來的,在Win32中,在使用完畢后系統會自動回收。它們的使用很簡單,大致上是這個樣子的:
            BOOL UseCustomResource()
            {
            //定位我們的自定義資源,這里因為我們是從本模塊定位資源,所以將句柄簡單地置為NULL即可
            HRSRC hRsrc = FindResource(NULL, MAKEINTRESOURCE(ITEMID), TEXT("MyType"));
            if (NULL == hRsrc)
            return FALSE;
            //獲取資源的大小
            DWORD dwSize = SizeofResource(NULL, hRsrc);
            if (0 == dwSize)
            return FALSE;
            //加載資源
            HGLOBAL hGlobal = LoadResource(NULL, hRsrc);
            if (NULL == hGlobal)
            return FALSE;
            //鎖定資源
            LPVOID pBuffer = LockResource(hGlobal);
            if (NULL == pBuffer)
            return FALSE;
            //我們用剛才得到的pBuffer和dwSize來做一些需要的事情。可以直接在內存中使
            //用,也可以寫入到硬盤文件。這里我們簡單的寫入到硬盤文件,如果我們的自定
            //義資源是作為嵌入DLL來應用,情況可能要復雜一些。
            BOOL bRt = FALSE;
            FILE* fp = _tfopen(_T("demo.exe"), _T("wb"));
            if (fp != NULL)
            {
            if (dwSize == fwrite(pBuffer, sizeof(char), dwSize, fp))
            bRt = TRUE;
            fclose(fp);
            }
            //FreeResource(hGlobal);
            return bRt;
            }      
            四、實例

              下面我們準備用自定義資源來做兩件事情:一件是用我們生成的可執行文件的自定義資源中來釋放一個Hello World程序(類似于木馬程序釋放服務端);另一件是從自定義資源中解壓縮一個壓縮包(類似于換膚軟件釋放默認的皮膚文件)。這里我們模擬WinZip的Self-Extractor工具的界面和功能來完成它(呵呵,不過請不要誤會,WinZip嵌入到壓縮包的自解壓工具可不是像我們這樣實現的,這里只是來演示一下從自定義資源解壓縮多個文件的一個過程而已),具體的實現可以參考本文所附帶的源代碼。它最終運行起來大概是這么個樣子:


            圖四 模仿Self-Extractor界面的運行結果

              運行后,點擊"Release"按鈕會在當前目錄下釋放一個Win32版的Hello World程序;點擊"Unzip"按鈕則會在指定目錄釋放本Demo的工程文件及項目的所有源代碼,而編譯這個工程則恰恰得到了上面的可執行文件。

            本工程在WinXP + VC.Net 2003 + WTL7.5環境下編譯并運行通過。

            posted on 2008-04-09 16:16 wrh 閱讀(661) 評論(0)  編輯 收藏 引用

            導航

            <2008年4月>
            303112345
            6789101112
            13141516171819
            20212223242526
            27282930123
            45678910

            統計

            常用鏈接

            留言簿(19)

            隨筆檔案

            文章檔案

            收藏夾

            搜索

            最新評論

            閱讀排行榜

            評論排行榜

            久久精品国产精品亚洲艾草网美妙| 久久精品国产99久久久香蕉| 亚洲国产高清精品线久久| 免费精品久久天干天干| 久久无码人妻一区二区三区午夜| 99久久国产综合精品麻豆| 深夜久久AAAAA级毛片免费看| 久久久精品人妻一区二区三区蜜桃| 久久精品二区| 久久国产色AV免费观看| 久久亚洲精品无码观看不卡| 国内精品久久久久久久coent| 精品久久久噜噜噜久久久| 伊人久久大香线蕉亚洲 | 久久大香萑太香蕉av| 久久久久亚洲AV成人片| 久久亚洲AV永久无码精品| 69SEX久久精品国产麻豆| 久久无码AV一区二区三区| 久久成人影院精品777| 色综合久久久久久久久五月| 一本久久知道综合久久| 日本欧美国产精品第一页久久| 77777亚洲午夜久久多人| 午夜精品久久久久久影视777| 国产亚洲综合久久系列| 色妞色综合久久夜夜| 久久久久亚洲AV无码专区首JN| 人妻系列无码专区久久五月天| 日本精品久久久久中文字幕8| 91精品国产91久久久久久青草| 精品精品国产自在久久高清| 亚洲色大成网站www久久九| 久久久久国产精品嫩草影院| 久久露脸国产精品| 久久亚洲高清综合| 亚洲综合久久久| 国产午夜精品理论片久久影视| 老男人久久青草av高清| 一本色道久久综合亚洲精品| 人妻丰满AV无码久久不卡|