2011-03-14 9 views
0

問題があります。これは構造体のCの定義です。参照型/配列を含む整列構造

typedef struct _UNIMDM_CHG_DEVCFG { 
    DWORD dwCommand; 
    LPCWSTR lpszDeviceClass; 
    LPVARSTRING lpDeviceConfig; 
    DWORD dwOption; 
    DWORD dwValue; 
} UNIMDM_CHG_DEVCFG; 

Windows CE上で.NET Compact Framework 3.5を使用しています。私は、例えば、この構造体をマーシャリングする多くの方法を試してみました:

[StructLayout(LayoutKind.Sequential)] 
internal struct UnimodemChangeDeviceConfiguration 
{ 
    public int dwCommand; 

    public byte[] lpszDeviceClass; 

    public byte[] lpDeviceConfig; 

    public int dwOption; 

    public int dwValue; 
} 

問題はこの構造体のインスタンスにMarshal.SizeOfを呼び出し、それはNotSupportedExceptionをスローする場合です。どうして?私はlpszDeviceClassの文字列を使用しようとしましたが、もう一度問題が発生しました。ポインタ型はマーシャリングできないようです。

答えて

0

CFマーシャラはこれを処理できません。構造体にはデータへのポインタが含まれています。バイト[]を送信しようとすると、データ自体を固定することはできません。

私は、最初の(LPCWSTR)を文字列またはStringBuilderとして(データが出てくるか出てくるかによって)送ることができると思います。

LPVARSTRINGはより複雑です。 OpenNETCF TAPI libraryを見ましたか? structs.csにはVarStringの実装があります。おそらく、その構造体の中で単にインターンにすることができます。

+0

私はそれを見ましたが、そのクラスは正しく書かれていません。私は自分自身を書いて、それは動作します。問題は、他の実装では、LPVARSTRINGが(構造の一部ではなく)関数に直接転送されることです。 – Bogi

関連する問題