从C#调用VC++dll中的回调函数

本文关键字:回调 函数 VC++dll 调用 | 更新日期: 2023-09-27 18:23:48

我需要从C#应用程序调用VC++dll中的回调函数。下面是VC++中的回调函数。

INT_PTR CALLBACK My_Proc(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)
{
    . . . . .   
}

我已经导入了dll,但我不知道如何从C#调用该函数。有什么想法吗?

public class testClass
{
    internal static class UnsafeNativeMethods
    {
        const string _dllLocation = "test.dll";
        [DllImport(_dllLocation, CallingConvention = CallingConvention.Cdecl)]
        public static extern int My_Proc(int value1, int value2, Int64 value3, int value4);// am getting stuck here
    }
}

从C#调用VC++dll中的回调函数

正确的声明是:

    [DllImport("test.dll", CallingConvention = CallingConvention.StdCall)]
    public static extern IntPtr My_Proc(IntPtr hDlg, int message, IntPtr wparam, IntPtr lparam);

这是本机对话框的对话框过程的声明。Windows应该调用它,而不是你。当新的Windows消息可用于对话框时,它会执行此操作。它很少从DLL中导出,这也解释了出现问题的原因。获得正确的窗口句柄(hDlg)也不容易。但你没有很好地记录你的问题,所以我只能猜测。

在VC++中,您应该使用dll句柄:

hInst = ::GetModuleHandle("test.dll");
DialogBox(hInst, MAKEINTRESOURCE(IDD_DIALOG1), NULL, My_Proc);