2012-02-11 15 views
13

Possiedo risorse binarie personalizzate (cursori animati) che desiderano memorizzare come risorse in una lib statica in Visual Studio C++. Risulta che le risorse binarie personalizzate non vengono caricate da :: LoadCursor() o trovate da :: FindResource() se si tratta di una risorsa personalizzata e in una libreria statica.Come caricare una risorsa binaria personalizzata in una libreria statica VC++ come parte di una DLL?

This question dà un po 'di lavoro.

Seguendo il suo consiglio, se aggiungo il file * .res a un exe come "Proprietà di configurazione-> Linker-> Dipendenza aggiuntiva", la libreria statica sarà in grado di trovare la risorsa.

MA se la libreria statica fa parte di una DLL e la collego come dipendenza aggiuntiva non si trova più!

Come posso collegare le risorse in una DLL?

Oppure basta fare in modo che il file binario si trovi nella libreria statica? I metodi nella domanda sono piuttosto ingombranti.

+0

Non è chiaro se si è dimenticato di aggiungere il file .res richiesto nel progetto DLL. La modalità di errore più tipica è il passaggio dell'handle del modulo errato a FindResource(). Deve essere l'handle del modulo della DLL. Hai capito da DllMain(). E sì, incollare questo insieme è complicato dal design. –

risposta

29

Nella finestra di dialogo Aggiungi risorsa fare clic su Importa, selezionare "Tutti i file (.)" in modo da consentire l'importazione di file di qualsiasi tipo, quindi selezionare solo il file desiderato. Quando viene visualizzata la finestra di dialogo Tipo di risorsa personalizzata, digitare RCDATA nel campo "Tipo di risorsa".

Se si apre file RC, si vedrà qualcosa di simile:

///////////////////////////////////////////////////////////////////////////// 
// 
// RCDATA 
// 

IDR_RCDATA1   RCDATA    "myfile.whatever" 

e genererà resource.h con seguente riga:

#define IDR_RCDATA1     101 

Nel codice si accede in questo modo :

#include "resource.h" 
#include <windows.h> 

int main(int argc, char* argv[]) 
{ 
    HRSRC myResource = ::FindResource(NULL, MAKEINTRESOURCE(IDR_RCDATA1), RT_RCDATA); 
    HGLOBAL myResourceData = ::LoadResource(NULL, myResource); 
    void* pMyBinaryData = ::LockResource(myResourceData); 
    return 0; 
} 

dove pMyBinaryData è puntatore al primo byte di questo file eseguibile. Per ulteriori informazioni visitare Resource Functions

Ecco un esempio di come si potrebbe risparmiare risorsa binaria come questo sul disco:

#include "resource.h" 
#include <windows.h> 
#include <fstream> 

int main(int argc, char* argv[]) 
{ 
    HRSRC myResource = ::FindResource(NULL, MAKEINTRESOURCE(IDR_RCDATA1), RT_RCDATA); 
    unsigned int myResourceSize = ::SizeofResource(NULL, myResource); 
    HGLOBAL myResourceData = ::LoadResource(NULL, myResource); 
    void* pMyBinaryData = ::LockResource(myResourceData); 

    std::ofstream f("C:\\x.bin", std::ios::out | std::ios::binary); 
    f.write((char*)pMyBinaryData, myResourceSize); 
    f.close(); 

    return 0; 
} 

Quando si genera progetto con risorse del genere, questa risorsa entreranno a far parte del programma (DLL).

+0

E inoltre, non dimenticare di sbloccare la risorsa: 'BOOL bResult = :: UnlockResource (hRes);' e 'bResult = :: FreeResource (hRes);' – DitherSky

+11

@DitherSky: No. Non è più necessario, controllare la documentazione di [Funzione FreeResource] (http://msdn.microsoft.com/en-us/library/windows/desktop/ms648044 (v = vs.85) .aspx): * "Questa funzione è obsoleta ed è supportata solo per retrocompatibilità con Windows a 16 bit. Per le applicazioni Windows a 32 bit, non è necessario liberare le risorse caricate utilizzando LoadResource. "* – LihO

+0

' UnlockResource' è solo una macro no-op nell'SDK, tuttavia stranamente 'FreeResource' ha un reale esportazione no-op su 'kernel32' per backcomp. – wqw

Problemi correlati