Проблема с импортом C++ структур - C#

Узнай цену своей работы

Формулировка задачи:

Есть библиотека с функциями:
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;                     
    };
При попытке вызвать Nova_dll.DLL_NOVA_Init(CH[1], PUMPS), получаю исключение на строке вызова:
Параметр задан неверно. (Исключение из HRESULT: 0x80070057 (E_INVALIDARG))
При вызове этого же метода в проекте C++ данные при дебаге заполняются так:
При вызове у меня, из С#, этого же метода заполняю данные вот так:
P.S. Работаю "программистом" ровно месяц... И уже паника достигает критической точки

Решение задачи: «Проблема с импортом 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);

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

12   голосов , оценка 3.75 из 5