VC自定義資源

pamxy發表於2013-03-29
用到的相關API:
FineResource:查詢一個資源。我們是把相關要生成的檔案載入,就是用這個函式來確定其資源的位置。
SizeofResource:獲得資源的尺寸。
LoadResource:裝載資源,裝入到記憶體中。
LockResource:鎖定資源,在記憶體中鎖定。




好了,現在在VC的工程中載入這個檔案吧。首先,我們把***.exe或者***.mid該成***.bin二進位制檔案,在資原始檔上點選右鍵,選擇Import(匯入)。這裡我們為自定義資源型別,即Custom Resource Type,Resource type為讀者興趣隨便填寫,這裡用MyRes,資源名稱用IDR_MyRes。




好了,現在就可以寫一個函式進行檔案的生成了:
BOOL Create()
{
    HRSRC hResInfo;
    HGLOBAL hResData;
    DWORD dwSize, dwWritten;
    HANDLE hFile;
    //開始所需的資源
    hResInfo = FineResource(NULL,MAKEINTRESOURCE(IDR_MyRes),"MyRes");
    if(hResInfo == NULL)
        return FALSE;
    //獲得資源尺寸
    dwSize = SizeofResource(NULL,hResInfo);
    //裝載
    hResData = LoadResource(NULL,hResInfo);
    if(hResData == NULL)
        return FALSE;
    //最重要的地方,寫檔案
    hFile = CreateFile("c:\\MyResG.exe",GENERIC_WRITE,0,NULL,CREATE_ALWAYS,0,NULL);
    if(hFile == NULL)
        return FALSE;
    WriteFile(hFile,(LPCVOID)LockResource(hResData),dwSize,&dwWritten,NULL);
    CloseHandle(hFile);
    return TRUE;
}
用這個函式就可以把資原始檔的東西拖出來了,哈哈。完工 












midiConnect 將指定的MIDI輸入裝置連線到輸出裝置
  midiDisconnect 斷開MIDI輸入裝置和輸出裝置的連線
  midiInAddBuffer 向指定的音樂儀器數字介面的輸入裝置增加一個緩衝區
  midiInClose 關閉指定的音樂儀器數字介面的輸入裝置
  midiInGetDveCaps 查詢指定的音樂儀器數字介面的輸入裝置,以確定其效能
  midiInGetErrorText 檢取有關音樂儀器數字介面的輸入裝置指定錯誤的文字說明
  midiInGetID 獲得一個音樂一起數字介面的輸入裝置的識別符號
  midiInGetNumDevs 檢取系統中音樂儀器數字介面的輸入裝置的數量
  midiInMessage 向指定的音樂儀器數字介面的輸入裝置驅動器傳送一條訊息
  midiInOpen 開啟指定的音樂儀器數字介面的輸入裝置
  midiInPrepareHeader 為音樂儀器數字介面的輸入裝置準備一個緩衝區
  midiInReset 在給定的MIDI輸入裝置上輸入,並將所有掛起的輸入緩衝區標記為已執行的
  midiInStart 啟動在指定的音樂儀器數字介面的輸入裝置上的輸入
  midiInStop 停止在給定的音樂儀器數字介面的輸入裝置上的輸入
  midiInUnprepareHeader 消除由midiInPrepareHeader函式完成的準備
  midiOutCacheDrumPatches 請求內部的一個MIDI合成裝置預裝指定的基於鍵的擊打音色集
  midiOutCachePatches 請求內部的音樂儀器數字介面的合成裝置預裝指定的音色集
  midiOutClose 關閉指定的音樂儀器數字介面的輸出裝置
  midiOutGetDevCaps 查詢指定的音樂儀器數字介面的輸出裝置,以確定其效能
  midiOutGetErrorText 檢取有關MIDI輸出裝置指定採取的文字說明
  midiOutGetID 檢取指定的MIDI輸出裝置的識別符號
  midiOutGetNumDevs 檢取系統中存在的MIDI輸出裝置的數量
  midiOutGetVolume 返回一個MIDI輸出裝置的當前卷設定
  midiOutLongMsg 向指定的MIDI輸出裝置傳送一條系統專用的MIDI訊息
  midiOutMessage 向一MIDI輸出裝置驅動器傳送一條訊息
  midiOutOpen 開啟指定的MIDI輸出裝置進行回放
  midiOutPrepareHeader 為MIDI輸出裝置準備一個緩衝區
  midiOutReset 為指定的MIDI輸出裝置關閉所有MIDI通道上的所有標誌
  midiOutSetVolume 設定一個MIDI輸出裝置的卷
  midiOutShortMsg 向指定的MIDI輸出裝置傳送一條短MIDI訊息
  midiOutUnprepareHeader 清除由midiOutPrepareHeader函式完成的準備
  midiStreamClose 關閉一個開啟的MIDI流
  midiStreamOpen 為輸出,開啟一個MIDI流
  midiStreamOut 在MIDI輸出裝置上播放或排隊一個MIDI資料流
  midiStreamPause 暫停一個MIDI流的播放
  midiStreamPosition 在一個MIDI流中檢取當前位置
  midiStreamProperty 設定或檢取與MIDI輸出裝置相關MIDI資料流的特性
  midiStreamRestart 重新啟動一個暫停的MIDI流
  midiStreamStop 關掉指定MIDI輸出裝置的所有MIDI通道






