LoadString() C++ Klasse
Um eine WIN32-Applikation in mehreren Sprachversionen zu lokalisieren,
gibt es neben den lokalisierten Forms auch die String tables, die sich in den Programmresourcen befinden.
Wenn man sein Programm also mehrsprachig gestalten will, sind alle hardcoierten
strings aus dem Sourcecoe zu entfernen und durch Aufrufe zur LoadString Funktion zu ersetzen.
Diese Funktion hat nur leider einige Einschränkungen, wie z.B., dass es nicht möglich ist, die Größe des zu ladenden Strings im vornherein zu bestimmen, um dadurch dynamisch Speicher zu allozieren. Der simpelste Ansatz zum Laden von Strings ist nun, einen globalen Puffer zu definieren, der einfach eine fixe Größe (#define MAX_LOADSTRING 512
z.B. in der Microsoft Hallo-Welt-WIN32-Anwendung, die das Visual Studio durch den Assistenten generiert) hat. Dies ist jedoch mit dem Risiko verbunden, dass einerseits evtl. unnötig Speicher vergeudet wird, andererseits man viell. doch einmal Strings hat, die diese Größe überschreiten und – wenn man darauf vergisst, seine Konstante anzupassen – der Benutzer dann einen abgeschnittenen Text vorfindet.
Außerdem kann man in Multithreaded Applikationen logischerweise keine globale Variable verwenden, die den Text erhält, sondern muss zumindest pro Thread eine eigene lokale
Variable hierfür definieren.
Eine Möglichkeit, diese Limitierung zu umgehen wird von Raymond Chen in seinem Blog beschrieben. Er lädt sich einfach selbst den String aus den Programmresourcen.
Eine andere Möglichkeit bietet die CString Klasse mit ihrer LoadString Methode.
Das Problem hierbei ist jedoch, dass CString Bestandteil der MFCs ist und man in seiner
einfachen WIN32-Anwendung evtl. nicht unbedingt den Ballast der MFCs mitschleppen möchte.
Ich habe daher meine eigene kleine StringLoader – Klasse gebastelt, die dynamisch Speicher alloziert und intern behält. Der Destruktor sorgt für die ordnungsgemäße Freigabe des Speichers: