ハードウェア センサーのペアとやり取りする C# アプリケーションを作成しています。残念ながら、デバイスで公開されている唯一のインターフェイスには、Delphi で記述された提供された dll が必要です。
DLL に必要な関数を呼び出し、スタウト経由でセンサー データを返す Delphi 実行可能ラッパーを作成しています。ただし、このデータの戻り値の型は PWideChar (または PChar) であり、コマンド ラインで印刷するために ansi に変換できませんでした。
データを直接 WriteLn に渡すと、'?' が返されます。キャラクターごとに。文字の配列を調べて、Ansi 変換で一度に 1 つずつ印刷しようとすると、印刷される文字はわずかで (データは確認されます)、順序どおりに印刷されないことがよくあります。また、PWideChar を直接整数に変換してみました。「I」は 21321 に対応します。すべての変換を把握できる可能性がありますが、一部のデータには多数の値が含まれています。
dll が使用している Delphi のバージョンはわかりませんが、4 だと思います。間違いなく 7 より前です。
どんな助けでも大歓迎です!
TLDR: 印刷用に UTF-16 PWideChar を AnsiString に変換する必要があります。
適用例:
program SensorReadout;
{$APPTYPE CONSOLE}
{$R *.res}
uses
Windows,
SysUtils,
dllFuncUnit in 'dllFuncUnit.pas'; //This is my dll interface.
var state: integer;
answer: PChar;
I: integer;
J: integer;
output: string;
ch: char;
begin
try
for I := 0 to 9 do
begin
answer:= GetDeviceChannelInfo_HSI(1, Ord('a'), I, state); //DLL Function, returns a PChar with the results. See example in comments.
if state = HSI_NO_ERRORCODE then
begin
output:= '';
for J := 0 to length(answer) do
begin
ch:= answer[J]; //This copies the char. Originally had an AnsiChar convert here.
output:= output + ch;
end;
WriteLn(output);
end;
except
on E: Exception do
Writeln(E.ClassName, ': ', E.Message);
end;
ReadLn(I);
end.`
問題は、PAnsiChar が DLL をソースとする関数の戻り値の型である必要があることでした。