powered by simpleCommunicator - 2.0.56     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Передача в С-функцию и возврат из С-функции указателя на структуру. Реализация для C#
3 сообщений из 3, страница 1 из 1
Передача в С-функцию и возврат из С-функции указателя на структуру. Реализация для C#
    #38674071
igas
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Приветствую всех!
Имеется dll c такими функциями
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
	enum usb_relay_device_type
	{
		USB_RELAY_DEVICE_ONE_CHANNEL = 1,
		USB_RELAY_DEVICE_TWO_CHANNEL = 2,
		USB_RELAY_DEVICE_FOUR_CHANNEL = 4,
		USB_RELAY_DEVICE_EIGHT_CHANNEL = 8	
	};
	struct usb_relay_device_info
	{
		unsigned char *serial_number;
		char *device_path;
		usb_relay_device_type type;
		usb_relay_device_info* next;
	};

	int __declspec(dllexport) usb_relay_init(void);

	struct usb_relay_device_info __declspec(dllexport) * usb_relay_device_enumerate(void);

	void __declspec(dllexport) usb_relay_device_free_enumerate(struct usb_relay_device_info*);

	int __declspec(dllexport) usb_relay_device_open_with_serial_number(const char *serial_number, unsigned len);

	int __declspec(dllexport)  usb_relay_device_open(struct usb_relay_device_info* device_info);

	int __declspec(dllexport) usb_relay_device_get_status(int hHandle, unsigned int *status);

	int __declspec(dllexport) usb_relay_device_set_serial(int hHandle, char serial[5]);


Частично реализовал импорт:
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
public class USBRelayDevice
    {
        const string _dllLocation = "usb_relay_device.dll";

        public enum usb_relay_device_type
        {
            USB_RELAY_DEVICE_ONE_CHANNEL = 1,
            USB_RELAY_DEVICE_TWO_CHANNEL = 2,
            USB_RELAY_DEVICE_FOUR_CHANNEL = 4,
            USB_RELAY_DEVICE_EIGHT_CHANNEL = 8
        }

        public unsafe struct usb_relay_device_info
        {
            public string serial_number;
            public IntPtr device_path;
            public usb_relay_device_type type;
            public IntPtr next_usb_relay_device_info;
        };

        [DllImport(_dllLocation, CallingConvention=CallingConvention.Cdecl)]
        public static extern int usb_relay_init();

        [DllImport(_dllLocation, CallingConvention=CallingConvention.Cdecl)]
        public static extern void usb_relay_device_free_enumerate(ref usb_relay_device_info strct);

        [DllImport(_dllLocation, CallingConvention=CallingConvention.Cdecl)]
        public static extern int usb_relay_device_open_with_serial_number(IntPtr serial_number, uint len);

        [DllImport(_dllLocation, CallingConvention=CallingConvention.Cdecl)]
        public static extern int  usb_relay_device_open(ref usb_relay_device_info device_info);

        [DllImport(_dllLocation, CallingConvention=CallingConvention.Cdecl)]
        public static extern int usb_relay_device_get_status(int hHandle, IntPtr status);

    }


Но есть вопросы по поводу соответствия C#-структуры C-структуре. Насколько то что я написал соответствует действительности?
И ещё как грамотно импортировать эти функции?
Код: plaintext
1.
2.
int __declspec(dllexport) usb_relay_device_set_serial(int hHandle, char serial[5]);
struct usb_relay_device_info __declspec(dllexport) * usb_relay_device_enumerate(void);
...
Рейтинг: 0 / 0
Передача в С-функцию и возврат из С-функции указателя на структуру. Реализация для C#
    #38674166
Фотография Изопропил
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
igas,

usb_relay_device_get_status - этому вторым параметром можно out uint скормить,
меньше писанины будет

что касается структур - предпочитаю строки в структурах маршаллить вручную (IntPtr объявлять)
дабы прозрачно было unicode/anisi, кто и каким API выделяет освобождает память

usb_relay_device_enumerate - я бы просто IntPtr вернул

usb_relay_device_set_serial(int hHandle, [MarshalAs(UnmanagedType.ByValArray,SizeConst=5)] char[] serial)
...
Рейтинг: 0 / 0
Передача в С-функцию и возврат из С-функции указателя на структуру. Реализация для C#
    #38677922
igas
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Изопропил,
Помогло, спасибо большое.
...
Рейтинг: 0 / 0
3 сообщений из 3, страница 1 из 1
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Передача в С-функцию и возврат из С-функции указателя на структуру. Реализация для C#
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]