Проблема с импортом 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);