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

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

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

Есть библиотека с функциями:
Листинг программы
  1. extern "C"
  2. {
  3. __declspec( dllexport ) TypeDef_ERR_DLL DLL_NOVA_Init (struct s_COM_Channel *Ch, struct s_Pumps *Pumps);
  4. __declspec( dllexport ) void DLL_NOVA_DeInit (struct s_COM_Channel *Ch, struct s_Pumps *Pumps);
  5. __declspec( dllexport ) void DLL_NOVA_Work (struct s_COM_Channel *Ch, struct s_Pumps *Pumps);
  6. }
Структуры имеют вид:
Листинг программы
  1. #define MAX_BUF 200
  2. struct s_COM_Channel
  3. {
  4. BYTE NumChannel;
  5. BYTE Port;
  6. BYTE Protocol;
  7. DWORD Baudrate;
  8. HANDLE hCOM;
  9. BOOL ReadFFResult;
  10. BOOL WriteFFResult;
  11. DWORD nBytesRFF;
  12. DWORD nBytesWFF;
  13. BOOL NeedExit;
  14. BYTE NP;
  15. BYTE StatusAnswer;
  16. BYTE BUF_RX[MAX_BUF];
  17. BYTE BUF_TX[MAX_BUF];
  18. BYTE BUF_TEMP[MAX_BUF];
  19. BYTE BUF_RX_TEMP[MAX_BUF];
  20. BYTE IndexPacket;
  21. DWORD TimeOut;
  22. DWORD TimeEndPacket;
  23. DWORD TimeOprosa;
  24. BYTE CountError;
  25. BOOL RX_ENABLE;
  26. BOOL TX_ENABLE;
  27. DWORD LenRX;
  28. DWORD LenTX;
  29. DWORD LenTX_SEND;
  30. };
  31. struct s_Pump
  32. {
  33. BYTE Channel;
  34. BYTE Adress;
  35. BYTE MaxNozzle;
  36. BYTE Property1;
  37. BYTE Property2;
  38. BYTE Property3;
  39. BYTE Property4;
  40. BYTE Property5;
  41. BYTE Property6;
  42. BYTE Property7;
  43. BYTE Property8;
  44. BYTE Property9;
  45. BYTE Property10;
  46. BYTE Property11;
  47. BYTE Property12;
  48. BYTE MaxExistNozzle;
  49.  
  50. Typedef_StateBooking StateBooking;
  51. Typedef_StatePump StatePump;
  52. Typedef_StateDialog StateDialog;
  53.  
  54. BYTE Status;
  55.  
  56. BYTE Stop;
  57.  
  58. BYTE CountError;
  59. BYTE Error;
  60. DWORD BookingL;
  61. DWORD BookingM;
  62. DWORD FulnessL;
  63. DWORD FulnessM;
  64. WORD Price;
  65. BYTE TypeBooking;
  66. #define TypeBooking_Litri 0
  67. #define TypeBooking_Money 1
  68. BYTE BookingNozzle;
  69. BYTE ActiveNozzle;
  70. BYTE StateNozzle[MaxNumNozzle];
  71. BYTE ConfigNozzle[MaxNumNozzle];
  72. };
  73. struct s_Pumps
  74. {
  75. struct s_Pump Pump[MaxNumPump + 1];
  76. };
Подключаю у себя:
Листинг программы
  1. public class Nova_dll
  2. {
  3. //Знаю-знаю... Ха-ха... Целый C++ проект скинул в папку Debug... Нифига не работает... Уже паникую...
  4. const string _ddlLocation = "Coder_IPZ\\Release\\DLL_NOVA.dll"; //путь подключения к DLL_NOVA
  5. [DllImport(_ddlLocation, EntryPoint = "_DLL_NOVA_Init", CharSet = CharSet.Ansi, CallingConvention = CallingConvention.Cdecl)]
  6. public static extern TypeDef_ERR_DLL DLL_NOVA_Init(s_COM_Channel Ch, s_Pumps Pumps);
  7. [DllImport(_ddlLocation, EntryPoint = "_DLL_NOVA_DeInit", CharSet = CharSet.Ansi, CallingConvention = CallingConvention.Cdecl)]
  8. public static extern void DLL_NOVA_DeInit(s_COM_Channel Ch, s_Pumps Pumps);
  9. [DllImport(_ddlLocation, EntryPoint = "DLL_NOVA_Work", CharSet = CharSet.Ansi, CallingConvention = CallingConvention.Cdecl)]
  10. public static extern void DLL_NOVA_Work(s_COM_Channel Ch, s_Pumps Pumps);
  11. }
