C#調用dll,dll中執行C#端的回調函數

----------------------------------------------------------------------------------------------------
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、執行結果:
          


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章