13,007
回編集
562行目: | 562行目: | ||
</source> | </source> | ||
<br><br> | <br><br> | ||
==== サンプルコード 3 ==== | |||
このセクションでは、C++ DLLのコールバック関数を渡す方法を記載する。<br> | |||
<br> | |||
まず、以下にC++ DLLを記述する。<br> | |||
<source lang="c++"> | |||
// SampleDLL.h | |||
#pragma once | |||
int __stdcall SampleCallback(int handle, int lPalam); | |||
</source> | |||
<br> | |||
<source lang="c++"> | |||
// SampleDll.cpp | |||
#include <stdio.h> | |||
#include <string.h> | |||
#include "SampleDll.h" | |||
using UnManagedCallback = bool (*)(int); | |||
int __stdcall SampleCallback(UnManagedCallback CallbackFunc, int lPalam) | |||
{ | |||
int iRet = 0; | |||
bool bRet = CallbackFunc(lPalam); | |||
if(bRet) | |||
{ | |||
iRet = 1; | |||
} | |||
else | |||
{ | |||
iRet = -1; | |||
} | |||
return iRet; | |||
} | |||
</source> | |||
<br> | |||
<source lang="c++"> | |||
// モジュール定義ファイル | |||
// SampleDll.def | |||
LIBRARY SampleDll | |||
EXPORTS | |||
; 公開する関数名をリストアップ | |||
SampleCallback @1 | |||
</source> | |||
<br> | |||
次に、C# EXEからC++ DLLを呼び出す方法を記述する。<br> | |||
<br> | |||
マネージドコールバック関数を定義する。<br> | |||
以下の例では、ManagedCallbackという匿名メソッドを宣言している。<br> | |||
SampleCallback関数に匿名メソッドを引数として渡すことで、既知のコールバック形式に自動的に変換される。<br> | |||
<source lang="c#"> | |||
using System; | |||
using System.Runtime.InteropServices; | |||
namespace ConsoleSample01 | |||
{ | |||
class Program | |||
{ | |||
[DllImport("SampleDLL.dll")] | |||
private static extern int SampleCallback(Func<int, int> x, int y); | |||
static void Main(string[] args) | |||
{ | |||
Func<int, int> ManagedCallback = (int lParam) => | |||
{ | |||
Console.Write("C++ handle is "); | |||
Console.WriteLine(lParam); | |||
return true; | |||
}; | |||
var iRet = SampleCallback(ManagedCallback, 0); | |||
} | |||
} | |||
} | |||
</source> | |||
== トラブル対処 == | == トラブル対処 == |