Incorporer un fichier texte dans une ressource dans une application Windows native

J’ai un programme Windows C ++. J’ai un fichier texte qui contient des données. Actuellement, le fichier texte est un fichier distinct, chargé au moment de l’exécution et analysé. Comment est-il possible d’intégrer cela dans le binary en tant que ressource?

Puisque vous travaillez sur une application Windows native, vous devez créer une ressource définie par l’utilisateur pour incorporer le contenu du fichier texte dans la ressource compilée.

Le format d’une ressource définie par l’utilisateur est documenté sur MSDN , de même que les fonctions de chargement .

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’access au fichier que vous souhaitez intégrer à son contenu binary dans la ressource compilée.

Donc vous pourriez l’avoir comme ça:

Dans 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 le chargez comme ceci (code de vérification des erreurs omis pour plus de clarté):

 #include  #include  #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(::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 besoin de libérer la ressource puisque la ressource réside dans le binary de l’exécutable et que le système les supprime automatiquement lorsque le programme se FreeResource() la fonction FreeResource() ne fait rien sur Windows 32 bits et 64 bits). systèmes).

Comme les données résident dans le fichier binary exécutable, vous ne pouvez pas le modifier directement via le pointeur récupéré (c’est pourquoi l’ LoadFileInResource() fonction LoadFileInResource() stocke le pointeur dans un caractère const char* ). Pour cela, vous devez utiliser les fonctions BeginUpdateResource() , UpdateResource() et EndUpdateResource() .

Vous pouvez utiliser xxd (depuis un xxd Linux ou probablement cygwin) pour générer les données d’un fichier .h / .cc.

Il y a beaucoup de questions de débordement de stack qui développent ceci en détail:

  • Comment puis-je obtenir le contenu d’un fichier au moment de la construction dans ma chaîne c
  • “#Include” un fichier texte dans un programme C en tant que caractère []