0

現在、私は2つのレイヤーで作業しています。1 つのレイヤーは C++/CLI で、もう 1 つのレイヤーはアンマネージ C++ グラフィックス ライブラリであり、ソースを持っていません。ユーザーがアンマネージ コードでマニピュレーターを動かしたときに、データをアンマネージ コードに渡し、コールバック関数 'intermediateCallback' でデータを受け取ります。

以下は、「tempFunc」と呼ばれるデリゲート型を定義する方法です。何も取り込まず、何も返しません。「intermediateCallback」の「void* userData」パラメーターは、デリゲート インスタンスに戻したいものです。このパラメーターは、void* にキャストされた IntPtr に変換されたデリゲートとして、管理されていないコードに渡されます。void* を IntPtr に戻すことはできますが、それをデリゲート型 'tempFunc' に戻すにはどうすればよいでしょうか?

delegate void tempFunc();

//the function that the delegate instance actually points to
void libCoin3D::CenterballDragger::memberCallback()
{
....
}

//the function that the unmanaged code will call and pass data to
void intermediateCallback( void * userData, SoDragger *dragger)
{
    System::IntPtr ptr=(System::IntPtr)userData;
    tempFunc^ tF=(tempFunc^)ptr;//this line does not work, I want to do something like it
}

もともと、これは、デリゲートをアンマネージ コードに渡すときにデリゲートを void* に変換した方法です。

tF が以下によって定義されるデリゲートである場合:

tempFunc^ tF=gcnew tempFunc(this,&libCoin3D::CenterballDragger::memberCallback);

私はそれを次のように変換しました:

(System::Void*)(System::Runtime::InteropServices::Marshal::GetFunctionPointerForDelegate(tF))

void* を tempFunc に変換することは可能ですか?

4

1 に答える 1

3

私はこのような同様の問題を解決します:

delegate void tempFunc();

//the function that the delegate instance actually points to
void libCoin3D::CenterballDragger::memberCallback()
{
  ....
}

//the function that the unmanaged code will call and pass data to
void __stdcall intermediateCallback( void * userData, SoDragger *dragger)
{
  using System::Runtime::InteropServices::GCHandle;
  GCHandle gch = GCHandle::FromIntPtr((System::IntPtr)userData);
  tempFunc^ tF = (tempFunc^)gch.Target;

  tF();

  gch.Free(); // If the call only once, otherwise it is necessary to keep the pointer and delete it later     

}

tempFunc^ tF = gcnew tempFunc(this, &libCoin3D::CenterballDragger::memberCallback);

 // pass to unmanaged code
setCallback( &intermediateCallback, (void*)GCHandle::ToIntPtr(GCHandle::Alloc(tF)) );
于 2012-11-02T07:16:41.663 に答える