Проблема с импортом 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);
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д