- 締切済み
VC#からdll関数を使う
c#(vs2003)から、c++で書かれたdllの中に含まれる関数を読み込む部分を書いています。この関数は以下のように定義 され、構造体のポインタを返り値として返します。 SENSOR* GetSensor(); SENSOR構造体はdllの中では以下のように定義されています。 typedef struct{ int type; unsigned short param; char name[64]; DWORD con_pos; } SENSOR; これをc#のコードの中で読み込むため、c#のクラスの中で、以下のように再定義しました。 [StructLayout(LayoutKind.Sequential)] public struct SENSOR { public int type; public ushort param; public string name; public uint con_pos; } 後にc#のコードの中に、dllの中の関数を呼び出す定義を以下のように書きました。 [DllImport("sensor.dll"); public static extern SENSOR* GetSensor(); ここで SENSOR* sensor = GetSensor(); といった感じでdllをの関数を使って値を取得するようにしたのですが、実行すると 「return value をマーシャル できません : ポインタはマーシャルされた構造体を参照できません。」 といったエラーが出ます。いろいろと調べたのですが解決方法がわかりません。アドバイスをいただけたら幸いです。
- みんなの回答 (3)
- 専門家の回答
みんなの回答
- FrazerDebuMan
- ベストアンサー率50% (1/2)
この場合、戻り値はIntPtrかUIntPtrでは。 http://msdn.microsoft.com/ja-jp/library/system.intptr(v=vs.110).aspx http://msdn.microsoft.com/ja-jp/library/system.uintptr(v=vs.110).aspx
- BLUEPIXY
- ベストアンサー率50% (3003/5914)
C++で char name[64]; なら C#で byte[64] name; byte[] name = new byte[64]; じゃないんでしょうか
- xcrOSgS2wY
- ベストアンサー率50% (1006/1985)
エラーメッセージから判断するに、return valueで構造体へのポインタを返すことはできない(マーシャルができない)のでしょうね。 だとすれば SENSOR* GetSensor(); ではなく void GetSensor(SENSOR**); の形に書き直してみてはいかがでしょうか。