2016-08-23 2 views
1

Robert GieseckeのUnmanaged Exportsを使用して、SerialPortクラスのオープンメソッドをC#クラスからDLLに変換しています。今のところ、コードは次のとおりです。DelphiアプリケーションのserialPortクラスを使用してC#unmanaged exports dllを呼び出す

[DllExport] 
public static void OpenPort(string portName, int baudRate, int dataBits) 
{ 
    SerialPort serialPort = new SerialPort 
    { 
     StopBits = StopBits.One, 
     Parity = Parity.None, 
     ReadTimeout = 100, 
     WriteTimeout = -1, 
     PortName = portName, 
     BaudRate = baudRate, 
     DataBits = dataBits, 
    }; 

    try 
    { 
     serialPort.Open(); 
    } 
    catch (Exception) 
    { 
     throw new Exception("aaaaaaaaa"); 
    } 

} 

私はDelphiでそれを呼び出すと、コードは次のとおりです。

procedure OpenPort(portName: string; baudRate: integer; dataBits: integer); stdcall; 
    external 'TestDll'; 

procedure TForm3.Button11Click(Sender: TObject); 
begin 
    OpenPort('COM2', 19200, 8); 
end; 

しかし、Delphiはエラーを示しています。

External exception E0434352.

私は何をすべきか?

+0

どのデルファイバージョンですか? – Blorgbeard

+0

It's delphi XE10 Seattle @Blorgbeard –

+0

私は 'serialPort.Open();'という行にコメントすると、delphiの呼び出しでうまくいくでしょう。だから私は例外がそれによってスローされると結論づけます。 –

答えて

2

2つの間違いが見られます。

  1. Delphiのインポートの最初の引数は、DLLと一致するようにPAnsiCharと宣言する必要があります。 C#stringの既定のマーシャリングは、ANSI文字のヌル終了配列へのポインタとして使用されます。
  2. DLLは例外をスローしてはなりません。 Delphiのコードはそれをキャッチすることはできません。エラーを示す場合は、ブール値または整数の戻り値を使用してください。

E0434352と表示されている例外コードは、.net例外を示しているため、DLLが実際には実行してはならない例外をスローしていることは明らかです。

シリアルポートには、ネイティブのDelphiコードで簡単にアクセスできます。これが.netを含む唯一の理由なら、私はあなたがそれを落としてDelphiに固執する方が良いと思います。

関連する問題