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

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

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

Re[4]: void*からManaged型へのキャスト


(過去ログ 91 を表示中)

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

■54724 / inTopicNo.1)  void*からManaged型へのキャスト
  
□投稿者/ hirokawa (1回)-(2010/10/30(Sat) 19:17:14)

分類:[C++/CLI] 

2010/10/30(Sat) 19:18:00 編集(投稿者)
初めて投稿させていただきます

早速質問なのですが,引数にvoid*型のポインタを持つ関数内で,
自分で定義したManagedなクラスのポインタに引数のポインタを変換し,
以下のようにクラス内のメンバにポインタを介してアクセスしたいと考えています.

void Function(void* _p)
{
    MyClass^ p = (MyClass^)_p;
    
    p->member1 = a;
    p->member2 = b;
}

配列や文字列におけるマネージ型とアンマネージ型の変換の方法は理解しましたが,
この一見単純そうなキャスト?の方法がどうしても発見出来ません.

どなたか御存知の方いらっしゃいましたら何卒御教授お願いします.

開発環境はVisualStudio2010,使用言語はもちろんC++/CLIです.


引用返信 編集キー/
■54725 / inTopicNo.2)  Re[1]: void*からManaged型へのキャスト
□投稿者/ επιστημη (2570回)-(2010/10/30(Sat) 19:38:06)
επιστημη さんの Web サイト
> 自分で定義したManagedなクラスのポインタに引数のポインタを変換し,
> 以下のようにクラス内のメンバにポインタを介してアクセスしたいと考えています.

てかそもそもmanaged-handleはポインタに変換可能なの?
gcroot<T^>とかなら使うんですけどねー

引用返信 編集キー/
■54726 / inTopicNo.3)  Re[2]: void*からManaged型へのキャスト
□投稿者/ hirokawa (2回)-(2010/10/30(Sat) 19:53:42)
No54725 (επιστημη さん) に返信
>>自分で定義したManagedなクラスのポインタに引数のポインタを変換し,
>>以下のようにクラス内のメンバにポインタを介してアクセスしたいと考えています.
>
> てかそもそもmanaged-handleはポインタに変換可能なの?
> gcroot<T^>とかなら使うんですけどねー
>

早速の返答有難う御座います

Managed Handleとはマネージ型のオブジェクトに対するポインタのようなものという理解でしたが,
実際は見た目以上に違うものなのでしょうか.
最近C++/CLIの勉強を始めたもので,不勉強で申し訳ないです.

ポインタの変換にこだわらず所望の操作が実現出来れば問題ありません.

このような問題は,例えばネイティブコードを.NET用に変換する際に
よく起こりそうなものですが,皆さんはどうしているのでしょうか?

よろしくお願いします
引用返信 編集キー/
■54727 / inTopicNo.4)  Re[3]: void*からManaged型へのキャスト
□投稿者/ Azulean (633回)-(2010/10/30(Sat) 20:50:21)
No54726 (hirokawa さん) に返信
> Managed Handleとはマネージ型のオブジェクトに対するポインタのようなものという理解でしたが,
> 実際は見た目以上に違うものなのでしょうか.

^ は Handle to Object on Managed Heap と定義されており、ポインタとは異なる存在です。
感覚的にはポインタのようなものですが、実態は異なります。
http://msdn.microsoft.com/en-us/library/yk97tc08.aspx

マネージヒープ内のオブジェクトはガベージコレクションの際に移動される可能性があります。
従って、ネイティブなポインタは固定しない限り、取り出せないものとされています。

詳しくはこのあたりをご覧ください。
http://msdn.microsoft.com/ja-jp/library/bb985010.aspx
http://msdn.microsoft.com/ja-jp/library/dd297765.aspx


> このような問題は,例えばネイティブコードを.NET用に変換する際に
> よく起こりそうなものですが,皆さんはどうしているのでしょうか?
完全に C++/CLI にして良い関数なら、void* なんて渡さずに、Object 型で渡したら良いと思います。
場合によってはデリゲートと Marshal::GetFunctionPointerForDelegate の組み合わせもありかもしれません。
場面によって方法は異なるかもしれませんが、void* でマネージャオブジェクトを渡さない方法を目指すべきです。

あとは、すべて C++/CLI にするんじゃなくて、必要な部分だけ C++/CLI でラッパーを作って、ネイティブのコードはネイティブのままにしておくとか。
引用返信 編集キー/
■54728 / inTopicNo.5)  Re[4]: void*からManaged型へのキャスト
□投稿者/ hirokawa (3回)-(2010/10/30(Sat) 21:33:23)
No54727 (Azulean さん) に返信
> ■No54726 (hirokawa さん) に返信
>>Managed Handleとはマネージ型のオブジェクトに対するポインタのようなものという理解でしたが,
>>実際は見た目以上に違うものなのでしょうか.
>
> ^ は Handle to Object on Managed Heap と定義されており、ポインタとは異なる存在です。
> 感覚的にはポインタのようなものですが、実態は異なります。
> http://msdn.microsoft.com/en-us/library/yk97tc08.aspx
>
> マネージヒープ内のオブジェクトはガベージコレクションの際に移動される可能性があります。
> 従って、ネイティブなポインタは固定しない限り、取り出せないものとされています。
>
> 詳しくはこのあたりをご覧ください。
> http://msdn.microsoft.com/ja-jp/library/bb985010.aspx
> http://msdn.microsoft.com/ja-jp/library/dd297765.aspx
回答有難う御座います
参考にさせていただきます


>>このような問題は,例えばネイティブコードを.NET用に変換する際に
>>よく起こりそうなものですが,皆さんはどうしているのでしょうか?
> 完全に C++/CLI にして良い関数なら、void* なんて渡さずに、Object 型で渡したら良いと思います。
> 場合によってはデリゲートと Marshal::GetFunctionPointerForDelegate の組み合わせもありかもしれません。
> 場面によって方法は異なるかもしれませんが、void* でマネージャオブジェクトを渡さない方法を目指すべきです。
>
> あとは、すべて C++/CLI にするんじゃなくて、必要な部分だけ C++/CLI でラッパーを作って、ネイティブのコードはネイティブのままにしておくとか。
なるほど.元の引数の型を変えるという発想はありませんでした.
関数間の呼び出し関係を整理して必要な部分だけCLIでラッパーを作るという方向でいこうと思います.

回答してくださった皆様,有難う御座いました.

解決済み
引用返信 編集キー/


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

このトピックに書きこむ

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

管理者用

- Child Tree -