----------------------------------------------------------------------------------------------------
VC DLL:
/* 文件名:lib.h */
//callback of C#
#pragma once
#include <Windows.h>
#ifndef STRUCTMOD_EXPORT
#define STRUCTMOD_EXPORT extern "C" __declspec(dllimport)
#endif
//1、demo 傳遞結構體和int類型
//typedef struct _tagCardEvent {
// DWORD CardNo;
// INT32 EvtYear;
//} CardEvent, *PCardEvent;
//STRUCTMOD_EXPORT CardEvent;
//STRUCTMOD_EXPORT PCardEvent;
//typedef void CALLBACK PFNTEST(PCardEvent pce, INT32 nEvt);
//STRUCTMOD_EXPORT void CSharpCaller(PFNTEST pfnTest);
//2、cbltest
typedef void CALLBACK PFNTEST(INT32 nEvt,char * t);
STRUCTMOD_EXPORT void CSharpCaller(PFNTEST pfnTest);
/* 文件名:lib.cpp */
#include "lib.h"
#include "stdio.h"
#include "string.h"
#define STRUCTMOD_EXPORT extern "C" __declspec(dllexport)
#include <tchar.h>
//1、Demo 傳遞結構體和int類型
//void CSharpCaller(PFNTEST pfnTest) {
// CardEvent ce[2] ={1 ,2};
// if (pfnTest) (*pfnTest)(ce,_countof(ce));
//}
//2、cbltest
void CSharpCaller(PFNTEST pfnTest) {
if (pfnTest) (*pfnTest)(100,"msg from C++ dll");
}
C# 調用:
//public delegate bool MyCallBack(IntPtr p, Int32 nEvt); //定義委託函數類型 1、demo 傳遞結構體和int類型
public delegate bool MyCallBack(Int32 nEvt, string ss); //定義委託函數類型 2、cbltest
[DllImport(@".\mydll.dll", CharSet = CharSet.Ansi, SetLastError = true, ExactSpelling = true)]
public static extern int CSharpCaller(MyCallBack t);
public static bool Report(Int32 nEvt,string ss)
{
MessageBox.Show("Window handle is " + nEvt+""+ss);
return true;
}
2、調用
MyCallBack myCallBack = new MyCallBack(VideoForm.Report);
CSharpCaller(myCallBack);
3、執行結果: