HIRASE CONNECTION WK

programming collection

目次

Blog 利用状況

ニュース

あわせて読みたいブログパーツ

書庫

日記カテゴリ

Link Collection

2008年6月9日 #

[C++/CLI] アンマネージのコールバックにマネージのメソッドを登録する。

こんな方法は・・・・・・・

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

posted @ 21:34 | Feedback (2)