こんな方法は・・・・・・・
using namespace System;
#pragma unmanaged
// コールバック関数の型
typedef int (__stdcall *CallbackFuncType)(int, float);
// コールバック関数
static CallbackFuncType g_func;
// コールバック関数の登録
void SetCallback(CallbackFuncType f)
{
g_func = f;
}
// コールバック関数の呼び出し。
int Run()
{
return g_func(10, 0.5f);
}
#pragma managed
int __stdcall MyFunc(int i, float f)
{
Console::WriteLine(i.ToString());
return static_cast<int>(i * f);
}
int main(array<System::String ^> ^args)
{
// Callback登録(マネージ関数を登録・・)
SetCallback(MyFunc);
// GCしても大丈夫かを確認(登録した関数ポインタがGCされる・・ない)
GC::Collect(2, GCCollectionMode::Forced);
// コールバックをネイティブ関数に呼び出してもらう(GCされてたら死亡)
Int32 ret = Run();
Console::WriteLine(ret.ToString());
return 0;
}
これって、どうなんだろう。実行は問題ないんだけど。。
MSDN「方法 : C++ Interop を使用してコールバックおよびデリゲートをマーシャリングする」とは違う方法で、Marshal::GetFunctionPointerForDelegate() も使わないんだけど・・・。
何かご存じの方、、ヘルプミー。
See Also