2012-04-06 6 views
1

は、私は自分のアプリケーションで、以下の機能を持っている:PCharをコンソールに印刷すると、なぜ疑問符が表示されますか?

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

私がやりたいことのすべては、コンソールにこの結果を印刷しています。しかし、私がWriteLnと呼んだとき、私はすべて応答として???????????です。

私はコンソールがこれを印刷する方法を知らないと仮定しています。多分それはUnicodeか何かであり、それは印刷できませんか?

私はDelphiを初めて使用しています。なぜこれがどうしていいのかわかりません。私は実際にポインタアドレスを印刷していますか?私は本当に知らない。どんな助けもありがとう。

+0

関数の宣言が正しいですか?ほとんどのDLL呼び出しは、それらが満たすバッファを提供するように要求します。あなたはバッファを割り当て、それを渡し、そして戻ってくると、バッファはDLL情報で埋められます。 PCharを返すことは非常に珍しいことです.DLLはメモリを割り当てて呼び出し元のアプリケーションにポインタを返します。ポインタを呼び出すアプリケーションは解放する方法がありません(Delphi/C++ Builderでコンパイルされ、 'ShareMem' )。使用している宣言はどこで手に入りましたか? –

+0

PCharをPAnsiCharに変更すると、問題は解決しません。これは二重ではありません。AnsiからUnicodeへのデルファイの種類を知らなかった人からの約30の他の質問です( 'PChar'は' PAnsiChar'を意味し、今は 'PWideChar'を意味します) –

答えて

1

は、さてあなたは、これが間違っている場合はより多くのコードをポストする必要があるかもしれませんが、私は仕事に

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

のようないくつかのことを期待していると思います。

基本的には、PCharからimplicitキャストをStringに強制するだけです。

+0

応答をありがとう。私はこれを試してみました。これを実行すると、結果は?????????ではなく空の文字列になります。なぜこれが起こったのか分かりません – user489041

+0

この関数は、PCharを未知のものに戻しているかもしれないと示唆しています。結果をデコードして、何をすべきかを理解しなければならない。 –

3

あなたはポインタアドレスを印刷していません。もしあなたがそうだったら、疑問符ではなく、アドレス(十進数または16進数)のようなものが得られます。

Delphi 2009では、PCharはUnicode文字へのポインタです。そのバージョン以降を使用している場合は、それが実際に関数が返すものであることを確認してください。関数が非Unicode文字へのポインタを返す可能性が高くなります。これは、関数がchar*を返したCコードから変換した場合に返されるものです。そのタイプの正しいDelphi変換はPAnsiCharです。

実際の文字ではないワイド文字、または現在のフォントで表現されていないワイド文字を印刷すると、疑問符が表示されることがよくあります。

以前のバージョンのDelphiを使用していて、実際に関数がPWideChar(Cではwchar_t*)を返す場合、その関数がワイド文字を与えたときに狭い文字を出力するという逆の問題が発生する可能性があります。しかし、あなたが受け取るワイド文字は単にASCIIに問題があるので、プログラムは最初の文字を出力した後に停止し、ワイド文字の後半を構成するヌルバイトに遭遇します。

デバッガを使用して、自分が実際に持っていることを知ることができます。機能が提供するアドレスを取得し、メモリブラウザ(CPUビューの一部)でそのアドレスにアクセスします。 Delphiでは、文字、ワイド文字、さまざまな幅の数値など、さまざまな形式でメモリを表示できます。それはあなたが得るべき結果が何であるかを知っていれば役立ちます。次に、メモリ内のパターンを認識することがあります。

関連する問題