2010-12-31 6 views
0

PaintDelegate ^をlongに変換してrefConパラメータとして送信するにはどうすればTrackTransferCB内で一度変換して呼び出すことができますか?私がそれを代理人に戻すことができる限り、それが変換されている間は何も意味する必要はありません。C++/CLIデリゲート^を長短に変換する

これが一般的な考え方です:

PaintDelegate^ paintDel = ...; 
refCon = (long)paintDel; // This conversion doesn't work 

... 

static OSErr TrackTransferCB(Track t, long refCon) { 
    (PaintDelegate^)refCon->Invoke(); // This conversion doesn't work 
} 

変換このように動作しますか?

答えて

0

委任オブジェクトは、.NETの他の値以外の型と同様に、ガベージコレクションオブジェクトです。これは、ガベージコレクタがそれらを移動できることを意味します。つまり、アドレスを取得できない場合は、GCがヒープを圧縮するときにアドレスが変更されます。

私は、アンマネージドコードを代理人への何らかの参照を渡すためにこれを行う必要があると思います。ハンドルが典型的な解決策です。新しいオブジェクトを作成するたびにインクリメントするカウンタを保持してください。 Dictionary<int, PaintDelegate^>^に格納し、カウンタ値をアンマネージコードに渡します。

Marshal :: GetFunctionPointerForDelegate()はもう1つのアプローチです。アンマネージコードは、デリゲートターゲットを直接呼び出すことができるようになりました。長いことではなく、空白*。しかし、まだデリゲートオブジェクトを安全な場所に保管してガベージコレクションを取得する必要はありません。私は前者をお勧めします。

+0

実際には管理コードで実行され、アンマネージコードから呼び出されます。これを動作させるには静的な関数なので、私は静的でない関数を非静的な非公開のメンバーにアクセスさせたいと思っています。デリゲートの場所を固定することはできますか? – jnm2

+0

これは、GetFunctionPointerForDelegateの機能です。ターゲットインスタンスの参照を格納するための小さなサンクを作成します。ピン留めは許可されていませんが、あなたはラップトップを使って食べる危険があります。 –

+0

パフォーマンスはビデオのすべてのフレームに対してリアルタイムで呼び出されるため、この機能では非常に重要です。辞書ルックアップは十分に速いでしょうか? – jnm2

関連する問題