アンマネージコードからマネージコードの呼び出し

提供:Software Development Memo
ナビゲーションに移動 検索に移動


アンマネージコードからマネージコードの呼び出し例を以下に示します。

環境

  • 言語 : 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)