Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Передача в С-функцию и возврат из С-функции указателя на структуру. Реализация для C# / 3 сообщений из 3, страница 1 из 1
19.06.2014, 12:04
    #38674071
igas
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Передача в С-функцию и возврат из С-функции указателя на структуру. Реализация для C#
Приветствую всех!
Имеется 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
19.06.2014, 12:36
    #38674166
Изопропил
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Передача в С-функцию и возврат из С-функции указателя на структуру. Реализация для C#
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
23.06.2014, 22:02
    #38677922
igas
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Передача в С-функцию и возврат из С-функции указателя на структуру. Реализация для C#
Изопропил,
Помогло, спасибо большое.
...
Рейтинг: 0 / 0
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Передача в С-функцию и возврат из С-функции указателя на структуру. Реализация для C# / 3 сообщений из 3, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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