Мне нужно вернуть необходимую информацию об объекте в виде структуры с обратными вызовами и другими данными.
Вот как это выглядит на стороне 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.