2012-04-06 5 views
1

Ich habe die folgende Funktion in meiner Anwendung:Warum bekomme ich Fragezeichen, wenn ich einen PChar auf die Konsole drucke?

function GetDeviceChannelInfo_HSI(PortNumber, Address, ChNumber: Integer; 
    var State: Integer): PChar; stdcall; external DLL_FILENEAME; 

Alles, was ich tun möchte, ist das Ergebnis dieser an die Konsole drucken. Was passiert, ist, dass, wenn ich eine WriteLn darauf anrufe, alles, was ich bekomme, ??????????? als Antwort ist.

Ich gehe davon aus, dass die Konsole nicht weiß, wie das zu drucken ist. Vielleicht ist es Unicode oder etwas und es kann nicht gedruckt werden?

Ich bin neu in Delphi, und habe wirklich keine Ahnung, warum das sein könnte. Tue ich tatsächlich die Zeigeradresse? Ich weiß es wirklich nicht. Jede Hilfe wäre willkommen.

+0

Sind Sie sicher, dass die Funktionsdeklaration korrekt ist? Die meisten DLL-Aufrufe bitten Sie, einen Puffer anzugeben, den sie füllen; Sie ordnen den Puffer zu, übergeben ihn, und bei der Rückgabe wird der Puffer mit den DLL-Informationen gefüllt. Die Rückgabe eines PChar ist sehr ungewöhnlich, da die DLL den Speicher zuweist und den Zeiger an die aufrufende Anwendung zurückgibt, die keine Möglichkeit hat, sie freizugeben (außer sie sind beide in Delphi/C++ Builder kompiliert und verwenden 'ShareMem')). Woher hast du die Erklärung, die du benutzt? –

+0

Ändern Sie den PChar zu PAnsiChar, und das Problem verschwindet. Ist das nicht ein Duplikat, von etwa 30 anderen Fragen von Leuten, die die Ansi nicht zu Unicode-Delphi-Typen gegratet haben ('PChar' bedeutete' PAnsiChar', und jetzt bedeutet es 'PWideChar') –

Antwort

1

Nun müssen Sie vielleicht mehr Code schreiben, wenn dies falsch ist, aber ich würde etwas, was wie erwartet

Var 
    FuncResult : String; 
Begin 
    FuncResult := GetDeviceChannelInfo(...); 
    WriteLn(FuncResult); 
End; 

zu arbeiten.

Im Grunde nur einige Implict Casts von PChar zu String zwingen;

+0

Danke für die Antwort. Ich habe es versucht.Wenn Sie dies tun, ist das Ergebnis eine leere Zeichenfolge anstelle der ?????????? Nicht sicher, warum dies passierte – user489041

+0

Schlägt vor, während diese Funktion PChar zurückgeben kann, ein PChar zu was ist ein unbekanntes. Ich muss das Ergebnis dekodieren, um herauszufinden, was damit gemacht werden soll. –

3

Sie drucken nicht die Zeigeradresse. Wenn Sie es wären, würden Sie etwas erhalten, das wie eine Adresse aussieht (eine dezimale oder hexadezimale Zahl), keine Fragezeichen.

Ab Delphi 2009 ist PChar ein Zeiger auf Unicode-Zeichen. Wenn Sie diese Version oder später verwenden, vergewissern Sie sich, dass diese Funktion tatsächlich zurückgegeben wird. Es ist wahrscheinlicher, dass die Funktion einen Zeiger auf Nicht-Unicode-Zeichen zurückgibt - das würde sie zurückgeben, wenn Sie dies aus dem C-Code übersetzten, wo die Funktion char* zurückgegeben hat. Die richtige Delphi-Übersetzung für diesen Typ ist PAnsiChar.

Wenn Sie breite Zeichen drucken, die keine echten Zeichen sind oder keine Darstellungen in der aktuellen Schriftart haben, erhalten Sie häufig Fragezeichen.

Wenn Sie eine frühere Delphi-Version verwenden und die Funktion wirklich PWideChar (wchar_t*, in C) zurückgibt, können Sie das umgekehrte Problem bekommen, indem Sie schmale Zeichen drucken, wenn Ihnen die Funktion breite Zeichen gab. Das ist jedoch unwahrscheinlich, weil die breiten Zeichen, die Sie erhalten, nur ASCII-Probleme sind, also würde Ihr Programm nach dem Drucken des ersten anhalten und auf das Null-Byte stoßen, das die zweite Hälfte des Breitzeichens ausmacht.

Sie können den Debugger verwenden, um sich eine Vorstellung davon zu machen, was Sie wirklich haben. Nimm die Adresse, die dir die Funktion gibt, und besuche diese Adresse im Speicher-Browser (Teil der CPU-Ansicht). Sie können festlegen, dass Delphi den Speicher in verschiedenen Formaten anzeigt, einschließlich Zeichen, breiten Zeichen und Zahlen mit unterschiedlichen Breiten. Es hilft auch, wenn Sie eine Vorstellung davon haben, welches Ergebnis Sie erhalten sollen. Dann könnten Sie Muster im Speicher erkennen.

Verwandte Themen