Die API Funktionen und ANSI/Unicode
-
Hallo,
ich habe Zuhause an einem kleinem Programm geschrieben, das ich jetzt hier auf dem Firmenrechner fertig schreiben wollte.
Wenn ich das Programm aber Ausführe funktioniert so gut wie keine API.
Kleines Beispiel:FindWindow(); //funktioniert bei mir Daheim ohne Probleme, auf der Arbeit leider nicht
Wenn ich die Software aber hier auf dem Firmenrechner compiliere und das Programm dann starte wird das Fenster einfach nicht gefunden.
Aber wenn ich jetzt das Programm hier compiliere funktioniert es nur mit:FindWindowA();
Kann mir das jemand mal erklären?
Entwicklungsumgebung ist VC++ 2010.
Was muss ich einstellen, das das Programm überall funktioniert egal wo ich compiliere?Mfg
-
Wenn bei beiden die gleiche Version von VC++ 10 genutzt wird, würd ich gucken, dass auch bei beiden genau die gleichen Einstellungen aktiviert sind ..
D.h. in deinem Fall müsstest du eben bei beiden Unicode oder eben bei beiden ANSI einstellen ..
Ansonsten setze mal bei allen Strings TEXT () voran also z.B.FindWindow (TEXT ("String"), TEXT ("String"));
das sollte das Problem auch beheben ..
-
Hier noch nen netter Link: http://msdn.microsoft.com/en-us/goglobal/bb688113.aspx
-
Den Link werde ich mir heute Abend mal inruhe durchlesen...
Was aber genau macht den das TEXT ?
-
Je nach benutzten Zeichensatz, setzt TEXT noch ein L vor den String oder eben nicht. Zum Beispiel unter Verwendung von Unicode wird aus 'TEXT ("Das ist ein String")' 'L"Das ist ein String"' und unter Verwendung eines anderen Zeichensatzes wird das TEXT-Makro einfach durch nichts ersetzt, wonach 'TEXT("Das ist ein String")' zu '"Das ist ein String"' wird.
Das L gibt an, dass der String ein Unicode String ist. Ob das L jetzt bei allen Compilern so verstanden wird, weiß ich nicht, unter VC++ ist es auf jeden Fall so und auch unter CodeBlocks wird das richtig verstanden. Aber für diese Entscheidung soll ja auch das Makro TEXT da sein. Im Endeffekt nimmt es dir einfach Arbeit ab, weil du so nicht mehr entscheiden musst, welcher Zeichensatz nun für welches Projekt gilt, und bei einem Wechsel des Zeichensatz (wenn du konsequent und in der Hinsicht gut programmiert hast) auch sonst nichts mehr nur wegem dem Zeichensatz ändern musst.
-
Klar, TEXT kann man schwer googeln, vielleicht "TEXT Makro WinAPI"?
Im Grunde genommen ist es sehr einfach. TCHAR - Zeichenketten sind je nachdem, ob _UNICODE definiert wurde oder nicht, entweder wchar_t - oder char - Strings.
Beim definieren von wchar_t-Strings muss diesen ein L voran gestellt werden, damit der Compiler sie als solche interpretiert.const char* p1 = "Hello"; const wchar_t* p2 = L"Hello";
Das TEXT - Makro macht dies, je nach Projekteinstellung automatisch, also in etwa
#ifdef _UNICODE #define TEXT(quote) L##quote #else #define TEXT(quote) quote ... const TCHAR* p3 = TEXT("Hello");
-
Das TEXT Makro muss überall davor gesetzt werden wo man mit Strings arbeitet?
Also auch sowas hier:char window[] = "Unbenannt - Editor" FindWindow (TEXT (window),TEXT ("String"));
-
Nein. In diesem Fall hast Du ja schon entschieden, dass Du mit dem Datentyp char arbeiten willst. Um Dein Projekt wahlweise mit/ohne UNICODE erstellen zu können, muss Dein Beispiel so aussehen:
TCHAR window[] = TEXT("Unbenannt - Editor"); FindWindow (window, TEXT("String"));
Aus TCHAR wird dann char oder wchar_t - je nachdem, ob Dein Projekt als UNICODE oder MBCS - Projekt erstellt wird.
Dementsprechend wird aus TEXT("Unbenannt - Editor") dann entweder L"Unbenannt - Editor" oder "Unbenannt - Editor", analog für TEXT("String").Nachtrag:
Aus FindWindow (das ist nämlich auch ein Makro) wird dann dementsprechend FindWindowW für die UNICODE-Variante und FindWindowA für die MBCS (Ansi) - Variante.Grund für die Verwirrung bei vielen Anfängern ist, dass die Visual Studio - Editionen standardmäßig die UNICODE Variante bei neuen Projekten einstellen. Wenn man dann
char window[] = "Unbenannt - Editor"; FindWindow (window, "String");
schreibt, wird aus FindWindow FindWindowW wegen der Unicode-Einstellung; aber diese Funktion arbeitet nicht mit char* sondern mit wchar_t* und deshalb erzeugt der Compiler eine Fehlermeldung der Sorte: xxx kann nicht nach yyy konvertiert werden oder so was in der Art.