Hallo Freunde,
heute mal ein triviales Problem. Ich habe hier ein SDK, natürlich in C geschrieben. Nun müssen an verschiedene Routinen des SDK Zeichenketten übergeben werden. Natürlich sind diese allesamt als "char *" deklariert.
Greifen wir uns einfach eine solche Routine heraus:
Quelltext
1: 2:
| void UserLoggingMessageEvent(char *logmessage, int Loglevel, char* logChannel, uint64 logID, char* logTime, char* completeLogString); |
In den neueren Delphi-Versionen sind nun alle Strings Unicode-Strings. Diese Strings dem SDK zu fressen zu geben geht erwartungsgemäß schwer in die Hose, ebenso sind die Rückgabewerte vom Typ char* ebenso Schrott. Immerhin haben wir damit schon mal herausgefunden, das das SDK kein Unicode unterstützt
Nun wird es spannend. Ich übersetze obige Deklaration wie folgt:
Delphi-Quelltext
1: 2:
| procedure UserLoggingMessageEvent(const logmessage: PAnsiChar; logLevel: integer; const logChannel: PAnsiChar; logID: uint64; const logTime: PAnsiChar; const completeLogString: PAnsiChar); cdecl; |
Kein Problem. Aber sämtliche Zeichenketten müssen nun so übergeben werden:
Delphi-Quelltext
1:
| UserLoggingMessageEvent(PAnsiChar(myMessage[1]),1,PAnsiChar(myChannel[1]),1234,'',''); |
Benutze ich
nicht die Indizierung [1], wirft der Compiler massenhaft Warnungen aus:
W1044 Bedenkliche Typumwandlung von string in PAnsiChar. Hat er ja auch recht, das wahre ist das Konstrukt nicht.
Ich habe nun überlegt, statt PAnsiChar einfach PAnsiString zu verwenden. Damit verschwinden die Warnungen. Aber nun sind plötzlich folgende Aufrufe unmöglich:
Delphi-Quelltext
1:
| UserLoggingMessageEvent('Debug Message',1,'Schwarzer Kanal',1234,'',''); |
E2010 Inkompatible Typen 'PAnsiString' und 'string'. Typecasten nach PAnsiString hilft auch nix, ergibt einen E2089 Ungültige Typumwandlung. Auch doppeltes Typecasten
PAnsiString(AnsiString('Schwarzer Kanal')) bringt das gleiche Resultat.
Gibt es eine Übersetzung nach Delphi XE4, ohne Myriaden an Typecasts zu machen oder die Warnung abschalten zu müssen ?
Lies, was da steht. Denk dann drüber nach. Dann erst fragen.