Проблема с импортом C++ структур - C#
Формулировка задачи:
Есть библиотека с функциями:
Структуры имеют вид:
Подключаю у себя:
Структуры объявляю у себя:
При попытке вызвать Nova_dll.DLL_NOVA_Init(CH[1], PUMPS), получаю исключение на строке вызова:
При вызове этого же метода в проекте C++ данные при дебаге заполняются так:
При вызове у меня, из С#, этого же метода заполняю данные вот так:
P.S. Работаю "программистом" ровно месяц... И уже паника достигает критической точки
extern "C" { __declspec( dllexport ) TypeDef_ERR_DLL DLL_NOVA_Init (struct s_COM_Channel *Ch, struct s_Pumps *Pumps); __declspec( dllexport ) void DLL_NOVA_DeInit (struct s_COM_Channel *Ch, struct s_Pumps *Pumps); __declspec( dllexport ) void DLL_NOVA_Work (struct s_COM_Channel *Ch, struct s_Pumps *Pumps); }
#define MAX_BUF 200 struct s_COM_Channel { BYTE NumChannel; BYTE Port; BYTE Protocol; DWORD Baudrate; HANDLE hCOM; BOOL ReadFFResult; BOOL WriteFFResult; DWORD nBytesRFF; DWORD nBytesWFF; BOOL NeedExit; BYTE NP; BYTE StatusAnswer; BYTE BUF_RX[MAX_BUF]; BYTE BUF_TX[MAX_BUF]; BYTE BUF_TEMP[MAX_BUF]; BYTE BUF_RX_TEMP[MAX_BUF]; BYTE IndexPacket; DWORD TimeOut; DWORD TimeEndPacket; DWORD TimeOprosa; BYTE CountError; BOOL RX_ENABLE; BOOL TX_ENABLE; DWORD LenRX; DWORD LenTX; DWORD LenTX_SEND; }; struct s_Pump { BYTE Channel; BYTE Adress; BYTE MaxNozzle; BYTE Property1; BYTE Property2; BYTE Property3; BYTE Property4; BYTE Property5; BYTE Property6; BYTE Property7; BYTE Property8; BYTE Property9; BYTE Property10; BYTE Property11; BYTE Property12; BYTE MaxExistNozzle; Typedef_StateBooking StateBooking; Typedef_StatePump StatePump; Typedef_StateDialog StateDialog; BYTE Status; BYTE Stop; BYTE CountError; BYTE Error; DWORD BookingL; DWORD BookingM; DWORD FulnessL; DWORD FulnessM; WORD Price; BYTE TypeBooking; #define TypeBooking_Litri 0 #define TypeBooking_Money 1 BYTE BookingNozzle; BYTE ActiveNozzle; BYTE StateNozzle[MaxNumNozzle]; BYTE ConfigNozzle[MaxNumNozzle]; }; struct s_Pumps { struct s_Pump Pump[MaxNumPump + 1]; };
public class Nova_dll { //Знаю-знаю... Ха-ха... Целый C++ проект скинул в папку Debug... Нифига не работает... Уже паникую... const string _ddlLocation = "Coder_IPZ\\Release\\DLL_NOVA.dll"; //путь подключения к DLL_NOVA [DllImport(_ddlLocation, EntryPoint = "_DLL_NOVA_Init", CharSet = CharSet.Ansi, CallingConvention = CallingConvention.Cdecl)] public static extern TypeDef_ERR_DLL DLL_NOVA_Init(s_COM_Channel Ch, s_Pumps Pumps); [DllImport(_ddlLocation, EntryPoint = "_DLL_NOVA_DeInit", CharSet = CharSet.Ansi, CallingConvention = CallingConvention.Cdecl)] public static extern void DLL_NOVA_DeInit(s_COM_Channel Ch, s_Pumps Pumps); [DllImport(_ddlLocation, EntryPoint = "DLL_NOVA_Work", CharSet = CharSet.Ansi, CallingConvention = CallingConvention.Cdecl)] public static extern void DLL_NOVA_Work(s_COM_Channel Ch, s_Pumps Pumps); }
public struct s_COM_Channel { public byte NumChannel; public byte Port; public byte Protocol; public uint Baudrate; public IntPtr hCOM; public int ReadFFResult; public int WriteFFResult; public uint nBytesRFF; public uint nBytesWFF; public int NeedExit; public byte NP; public byte StatusAnswer; public byte[] BUF_RX; public byte[] BUF_TX; public byte[] BUF_TEMP; public byte[] BUF_RX_TEMP; public byte IndexPacket; public uint TimeOut; public uint TimeEndPacket; public uint TimeOprosa; public byte CountError; public int RX_ENABLE; public int TX_ENABLE; public uint LenRX; public uint LenTX; public uint LenTX_SEND; }; public struct s_Pump { public byte Channel; public byte Adress; public byte MaxNozzle; public byte Property1; public byte Property2; public byte Property3; public byte Property4; public byte Property5; public byte Property6; public byte Property7; public byte Property8; public byte Property9; public byte Property10; public byte Property11; public byte Property12; public byte MaxExistNozzle; public int StateBooking; public int StatePump; public int StateDialog; //public Typedef_StateBooking StateBooking; //public Typedef_StatePump StatePump; //public Typedef_StateDialog StateDialog; public byte Status; public byte Stop; public byte CountError; public byte Error; public uint BookingL; public uint BookingM; public uint FulnessL; public uint FulnessM; public ushort Price; public byte TypeBooking; public byte BookingNozzle; public byte ActiveNozzle; public byte[] StateNozzle; public byte[] ConfigNozzle; }; public struct s_Pumps { public s_Pump[] Pump; };
Параметр задан неверно. (Исключение из HRESULT: 0x80070057 (E_INVALIDARG))
Решение задачи: «Проблема с импортом C++ структур»
textual
Листинг программы
public Form1() { InitializeComponent(); Application.AddMessageFilter(this); MouseWheel += (sender, args) => ProcessShape(s => s.Resize(1 + 0.1*Math.Sign(args.Delta))); } public bool PreFilterMessage(ref Message m) { if (m.Msg == 0x20a) { // WM_MOUSEWHEEL, find the control at screen position m.LParam var pos = new Point(m.LParam.ToInt32() & 0xffff, m.LParam.ToInt32() >> 16); IntPtr hWnd = WindowFromPoint(pos); if (hWnd != IntPtr.Zero && hWnd != m.HWnd && FromHandle(hWnd) != null) { SendMessage(hWnd, m.Msg, m.WParam, m.LParam); return true; } } return false; } [DllImport("user32.dll")] private static extern IntPtr WindowFromPoint(Point pt); [DllImport("user32.dll")] private static extern IntPtr SendMessage(IntPtr hWnd, int msg, IntPtr wp, IntPtr lp);
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д