2010-02-08 14 views
8

Jak utworzyć plik DLL zasobów? Plik dll będzie miał zestaw plików .png. W pewnym sensie te pliki .png powinny być odsłonięte od biblioteki dll. Moja aplikacja musiałaby polecić tę bibliotekę DLL, aby uzyskać plik .png.Jak utworzyć dll zasobów

Odpowiedz

17

Dll zasobów jest taki sam, jak każdy inny plik DLL, po prostu ma mało lub nie ma w nim kodu i stosunkowo więcej zasobów.

Microsoft nie posiada predefiniowany typ zasobu dla plików PNG, ale można zdefiniować własne

możliwe dll zasobów Najbardziej minimalna jest tylko skompilowany plik .RC przekazywane do łącznika takiego.


//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" 

następnie wykonać te polecenia w wierszu polecenia.

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

To wszystko. pierwsze polecenie kompiluje resource.rc do resources.res drugie polecenie zamienia resource.res na dll.

Powinieneś teraz mieć bibliotekę dll o nazwie resources.dll, która zawiera pojedynczy plik PNG. W praktyce, oczywiście, będziesz chciał umieścić #defines w pliku nagłówkowym, który udostępniasz z kodem, który używa biblioteki dll.

Aby użyć biblioteki DLL w C++, Twój kod wyglądałby tak.

#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

wow ... thanks a lot..this wygląda jak przydatnych informacji :) –

+0

przy użyciu tej techniki, mogę zmienić ikonę my self-stworzony IE przycisk paska narzędzi jest w czasie rzeczywistym? – karikari

+1

@karikari: Nie sądzę. Nie wiem, jak ta technika pomaga przy zmianach w czasie rzeczywistym. Zasoby w DLL są zdefiniowane w czasie połączenia, nie są dynamiczne. –

Powiązane problemy