Visual C++ 支援十種資源:加速鍵、點陣圖、游標、對話方塊、HTML、圖示、選單、串表、工具條和版本資訊。    


      各種資源就是堆資料而已,最終都會被嵌入到EXE檔案裡的資料區中。需要的時候就通過函式載入到記憶體中使用。和資料庫一樣的。各種資源通過ID來唯一確定,就像資料庫用關鍵字來確定一樣。不同的資源由於型別不一樣可以使用等值的ID,如同資料庫裡的每一個表單裡的關鍵字值不唯一,但不同表單的關鍵字是允許一樣的。 
      資源銷燬,指的是讓資源根據它的使用週期應該及時從記憶體中被釋放,不要載入到記憶體後就不管了。否則記憶體越吃越大。


      你可以隨時建立任何所需要的資源。只需顯示ResourceView(資源檢視),右擊Resources(資源)資料夾,從上下文選單中選擇Insert(插入)。你會看到一個Insert Resource(插入資源)對話方塊,如上圖所示。請注意,它顯示出我們已提到過的所有十種資源。還應該看到,有三種建立資源的方式,即使用對話方塊上的New(新建),Import(匯入)或Custom(自定義)按鈕。可以在當前程式中使用來自其它工程的資源。例如,可能想在編寫的每一個程式中都使用相同的公司徽標。只需右擊Resources(資源)資料夾,從上下文選單選擇Import(匯入)而不是Insert(插入)。你會看到Open-type(開啟型別)對話方塊。選擇包含了想要匯入的資源的檔案。正是由於這個原因,你會想到把你的大多數資源與程式分離。可惜的是,這種方法只對圖示、游標、聲波檔案以及Visual Basic窗體檔案有用。有幾種使用來自其它工程的其它型別資源的方式,如About(關於)對話方塊。只需簡單地為想要共享的資源建立一個分離的RC檔案就行了。這在遇到像About對話方塊這樣的資源時很有用。你只要將RC檔案新增到工程中,剩下的由Visual C 來處理。另一種共享資源的方法是,將其複製到剪貼簿,再在建立了正確型別的空白資源後,將其貼上到工程中。自定義資源就是自己設計的資源。實際上,它並不適合Visual C 所提供的預定義型別。建立一個自定義資源專案很容易:只要單擊Insert Resource(插入資源)對話方塊上的Custom(自定義)按鈕。你會看到包含單個空白的New CustomResource(新建自定義資源)對話方塊。簡單地輸入自定義資源名。這時,Visual C 會產生一個新的資料夾,它含有你提供的自定義資源名和該資料夾內的一個新資源。還要提供實現這個資源所需的二進位制資料。
























關鍵字:VC 自定義資源
一、前言
  在VC環境中除了我們所常用的Dialog、Menu和Bitmap等標準資源型別之外,它還支援自定義資源型別(Custom Resource),我們自定義的資源型別能做些什麼呢?呵呵,用處多多。
預設的皮膚壓縮包或語言包。一些支援換膚的軟體特別是一些媒體播放器常常有自定義的皮膚檔案(你可以嘗試將Media Player或千千靜聽等軟體的Skins目錄下的檔案的副檔名改為.zip,然後使用WinZip開啟看一下),但為了防止Skin檔案丟失導致軟體無法顯示,他們常常會在EXE檔案中內建一套Skin作為預設的皮膚檔案。同樣,一些支援多語言的EXE檔案中存在預設語言包也是這個道理(當然也可以使用"String Table"資源型別); 
做為一些病毒/木馬程式的寄生方式。如果不小心執行了帶有病毒/木馬的程式,它們會在你執行時釋放出病毒/木馬檔案。當然許多病毒是將自身寫入PE檔案頭來實現; 
合併EXE與它所需要的DLL檔案。出於某些原因程式作者有時可能需要將DLL檔案嵌入到可執行的EXE檔案中,這可以通過使用自定義資源來實現; 
其它需要在程式中播放一個AVI動畫等等,都可以通過將二進位制的資料檔案作為自定義資源加入到可執行檔案中來實現; 
二、新增
  新增資源時選擇自定義,IDE會為你生成一個新的二進位制資源,然後你就可以將你已經存在的二進位制檔案作為自定義的資源型別匯入到專案中來了。
三、使用
  要使用自定義資源,我們可能要用到的幾個API函式有FindResource、LoadResource和LockResource等,這裡每一個函式的返回值分別作為下一個函式的引數,我來簡要介紹一下。 
FindResource用來在一個指定的模組中定位所指定的資源:


HRSRC FindResource(
HMODULE hModule,    //包含所需資源的模組控制程式碼,如果是程式本身,可以置為NULL
LPCTSTR lpName,    //可以是資源名稱或資源ID
LPCTSTR lpType    //資源型別,在這裡也就是我們自己指定的資源型別
);      
LoadResource用來將所指定的資源載入到記憶體當中; 


HGLOBAL LoadResource(
HMODULE hModule,    //模組控制程式碼,同上
HRSRC hResInfo    //需要載入的資源控制程式碼,這裡也就是FindResource的返回值
);    
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;
}

相關文章