您的位置:首页 > 编程语言 > C#

C#调用dll,dll中执行C#端的回调函数

2014-01-16 17:14 260 查看
----------------------------------------------------------------------------------------------------
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、执行结果:


内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: