2017-11-14 24 views
0

C#でC++のDLLを使用していて、char *を渡して問題が発生しました。構造体をchar *でC++のC++のdll関数に渡す

すべての機能をまず以下になります:構造体は次のように定義されて

[DllImport("xyz.dll")] 
public static extern int ReadWrite_VCP(IntPtr handle, ref DATA_BUFFER readBuffer, ref DATA_BUFFER writeBuffer, int timeout); 

public struct DATA_BUFFER 
{ 
    public string buffer; 
    [MarshalAs(UnmanagedType.U4)] 
    public int length; 
    [MarshalAs(UnmanagedType.U4)] 
    public int transferCount; 
} 

関数呼び出しは次のとおりです。一般的には

ReadWrite_VCP(handle, ref rBuffer, ref wrBuffer, 5000); 

これが正常に動作しますしかし、問題は、ReadWrite_VCP関数がchar配列( '\ 0'文字を含む)を書き込むということです。この結果、データが '\ 0' '1' '2' '3'の場合、文字列は '\ 0'で終わるので空です。

私は既に成功していないStringbuilderまたはバイト配列を使用しようとしました。 C++側の

は、関数は次のようになります。

typedef struct 
{ 
    UCHAR *buffer; 
    UINT32 length; 
    UINT32 transferCount; 
} DATA_BUFFER ; 

と機能:

unsigned int ReadWrite_VCP (HANDLE handle, DATA_BUFFER* ReadBuffer, DATA_BUFFER* writeBuffer, UINT32 timeout); 

私は誰も私を助けることができると思います!

ありがとうございました!

+0

これは文字列ではありません。これはバイト配列です。あなたは 'byte []'を考えているかもしれませんが、私はマーシャラーがマーシャリングするバイト数を教えられるかどうかは分かりません。私の推測では、最初のメンバを 'IntPtr'と宣言するのが最善の方法です。 –

答えて

0

はい、あなたはまったく正しいです!

私の構造体のように変更:

 public struct DATA_BUFFER 
    { 
     public IntPtr buffer; 
     [MarshalAs(UnmanagedType.U4)] 
     public int length; 
     [MarshalAs(UnmanagedType.U4)] 
     public int transferCount; 
    } 

と私はありがとうバイト配列を割り当て、そのポインタを設定

buf.length = 10; 
byte[] input = new byte[buf.length]; 
buf.buffer = Marshal.UnsafeAddrOfPinnedArrayElement(input, 0); 

関数を呼び出す前に!

関連する問題