2010-05-29 9 views

Antwort

52

Da Sie auf einem nativen Windows-Anwendung arbeiten, was Sie wollen do erstellt eine benutzerdefinierte Ressource, um den Inhalt der Textdatei in die kompilierte Ressource einzubetten. Das Format einer benutzerdefinierten Ressource ist documented on MSDN, ebenso wie the functions for loading it.

Sie betten die Textdatei in einer Ressource-Datei wie folgt:

nameID typeID filename 

wo nameID einige einzigartige 16-Bit-Integer ohne Vorzeichen, die die Ressource identifiziert und typeID ist einige einzigartige 16-Bit-Ganzzahl größer als 255 Dies identifiziert den Ressourcentyp (Sie können diese Integer in der Datei resource.h definieren). filename ist der Pfad zu der Datei, in der die binären Inhalte in die kompilierte Ressource eingebettet werden sollen.

So könnte man es so haben:

In resource.h:

// Other defines... 

#define TEXTFILE  256 
#define IDR_MYTEXTFILE 101 

In Ihrer Ressource-Datei:

#include "resource.h" 

// Other resource statements... 

IDR_MYTEXTFILE TEXTFILE "mytextfile.txt" 

Sie es dann laden wie folgt aus (Fehlerprüfung Code weggelassen zur Übersichtlichkeit):

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

void LoadFileInResource(int name, int type, DWORD& size, const char*& data) 
{ 
    HMODULE handle = ::GetModuleHandle(NULL); 
    HRSRC rc = ::FindResource(handle, MAKEINTRESOURCE(name), 
     MAKEINTRESOURCE(type)); 
    HGLOBAL rcData = ::LoadResource(handle, rc); 
    size = ::SizeofResource(handle, rc); 
    data = static_cast<const char*>(::LockResource(rcData)); 
} 

// Usage example 
int main() 
{ 
    DWORD size = 0; 
    const char* data = NULL; 
    LoadFileInResource(IDR_MYTEXTFILE, TEXTFILE, size, data); 
    /* Access bytes in data - here's a simple example involving text output*/ 
    // The text stored in the resource might not be NULL terminated. 
    char* buffer = new char[size+1]; 
    ::memcpy(buffer, data, size); 
    buffer[size] = 0; // NULL terminator 
    ::printf("Contents of text file: %s\n", buffer); // Print as ASCII text 
    delete[] buffer; 
    return 0; 
} 

Beachten Sie, dass Sie die Ressource nicht tatsächlich freigeben müssen, da sich die Ressource in der Binärdatei der ausführbaren Datei befindet und das System sie automatisch beim Beenden des Programms löscht (die Funktion FreeResource() tut nichts auf 32-Bit- und 64-Bit-Windows) Systeme).

Da sich die Daten in der ausführbaren Binärdatei befinden, können Sie sie nicht direkt über den abgerufenen Zeiger ändern (deshalb speichert die Funktionsimplementierung LoadFileInResource() den Zeiger in einer const char*). Sie müssen dazu die Funktionen BeginUpdateResource(), UpdateResource() und EndUpdateResource() verwenden.

+0

Ich habe eine weitere allgemeine Frage gefragt [hier] (http://stackoverflow.com/questions/35521857/best-practice-to-protect-resources-against-reverse-engineering). Könnten Sie bitte auf meine zweite Frage antworten, die sich auf Ihre Antwort bezieht?Wie man eine DLL-Datei hat, die eine Funktion hat, um den Code zu enthalten, der in der Antwort in main ist. – utvecklare

+0

"Das System löscht sie automatisch, wenn das Programm beendet wird" Nicht alle Programme beim Beenden der systemfreien Ressourcen? Während der Ausführung einer ausführbaren Datei tritt ein Speicherleck und ein Ressourcenleck auf. Wenn also dieses Programm n derselben Ressource lädt, wird es in einem Ressourcenleck ausgegeben. – Raindrop7

+0

In den Eigenschaften der Ressourcendatei gibt es "Null Terminate Strings" –

-2

Sie können xxd (von einem Linux-Computer oder wahrscheinlich Cygwin) verwenden, um die Daten für eine .h/.cc-Datei zu generieren.

Es gibt viele Stack-Überlauf Fragen, die auf diese im Detail zu erweitern:

+6

-1 PE-Dateien (+) können bereits benutzerdefinierte Ressourcen speichern, und die Windows-Erstellungstools haben alles, was Sie benötigen. Die Syntax des Ressourcenskripts ist dokumentiert, und das Betriebssystem stellt APIs für den Zugriff auf diese Daten bereit. Diese Antwort ist die Antwort auf eine andere Frage. – IInspectable

Verwandte Themen