Структуры объявляю у себя:
Листинг программы
  1. public struct s_COM_Channel
  2. {
  3. public byte NumChannel;
  4. public byte Port;
  5. public byte Protocol;
  6. public uint Baudrate;
  7. public IntPtr hCOM;
  8. public int ReadFFResult;
  9. public int WriteFFResult;
  10. public uint nBytesRFF;
  11. public uint nBytesWFF;
  12. public int NeedExit;
  13. public byte NP;
  14. public byte StatusAnswer;
  15. public byte[] BUF_RX;
  16. public byte[] BUF_TX;
  17. public byte[] BUF_TEMP;
  18. public byte[] BUF_RX_TEMP;
  19. public byte IndexPacket;
  20. public uint TimeOut;
  21. public uint TimeEndPacket;
  22. public uint TimeOprosa;
  23. public byte CountError;
  24. public int RX_ENABLE;
  25. public int TX_ENABLE;
  26. public uint LenRX;
  27. public uint LenTX;
  28. public uint LenTX_SEND;
  29. };
  30. public struct s_Pump
  31. {
  32. public byte Channel;
  33. public byte Adress;
  34. public byte MaxNozzle;
  35. public byte Property1;
  36. public byte Property2;
  37. public byte Property3;
  38. public byte Property4;
  39. public byte Property5;
  40. public byte Property6;
  41. public byte Property7;
  42. public byte Property8;
  43. public byte Property9;
  44. public byte Property10;
  45. public byte Property11;
  46. public byte Property12;
  47. public byte MaxExistNozzle;
  48. public int StateBooking;
  49. public int StatePump;
  50. public int StateDialog;
  51. //public Typedef_StateBooking StateBooking;
  52. //public Typedef_StatePump StatePump;
  53. //public Typedef_StateDialog StateDialog;
  54. public byte Status;
  55. public byte Stop;
  56. public byte CountError;
  57. public byte Error;
  58. public uint BookingL;
  59. public uint BookingM;
  60. public uint FulnessL;
  61. public uint FulnessM;
  62. public ushort Price;
  63. public byte TypeBooking;
  64. public byte BookingNozzle;
  65. public byte ActiveNozzle;
  66. public byte[] StateNozzle;
  67. public byte[] ConfigNozzle;
  68. };
  69. public struct s_Pumps
  70. {
  71. public s_Pump[] Pump;
  72. };
При попытке вызвать Nova_dll.DLL_NOVA_Init(CH[1], PUMPS), получаю исключение на строке вызова:
Листинг программы
  1. Параметр задан неверно. (Исключение из HRESULT: 0x80070057 (E_INVALIDARG))
При вызове этого же метода в проекте C++ данные при дебаге заполняются так:
При вызове у меня, из С#, этого же метода заполняю данные вот так:
P.S. Работаю "программистом" ровно месяц... И уже паника достигает критической точки

Решение задачи: «Проблема с импортом C++ структур»

textual
Листинг программы
  1.         public Form1()
  2.         {
  3.             InitializeComponent();
  4.             Application.AddMessageFilter(this);
  5.             MouseWheel += (sender, args) => ProcessShape(s => s.Resize(1 + 0.1*Math.Sign(args.Delta)));
  6.         }
  7.  
  8.  
  9.         public bool PreFilterMessage(ref Message m)
  10.         {
  11.             if (m.Msg == 0x20a)
  12.             {
  13.                 // WM_MOUSEWHEEL, find the control at screen position m.LParam
  14.                 var pos = new Point(m.LParam.ToInt32() & 0xffff, m.LParam.ToInt32() >> 16);
  15.                 IntPtr hWnd = WindowFromPoint(pos);
  16.                 if (hWnd != IntPtr.Zero && hWnd != m.HWnd && FromHandle(hWnd) != null)
  17.                 {
  18.                     SendMessage(hWnd, m.Msg, m.WParam, m.LParam);
  19.                     return true;
  20.                 }
  21.             }
  22.             return false;
  23.         }
  24.  
  25.         [DllImport("user32.dll")]
  26.         private static extern IntPtr WindowFromPoint(Point pt);
  27.  
  28.         [DllImport("user32.dll")]
  29.         private static extern IntPtr SendMessage(IntPtr hWnd, int msg, IntPtr wp, IntPtr lp);

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


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

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

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

Нужна аналогичная работа?

Оформи быстрый заказ и узнай стоимость

Бесплатно
Оформите заказ и авторы начнут откликаться уже через 10 минут