2

私はこの関数シグネチャを持つDLLを持っています:

function KP_RecuperarDadosFabricante(EnderecoIp, ChaveAcesso, 
  Porta: string; Return: PAnsiChar): Integer; stdcall; external 'Key.dll';

これは、dllのマニュアルからのサンプルVB.NETコードです。

Dim ret As Integer 
Dim ptrStr As IntPtr 
Dim DadosFab As String 

ptrStr = System.Runtime.InteropServices.Marshal.AllocHGlobal(256) 
ret = KP_RecuperarDadosFabricante("192.168.1.201", "0", "4370", ptrStr) 
DadosFab = System.Runtime.InteropServices.Marshal.PtrToStringAnsi(ptrStr)
System.Runtime.InteropServices.Marshal.FreeHGlobal(ptrStr)

これは私のDelphiコードです:

procedure TForm1.BitBtn1Click(Sender: TObject);
var
  Return: string;
  pReturn: PAnsiChar;
begin
  GetMem(pReturn, 512);
  FillChar(pReturn^, 512, 0);
  Memo1.Text:='';
  if KP_RecuperarDadosFabricante("192.168.1.201", "0", "4370", pReturn) = 1 then
  begin
    Return := StrPas(pReturn);
    ShowMessage(Return);
  end
  else
  begin
    ShowMessage('Error');
  end;
end;

このコードはDelphi7ではうまく機能しますが、DelphiXEでは機能しません。常に「エラー」を返します。このコードをDelphiXEで機能させる方法は?

4

1 に答える 1

7

DLL が Delphi 7 で作成された場合、Delphi XE からその DLL を使用することはできません。string文字サイズを同じにするためにパラメータを変更してもAnsiString、文字列の内部構造がそれらのバージョン間でどこかで変更されたという事実に固執しているためAnsiString、Delphi XE コードから送信したものは、 Delphi 7 コードは、 が見えることを期待しAnsiStringています。

PAnsiCharDLL を変更して再コンパイルする権限がある場合は、Windows 上の他のほぼすべての DLL と同じように、代わりにパラメーターを作成する必要があります。PCharまた、最後のパラメーターをに変更することを忘れないでくださいPAnsiChar


DLL が Delphi 以外の言語で記述されている場合は、関数シグネチャを変更するだけで修正できる場合があります。非 Delphi 言語には Delphi のstring型がないため、宣言は常に間違っていました。Delphi 7 から動作したときは幸運でした。すべてのパラメータを型に変更しますPAnsiChar(最後のパラメータを含む)。char*その後、おそらく元の C コードの型と一致します。

于 2013-03-15T21:07:51.707 に答える