1

私のアプリケーションには次の関数があります。

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

私がやりたいのは、この結果をコンソールに出力することだけです。しかし、何が起こるかというと、私がそれに電話をかけると、WriteLn私が得るのは???????????応答としてだけであるということです。

コンソールはこれを印刷する方法を知らないと思います。おそらくそれはUnicodeか何かで、印刷できませんか?

私はDelphiを初めて使用しますが、なぜそうなるのか本当にわかりません。実際にポインタアドレスを出力していますか?本当にわかりません。どんな助けでもいただければ幸いです。

4

2 に答える 2

3

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

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

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

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

デバッガーを使用して、自分が実際に何を持っているかを知ることができます。関数が提供するアドレスを取得し、メモリ ブラウザー (CPU ビューの一部) でそのアドレスにアクセスします。Delphi では、文字、ワイド文字、さまざまな幅の数値など、さまざまな形式でメモリを表示できます。また、どのような結果が得られるはずなのかをある程度把握している場合にも役立ちます。そうすれば、記憶の中のパターンを認識するかもしれません。

于 2012-04-06T16:11:19.337 に答える
1

これが間違っている場合は、さらにコードを投稿する必要があるかもしれませんが、次のようなことを期待していました

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

仕事に。

基本的には、PChar から String へのいくつかの暗黙のキャストを強制するだけです。

于 2012-04-06T16:11:08.123 に答える