Komfortabler Dateimanager mit vielen Funktionen

FormatMessage und Ausrufezeichen

By Sven on 09.09.2005 - 08:34 in Entwicklung

Während des Debuggens der x64-Version von SpeedCommander 11 wurde mir beim Start eine Fehlermeldung „Out of memory“ angezeigt. Der Auslöser der Meldung war eine FormatMessage-Anweisung, mit deren Hilfe Argumente in Strings eingefügt werden können. Der Vorteil von FormatMessage gegenüber dem bekannteren printf liegt darin, dass sich bei FormatMessage die Reihenfolge der Argumente im Text variabel gestalten lässt. Jeder Platzhalter beginnt mit %n, so dass man z.B. bei mehrsprachigen Anwendungen flexibel bei der Übersetzung ist und auch mal ein %2 vor ein %1 setzen kann. Bei printf muss dagegen die Reihenfolge der Argumente stets eingehalten werden.

Die Fehlermeldung kam bei folgendem Text:

Thank you for evaluating %1!

%1 wird hier durch den aktuellen Programmnamen ersetzt. Warum Windows hier die Arbeit verweigert wird erst deutlich, wenn man sich die erweiterte Syntax für die Platzhalter näher anschaut. In der Regel benutzt man als Argumente Zeichenketten, so dass hier die Angabe von %1%99 ausreicht. Will man jedoch andere Datentypen benutzen, so muss man die Platzhalter entsprechend formatieren. Dies geschieht durch %n!format!, die Typbezeichner sind äquivalent zur Funktion wsprintf.

Windows erwartete also statt es normalen Ausrufezeichens einen Typbezeichner. Der Sonderfall eines direkt einem Platzhalter folgenden Ausrufezeichens wird in der Dokumentation übrigens auch erwähnt:

%! – A single exclamation point in the formatted message text. This format string can be used to include an exclamation point immediately after an insert without its being mistaken for the beginning of a printf format string.

Der Vorlagentext muss also korrekterweise so lauten:

Thank you for evaluating %1%!

Bei den bisherigen Tests auf deutschen Systemen trat der Fehler übrigens nicht auf, weil sich hier zwischen Platzhalter und Ausrufezeichen mindestens ein anderes Zeichen befindet:

Vielen Dank dafür, dass Sie %1 ausprobieren!

Es gibt einen Kommentar zu diesem Beitrag

Trackback URL | RSS-Feed für Kommentare

  1. Uwe sagt:

    %Dank%e %für %d%en %T%i%%pp%!

Top