参数中带有函数指针结构的 C++ dll Pinvoke 函数
C++ dll Pinvoke function with function pointer struct in parameter
我正在编写使用 C++ dll 的 C# 代码
C++ dll 的一个函数在参数中采用 3 个函数指针的结构,我不知道如何管理它任何提示或主题?
我试过了,但这不起作用:
[StructLayout(LayoutKind.Sequential)]
public class DisplayCallBacks
{
[MarshalAs(UnmanagedType.FunctionPtr)] initProgressBar ();
[MarshalAs(UnmanagedType.FunctionPtr)] logMessage (int msgType, [MarshalAs(UnmanagedType.LPCWStr)] String str);
[MarshalAs(UnmanagedType.FunctionPtr)] loadBar (int x, int n);
}
[DllImport("CubeProgrammer_API.dll", CallingConvention = CallingConvention.Cdecl, EntryPoint = "setDisplayCallbacks")]
internal static extern void SetDisplayCallbacks(DisplayCallBacks c);
C++ 原型:
typedef struct displayCallBacks
{
void (*initProgressBar)();
void (*logMessage)(int msgType, const wchar_t* str);
void (*loadBar)(int x, int n);
} displayCallBacks;
void setDisplayCallbacks(displayCallBacks c);
使用IntPtr
作为函数指针的类型。
然后你可以声明一个委托。这是我编写的代码示例:
[UnmanagedFunctionPointer(CallingConvention.Cdecl)]
delegate void PrintLogDelegate(string msg);
PrintLogDelegate pld;
System.Runtime.InteropServices.GCHandle callbackPrintLog;
IntPtr ipCBPrintLog = IntPtr.Zero;
pld = new PrintLogDelegate(PrintLogFunc);
callbackPrintLog = System.Runtime.InteropServices.GCHandle.Alloc(pld);
ipCBPrintLog = System.Runtime.InteropServices.Marshal.GetFunctionPointerForDelegate(pld);
void PrintLogFunc(string msg)
{
}
所以 ipCBPrintLog
是您作为回调传递给 C++ 的内容。
然后在你的Dispose
中你必须清理:callbackPrintLog.Free();
我正在编写使用 C++ dll 的 C# 代码
C++ dll 的一个函数在参数中采用 3 个函数指针的结构,我不知道如何管理它任何提示或主题?
我试过了,但这不起作用:
[StructLayout(LayoutKind.Sequential)]
public class DisplayCallBacks
{
[MarshalAs(UnmanagedType.FunctionPtr)] initProgressBar ();
[MarshalAs(UnmanagedType.FunctionPtr)] logMessage (int msgType, [MarshalAs(UnmanagedType.LPCWStr)] String str);
[MarshalAs(UnmanagedType.FunctionPtr)] loadBar (int x, int n);
}
[DllImport("CubeProgrammer_API.dll", CallingConvention = CallingConvention.Cdecl, EntryPoint = "setDisplayCallbacks")]
internal static extern void SetDisplayCallbacks(DisplayCallBacks c);
C++ 原型:
typedef struct displayCallBacks
{
void (*initProgressBar)();
void (*logMessage)(int msgType, const wchar_t* str);
void (*loadBar)(int x, int n);
} displayCallBacks;
void setDisplayCallbacks(displayCallBacks c);
使用IntPtr
作为函数指针的类型。
然后你可以声明一个委托。这是我编写的代码示例:
[UnmanagedFunctionPointer(CallingConvention.Cdecl)]
delegate void PrintLogDelegate(string msg);
PrintLogDelegate pld;
System.Runtime.InteropServices.GCHandle callbackPrintLog;
IntPtr ipCBPrintLog = IntPtr.Zero;
pld = new PrintLogDelegate(PrintLogFunc);
callbackPrintLog = System.Runtime.InteropServices.GCHandle.Alloc(pld);
ipCBPrintLog = System.Runtime.InteropServices.Marshal.GetFunctionPointerForDelegate(pld);
void PrintLogFunc(string msg)
{
}
所以 ipCBPrintLog
是您作为回调传递给 C++ 的内容。
然后在你的Dispose
中你必须清理:callbackPrintLog.Free();