2010-02-08 212 views
8

如何創建資源DLL?該DLL將有一組.png文件。這些.png文件應該從dll中暴露出來。我的應用程序需要引用此dll以獲取.png文件。如何創建資源DLL

回答

17

資源DLL與任何其他DLL相同,只是代碼很少或沒有代碼,並且資源相對較多。

微軟沒有對PNG文件的預定義的資源類型,但你可以定義自己的

最起碼的可能的資源DLL是剛剛通過像這樣的鏈接器編譯rc文件。


//save this as resources.rc (supply your own .png file) 

#define RT_PNG 99 

#define ID_DIGG 1 

ID_DIGG RT_PNG "image\\digg.png" 

然後,在命令提示執行這些命令。

rc resources.rc 
link /dll /noentry /machine:x86 resources.res 

那就是它。第一個命令將resources.rc編譯爲resources.res 第二個命令將resources.res轉換爲dll。

您現在應該有一個名爲resources.dll的dll,它包含一個png文件。 實際上,當然,您會希望將#defines放在與使用dll的代碼共享的頭文件中。

要在C++中使用dll,你的代碼應該看起來像這樣。

#define RT_PNG MAKEINTRESOURCE(99) 
#define ID_DIGG MAKEINTRESOURCE(1) 

HMODULE hMod = LoadLibraryEx("resources.dll", NULL, LOAD_LIBRARY_AS_DATAFILE); 
if (NULL != hMod) 
{ 
    HRSRC hRes = FindResource(hMod, RT_PNG, ID_DIGG); 
    if (NULL != hRes) 
    { 
     HGLOBAL hgbl = LoadResource(hMod, hRes) 
     void * pPng = LockResource(hgbl); 
     UINT32 cbPng = SizeofResource(hMod, hRes); 

     // pPng now points to the contents of your your .png file 
     // and cbPng is its size in bytes 

    } 

    // Don't free the library until you are done with pPng 
    // FreeLibrary(hMod); 
} 
+0

哇...謝謝lot..this看起來像使用這種技術的有用的信息:) – 2010-02-08 07:28:38

+0

,我可以改變我的自我創造的IE工具欄按鈕的圖標實時? – karikari 2010-05-19 03:05:13

+1

@ karikari:我不這麼認爲。我不知道這種技術如何幫助實時更改。 DLL中的資源是在鏈接時定義的,它們不是動態的。 – 2010-05-19 17:55:47