C#调用MFCdll里面的回调函数

.h文件如下
#include "StdAfx.h"

#ifdef RTWRE_EXPORTS
#define RTWRE_API __declspec(dllexport)
#else
#define RTWRE_API __declspec(dllimport)
#ifdef _DEBUG
#pragma comment(lib,"FunctionDll.lib")
#else
#pragma comment(lib,"FunctionDll.lib")
#endif
#endif

//int MarkID——标志点ID号,1——角点,2——边点
//向量 double Va, double Vb, double Vc
typedef void (CALLBACK * CHECKCLCFUNCTION) (int MarkID, double Va, double Vb,double Vc);

CHECKCLCFUNCTION m_pCheckFunction; //回调函数指针

//返回input+2
extern "C" RTWRE_API int FDllTest(int input);
//设置回调函数
/*
SetCheckFunctionPoint
功 能
设置回调函数。
格 式
void SetCheckFunctionPoint(CHECKFUNCTION1 pCheckFuntion);
参 数
CHECKFUNCTION1 pCheckFuntion 回调函数名,具体定义见回调函数说明
返 回 值

*/
extern "C" RTWRE_API void SetCheckFunctionPoint(CHECKCLCFUNCTION pCheckFuntion);

具体调用的函数如下

图片说明

C#代码

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.Runtime.InteropServices;

namespace CSharpCallBackC
{

//FunctionDll.dll
[UnmanagedFunctionPointer(CallingConvention.Cdecl)]  
    public delegate void ControlData(int a, double b,double c,double d);  

    [DllImport(@"FunctionDll.dll", EntryPoint = "SetCheckFunctionPoint",  CallingConvention = CallingConvention.Cdecl)]  

public partial class Form1 : Form
{
    public Form1()
    {
        InitializeComponent();
    }
}

}

主要问题在于最后声明函数的时候不会写,在 public static extern 语句后面总会报错,还有就是如果使用结构体应该怎么写。

2个回答

[DllImport(@"FunctionDll.dll", EntryPoint = "SetCheckFunctionPoint", CallingConvention = CallingConvention.Cdecl)]

下面函数定义没有了。

另外你确认是cdecl么?dll导出函数一般是stdcall

mo2223155
mo2223155 你好,就是因为函数定义不会写。之前写过C#调用Windows API,在写函数定义的时候写的不对。
接近 2 年之前 回复

void SetCheckFunctionPoint(ControlData pCheckFuntion);
就是这样写

caozhy
贵阳老马马善福专业维修游泳池堵漏防水工程 回复mo2223155: 谢谢你。其实我只希望采纳就好。然而不知道为什么,现在不悬赏分就不能提问了。
接近 2 年之前 回复
mo2223155
mo2223155 回复caozhy: 谢谢大神,分已给。
接近 2 年之前 回复
caozhy
贵阳老马马善福专业维修游泳池堵漏防水工程 回复mo2223155: 你定义一个函数,和这个委托类型的参数,返回值一致。里面是你的响应代码。把函数名作为参数传给SetCheckFunctionPoint。
接近 2 年之前 回复
mo2223155
mo2223155 回复caozhy: 那我这边怎么在C++调用的时候做一些响应,把要执行的操作写在哪个函数里面?
接近 2 年之前 回复
caozhy
贵阳老马马善福专业维修游泳池堵漏防水工程 回复mo2223155: 回调函数,是c++那一方调用的,不是你调用的。
接近 2 年之前 回复
mo2223155
mo2223155 大神,最后一个问题。 public delegate void ControlData(int a, double b,double c,double d);调用函数的时候参数怎么传递?
接近 2 年之前 回复
caozhy
贵阳老马马善福专业维修游泳池堵漏防水工程 回复mo2223155: 你要把这几行写在一个class里面,比如public partial class Form1 : Form { 下面。
接近 2 年之前 回复
mo2223155
mo2223155 函数定义的时候报错 void 应输入class、delegate、enum、interface 或 struct
接近 2 年之前 回复
Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!