「ライブラリの基礎 - C++DLL」の版間の差分

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>


== トラブル対処 ==
== トラブル対処 ==