2010-05-29 8 views

Répondre

52

Puisque vous travaillez sur une application Windows native, ce que vous voulez faire est de créer une ressource définie par l'utilisateur pour intégrer le contenu du fichier texte dans la ressource compilée.

Le format d'une ressource définie par l'utilisateur est documented on MSDN, de même que the functions for loading it.

vous intégrez votre fichier texte dans un fichier de ressources comme celui-ci:

nameID typeID filename 

nameID est un entier non signé 16 bits unique qui identifie la ressource et typeID est un entier non signé 16 bits unique supérieur à 255 qui identifie le type de ressource (vous pouvez définir ces entiers dans le fichier resource.h). filename est le chemin d'accès au fichier dans lequel vous souhaitez incorporer son contenu binaire dans la ressource compilée.

Vous pourriez avoir comme ceci:

En resource.h:

// Other defines... 

#define TEXTFILE  256 
#define IDR_MYTEXTFILE 101 

Dans votre fichier de ressources:

#include "resource.h" 

// Other resource statements... 

IDR_MYTEXTFILE TEXTFILE "mytextfile.txt" 

Ensuite, vous chargez comme ceci (code de contrôle d'erreur omis pour plus de clarté):

#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; 
} 

Notez que vous n'avez pas réellement besoin de libérer la ressource puisque la ressource réside dans le binaire de l'exécutable et que le système les supprime automatiquement lorsque le programme se termine (la fonction FreeResource() ne fait rien sur Windows 32 bits et 64 bits systèmes). Comme les données résident dans le fichier binaire exécutable, vous ne pouvez pas le modifier directement via le pointeur récupéré (c'est pourquoi l'implémentation de la fonction LoadFileInResource() stocke le pointeur dans un const char*). Vous devez utiliser les fonctions BeginUpdateResource(), UpdateResource() et EndUpdateResource() pour ce faire.

+0

J'ai un autre questionnement général demandé [ici] (http://stackoverflow.com/questions/35521857/best-practice-to-protect-resources-against-reverse-engineering). Pourriez-vous répondre à ma deuxième question liée à votre réponse?Juste comment avoir un fichier dll qui a une fonction pour contenir le code qui est en main dans votre réponse. – utvecklare

+0

"le système va les supprimer automatiquement quand le programme se termine" Ne pas tous programmer quand quitter les ressources libres du système? Une fuite de mémoire et une fuite de ressources se produisent pendant l'exécution d'un exécutable. Donc, si ce programme charge n de la même ressource, il émettra une fuite de ressources. – Raindrop7

+0

Dans les propriétés du fichier de ressources, il y a "Null Terminate Strings" –

-2

Vous pouvez utiliser xxd (à partir d'une machine linux ou probablement cygwin) pour générer les données pour un fichier .h/.cc.

Il y a beaucoup de questions de débordement de pile qui se dilatent à ce sujet en détail:

+6

-1 Les fichiers PE (+) sont déjà capables de stocker des ressources personnalisées et les outils de compilation Windows ont tout ce dont vous avez besoin. La syntaxe du script de ressources est documentée et le système d'exploitation fournit des API pour accéder à ces données. Cette réponse est la réponse à une autre question. – IInspectable