FormatMessage
-
Hallöchen,
vielleicht kann mir jmd von euch kurz bei einer kleinen Frage weiterhelfen.
Ich hab ein CStringArray mit Daten gefüllt und möchte diese jetzt mittels FormatMessage() einem CString übergeben; wie mache ich das am Besten, so dass ich nicht immer GetAt(0), GetAt(1) etc. schreiben muss?
CStringArray strArray; //mit daten gefüllt CString str ("%1, %2, %3, %4"); str.FormatMessage(str, strArray.GetAt(0), strArray.GetAt(1)....);
Gruß
Konrad
-
str.FormatMessage(str, strArray[0].GetString(), strArray[1].GetString(), strArray[2].GetString(), strArray[3].GetString());
-
for-Schleife und mit Append die Daten anfügen anstatt mit Format...
-
Jochen Kalmbach schrieb:
for-Schleife und mit Append die Daten anfügen anstatt mit Format...
Ich vermute mal, dass die Simple Maske mit Kommatrennung nicht das finale Ziel war... Wenn doch wurde die Frage falsch getstellt
-
Martin Richter schrieb:
Jochen Kalmbach schrieb:
for-Schleife und mit Append die Daten anfügen anstatt mit Format...
Ich vermute mal, dass die Simple Maske mit Kommatrennung nicht das finale Ziel war... Wenn doch wurde die Frage falsch getstellt
nein, das war oder ist natürlich nicht das finale Ziel; sollte lediglich eine simple Demo darstellen.
-
Dann konvertiere Deine Argumente in ein va_args...
-
Gibt es bei FormatMessage() eine Möglichkeit die Anzahl der Argumente zu variieren?
void FormatString(CString& string, CStringList& strList, UINT number) { string.FormatMessage(string, strList->GetAt(0),.....strList->GetAt(number)); }
Nicht jeder CString beinhaltet gleich viele %1 Argumente, so dass die CStringList in der Größe variiert als auch die Anzahl...
-
Du musst FormatV verwenden!
Für ein Beispiel siehe:
http://msdn.microsoft.com/en-us/library/aa314334(VS.60).aspxOb Du es aber so hinbekommst, kann ich Dir gerade auch nicht sagen. Ich würde Dir auf jeden Fall davon abraten dies zu tun... das kann zu ganz unvorhergesehenen Ergebnissen führen, wenn da was nicht passt...
-
LPWSTR msg (_T("%1% und ")); LPWSTR out = NULL; CStringArray Parameters; CString test ("teststring"); Parameters.Add(test); DWORD rtn = ::FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_STRING | FORMAT_MESSAGE_ARGUMENT_ARRAY, (LPTSTR)&msg, 0, 0, (LPTSTR) &out, //Parameters.GetData(), Parameters.GetSize(), (va_list *)Parameters.GetData() );
Funktioniert leider noch nicht, da in (LPTSTR) &out leider nichts lesbares steht, sondern lauter kryptische Zeichen...
-
Man kann einen String Array nicht in einen Array von Argumenten umwandeln. Die Element Größe ist doch ganz anders!
Wenn va_list verwendet wird muss Dir doch klar sein, dass die Daten dort dem Stacklayout entsprechen müssen, dass auch bei Verwendung von ... benutzt wird.
IMHO müsste folgendes funktioneren:
Allokiere einen Array von Zeigern. Kopiere alle Startadressen (CString::GetString) in den Array aufsteigend von Argument 1 bis n. Übergib den Startzeiger des Arrays als va_list and die Funktion...Anmerkung: Die Implementierung von va_list ist Compiler spezifisch...