我需要以回调和其他数据的形式返回有关对象的必要信息。
这是C#上的样子:
[UnmanagedFunctionPointer(CallingConvention.Cdecl)]
public delegate void ChartAddDataCallback(IntPtr data, int size);
[StructLayout(LayoutKind.Sequential)]
public struct ChartAccessors
{
public IntPtr HWnd;
public ChartAddDataCallback addDataCallback;
}
[DllImport("CppPart.dll", CallingConvention = CallingConvention.Cdecl, EntryPoint = "GetAccessors")]
public static extern ChartAccessors GetAccessors();
C ++“镜像”版本如下:
typedef void(__cdecl *AddDataCallback) (int * data, int size);
struct ChartAccessors
{
HWND m_chartHWnd;
AddDataCallback m_addDataCallback;
};
extern "C" __declspec(dllexport) ChartAccessors GetAccessors();
用法:
static void Main(string[] args)
{
ChartAccessors accessors = GetAccessors();
}
但是,当我启动程序时,出现异常“方法的类型签名与PInvoke不兼容”。
如果我使用任何其他返回类型(例如int或float)而不是struct,它将起作用。
答案 0 :(得分:0)
Marshal.PtrToStructure实际上正在解决此问题,如Pavel所指出。
void RegisterCallbacks(IntPtr callbackPtr)
{
ChartAccessors accessors = (ChartAccessors)Marshal.PtrToStructure(callbackPtr, typeof(ChartAccessors));
// do stuff with the struct
}