アンマネージコードからマネージコードの呼び出し
2010年7月11日 (日) 16:56時点におけるAdmin (トーク | 投稿記録)による版 (ページの作成: Category:その他 アンマネージコードからマネージコードの呼び出し例を以下に示します。 環境 * 言語 : Visual C++ 2008 SP1 * OS : Windows …)
アンマネージコードからマネージコードの呼び出し例を以下に示します。
環境
- 言語 : Visual C++ 2008 SP1
- OS : Windows 7 Ultimate 64bit
コード
DelegateTest.cpp
#include "stdafx.h"
#include "ManagedClass.h"
#include "UnManagedClass.h"
using namespace System;
int main(array<System::String ^> ^args)
{
ManagedClass^ m = gcnew ManagedClass();
int pointer = m->GetDelegetePointer();
UnManagedClass *um = new UnManagedClass();
um->CallMethod(pointer);
return 0;
}
ManagedClass.h
#pragma once
ref class Writer
{
public:
void Write()
{
System::Console::WriteLine("called from managed class.");
}
};
ref class ManagedClass
{
public:
delegate void CallDelegate();
ManagedClass(void)
{
}
int GetDelegetePointer()
{
// CallDelegate^ del = gcnew CallDelegate(Output); // このような書き方もできる
Writer^ w = gcnew Writer();
CallDelegate^ del = gcnew CallDelegate(w, &Writer::Write);
System::IntPtr p1 = System::Runtime::InteropServices::Marshal::GetFunctionPointerForDelegate(del);
return p1.ToInt32();
}
static void Output()
{
System::Console::WriteLine("called from managed class.");
}
};
UnManagedClass.h
#pragma once
class UnManagedClass
{
public:
UnManagedClass(void)
{
}
~UnManagedClass(void)
{
}
void CallMethod(int pointer)
{
// 関数ポインタ取得
void (*func)() = (void(__cdecl *)(void))pointer;
// 関数実行
func();
}
};
実行例
コンソール画面に「called from managed class.」と表示されます。
更新履歴
- ページ作成 -- 2010年7月11日 (日) 16:56 (UTC)