C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

関数の戻り値が構造体のポインタの場合


(過去ログ 5 を表示中)

[トピック内 6 記事 (1 - 6 表示)]  << 0 >>

■4995 / inTopicNo.1)  関数の戻り値が構造体のポインタの場合
  
□投稿者/ あぼがど 二等兵(1回)-(2006/07/18(Tue) 12:51:18)

分類:[C#] 


分類:[C#] 

こんにちは。
今、Cで作られたDLLをC#で使おうとしているのですがどうしてもわからないことがあります。
DLLの関数で、以下のような関数があります。

hogehoge * hoge(int a);

これをC#上で
hogehoge *b;
b = hoge(a);

こうすると、
”マネージ型のアドレスの取得、マネージ型のサイズの取得、またはマネージ型へのポインタの宣言が実行できません。”
というエラーが出てきます。
ほかにもfixedで試しましたが同じエラーでした。
fixed (PICNIC* picnic1 = PN_open(ref ip, 0, 0, 0))

解決方法はあるのでしょうか?よろしくお願いします。

0
引用返信 編集キー/
■4996 / inTopicNo.2)  Re[1]: 関数の戻り値が構造体のポインタの場合
□投稿者/ あぼがど 二等兵(2回)-(2006/07/18(Tue) 12:57:20)

分類:[C#] 

環境を書き忘れていました。
WindowsXP
MicrosoftVisualStudio.NET 2005 Express Edition
FrameWork2.0


0
引用返信 編集キー/
■4998 / inTopicNo.3)  Re[1]: 関数の戻り値が構造体のポインタの場合
□投稿者/ 名無しぃシャープ 少尉(128回)-(2006/07/18(Tue) 14:10:33)

分類:[C#] 

No4995に返信(あぼがどさんの記事)
> これをC#上で
> hogehoge *b;
> b = hoge(a);
>
> こうすると、
> ”マネージ型のアドレスの取得、マネージ型のサイズの取得、またはマネージ型へのポインタの宣言が実行できません。”
> というエラーが出てきます。

えーっ、unsafe。

0
引用返信 編集キー/
■5001 / inTopicNo.4)  Re[2]: 関数の戻り値が構造体のポインタの場合
□投稿者/ Hongliang 軍曹(66回)-(2006/07/18(Tue) 17:41:21)
Hongliang さんの Web サイト

分類:[C#] 

IntPtr で受けて Marshal.PtrToStructure 、ですかね。
// LayoutKind.Sequential な class で受けるのは無理だったかな……?

0
引用返信 編集キー/
■5002 / inTopicNo.5)  Re[3]: 関数の戻り値が構造体のポインタの場合
□投稿者/ あぼがど 二等兵(3回)-(2006/07/18(Tue) 20:58:04)

分類:[C#] 

>>名無しぃシャープさん
unsafeではうまくできませんでした。もしかしたら自分のやり方が間違ってるだけかもしれませんが。

>>Hongliangさん
> IntPtr で受けて Marshal.PtrToStructure 、ですかね。
この方法でやったら一応成功しました!ありがとうございます!

一応成功というのは、IntPtrで受け取るところまでです。
Marshal.PtrToStructureを実行するとFatalExecutionEngineErrorが検出されます。
今回の場合構造体の中身までは見る必要がないのでここまでできれば問題はないのですがなぜでしょうねぇ。
もしかしたら構造体を移植したときに変数を間違えたのかもしれません。
ちょっと今は時間がなく、原因を調べられないのでこの辺にさせてもらいます。

参考までに実例を載せておきます。
//DLLのインポート
[DllImport("PICNIC_.dll" , EntryPoint="PN_open")]
private extern static IntPtr PN_open(String ip, ushort lcd_port, ushort para_port, ushort serial_port);

//中略

IntPtr ptr = PN_open(ip, 0, 10001, 10002);
PICNIC test = (PICNIC)Marshal.PtrToStructure( ptr, typeof(PICNIC));

解決済み
引用返信 編集キー/
■5003 / inTopicNo.6)  Re[4]: 関数の戻り値が構造体のポインタの場合
□投稿者/ Hongliang 軍曹(67回)-(2006/07/18(Tue) 21:13:34)
Hongliang さんの Web サイト

分類:[C#] 

多分構造体の定義が間違ってるんでしょう。

0
引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -