Dans cet article je vous expliquerai comment changer le texte contenu dans les ressources de C++Builder pendant l’exécution de votre programme. Si vous concevez une application multilingue, cette technique sera pratique.
Dans votre fichier d’en-tête, ajoutez la déclaration suivante:
void __fastcall HookResourceString(TResStringRec& ResStringRec, Char* StrID);
Voici la méthode à ajouter à votre code:
void __fastcall TForm1::HookResourceString(TResStringRec& ResStringRec, Char* StrID) { DWORD OldProtect; VirtualProtect(&ResStringRec, sizeof(ResStringRec), PAGE_EXECUTE_READWRITE, &OldProtect); #if __BORLANDC__ >= 0x630 // Pour C++Builder XE et plus ResStringRec.Identifier = Integer(StrID); #else ResStringRec.ident = Integer(StrID); #endif VirtualProtect(&ResStringRec, sizeof(ResStringRec), OldProtect, &OldProtect); }
Le code est assez simple: on change la protection sur ResStringRec pour que l’on puisse y mettre un pointeur vers la chaîne de caractères StrID. Lorsque la modification est terminée, on remet la protection précédente.
Il est à noter que la structure TResStringRec n’est pas la même sur C++Builder 2010 et C++Builder XE. Étant donné que je n’ai pas d’autre version à ma disposition, je n’ai pas pu les vérifier.
Sur C++Builder 2010:
struct PACKAGE TResStringRec { long *module; long ident; };
Sur C++Builder XE:
struct DECLSPEC_DRECORD TResStringRec { public: unsigned *Module; int Identifier; };
Voici un exemple d’utilisation avec la fonction MessageDlg:
HookResourceString(_SMsgDlgConfirm, L"Mon titre"); HookResourceString(_SMsgDlgYes, L"Absolument"); HookResourceString(_SMsgDlgNo, L"Pas du tout"); HookResourceString(_SMsgDlgCancel, L"Laisse faire"); MessageDlg("Veux-tu faire quelque chose?", mtConfirmation, TMsgDlgButtons() << mbYes << mbNo << mbCancel, 0, mbCancel);
Le premier paramètre de la méthode est le nom de la ressource qui correspond aux noms que l’on retrouve dans le fichier Consts.hpp. Donc, il est important d’inclure ce fichier d’en-tête dans votre code. Si vous êtes intéressés à connaître le texte original, alors je vous conseil de jeter un coup d’œil au fichier Consts.pas.
Je vous laisse avec un capture d’écran du résultat.