Модераторы: Partizan, gambit
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> DeviceIOControl, передача параметров 
:(
    Опции темы
Aline
Дата 14.12.2007, 10:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 470
Регистрация: 22.7.2005
Где: Таруса

Репутация: нет
Всего: нет



Всем привет!

В программе использую функцию DeviceIOControl. Её подключение:

        [DllImport("kernel32.dll", SetLastError = true)]
        private static extern bool DeviceIoControl(IntPtr hDevice, uint dwIoControlCode, byte[] lpInBuffer, uint nInBufferSize, 
                                    byte[] lpOutBuffer, uint nOutBufferSize, out uint lpBytesReturned, IntPtr lpOverlapped);


Надо её использовать в функции:

Код

  public bool SetTimeOutCom (UInt16 b)
        {
            uint txdBytes;
            byte[] test;
            test = new byte[2];
            
            DeviceIoControl(hdrv,
                                IOCTL_SET_OUTCOM,
                                test, 2,
                                null, 0,
                                out txdBytes,
                                IntPtr.Zero);
            return true;
        }





Проблема в том, что в SetTimeOutCom передается параметр типа UInt16, а в DeviceIoControl входной буфер типа byte[]. Как это решить?
Т.е. мне в test надо засунуть значение, находящееся в параметре b
PM MAIL   Вверх
stab
Дата 14.12.2007, 10:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Экс. модератор
Сообщений: 1839
Регистрация: 1.1.2003

Репутация: 22
Всего: 48



Код

test = BitConverter.GetBytes(b);



--------------------
6, 6, 6 - the number of the beast.
PM MAIL WWW   Вверх
Aline
Дата 14.12.2007, 11:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 470
Регистрация: 22.7.2005
Где: Таруса

Репутация: нет
Всего: нет



stab, спасибо, попробую
PM MAIL   Вверх
Aline
Дата 17.12.2007, 09:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 470
Регистрация: 22.7.2005
Где: Таруса

Репутация: нет
Всего: нет



Оказывается, в функции

 DeviceIoControl(hdrv,
                                IOCTL_SET_OUTCOM,
                                in_buf, 2,
                                out_buf, 4,
                                out txdBytes,
                                IntPtr.Zero);

 in_buf и out_buf могут быть как типа byte, так и типа ushort и ulong, а как же мне это сделать, если в описании DeviceIoControl входной и выходной буферы типа byte[]


Помогите пожайлуста, никак с этим разобраться не могу...

Добавлено через 2 минуты и 15 секунд
Есть ещё такое описание:

public static extern bool DeviceIoControl( int hDevice, uint dwIoControlCode, ref long InBuffer,
                                int nInBufferSize, ref long OutBuffer, int nOutBufferSize,
                                ref int pBytesReturned, IntPtr lpOverlapped);


но я опять же не могу понять как работать   ref long InBuffer ?  А если InBuffer  не нужен?
PM MAIL   Вверх
mr.DUDA
Дата 17.12.2007, 13:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


3D-маньяк
****


Профиль
Группа: Экс. модератор
Сообщений: 8244
Регистрация: 27.7.2003
Где: город-герой Минск

Репутация: 110
Всего: 232



Цитата(Aline @  17.12.2007,  09:32 Найти цитируемый пост)
in_buf и out_buf могут быть как типа byte, так и типа ushort и ulong, а как же мне это сделать, если в описании DeviceIoControl входной и выходной буферы типа byte[]

Вариант - передавать IntPtr, потом превращать в указатель на нужный тип.


--------------------
user posted image
PM MAIL WWW   Вверх
1stain
Дата 17.12.2007, 13:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 486
Регистрация: 30.7.2007
Где: Киев - Харьков

Репутация: 8
Всего: 40



насколько я понимаю, в описании DeviceIoControl входной и выходной буферы типа void, т.е. любого типа
по-моему вам поможет метод System.Runtime.InteropServices.Marshal.Copy()


--------------------
Все знают, что это невозможно. Но вот приходит невежда, которому это неизвестно - он-то и делает открытие. (Albert Einstein)
user posted image
PM MAIL   Вверх
Aline
Дата 17.12.2007, 13:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 470
Регистрация: 22.7.2005
Где: Таруса

Репутация: нет
Всего: нет



mr.DUDA, а каким образом превращать в указатель на нужный тип?

Можно пример?

Добавлено через 1 минуту и 7 секунд
1stain, можно подробнее, для меня это темный лес... smile
PM MAIL   Вверх
tol05
Дата 17.12.2007, 13:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1632
Регистрация: 21.12.2006
Где: Харьков

Репутация: 63
Всего: 170



на www.pinvoke.net есть сигнатура перегрузки для C# и пример работы. 
Aline, ты его не пробовала использовать? 


--------------------
На хорошей работе и сны хорошие снятся.
PM MAIL   Вверх
Aline
Дата 17.12.2007, 13:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 470
Регистрация: 22.7.2005
Где: Таруса

Репутация: нет
Всего: нет



А про какой пример ты говоришь? Я толковых примеров там не нашла.

Что касается перегрузки, то я оттуда взяла по совету:

Код

        [DllImport("kernel32.dll", SetLastError = true)]
        private static extern bool DeviceIoControl(int hDevice, uint dwIoControlCode, byte [] lpInBuffer, uint nInBufferSize, 
                                    byte [] lpOutBuffer, uint nOutBufferSize, out uint lpBytesReturned, IntPtr lpOverlapped);



но только я понять не могу, если lpOutBuffer типа byte[] то как я могу получиьт данные в виде массива ulong ? У меня это в голове не укладывается

А также и lpOutBuffer нужен будет типа ushort, а описан как byte ....
PM MAIL   Вверх
tol05
Дата 17.12.2007, 14:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1632
Регистрация: 21.12.2006
Где: Харьков

Репутация: 63
Всего: 170



как не нашла? Я же линк кинул.
Цитата

C# Signature:

[DllImport("kernel32.dll", ExactSpelling = true, SetLastError = true, CharSet = CharSet.Auto)]
static extern bool DeviceIoControl(IntPtr hDevice, uint dwIoControlCode,
IntPtr lpInBuffer, uint nInBufferSize,
IntPtr lpOutBuffer, uint nOutBufferSize,
out uint lpBytesReturned, IntPtr lpOverlapped);

C# Signature:

[DllImport("Kernel32.dll", CharSet=CharSet.Auto, SetLastError=true)]
public static extern bool DeviceIoControl( IntPtr hDevice, uint dwIoControlCode, ref long InBuffer,
int nInBufferSize, ref long OutBuffer, int nOutBufferSize,
ref int pBytesReturned, [In] ref NativeOverlapped lpOverlapped);

C# Signature:

    [DllImport("Kernel32.dll", SetLastError = false, CharSet = CharSet.Auto)]
    public static extern bool DeviceIoControl(
        Microsoft.Win32.SafeHandles.SafeFileHandle hDevice,
        EIOControlCode IoControlCode,
        [MarshalAs(UnmanagedType.AsAny)]
        [In] object InBuffer,
        uint nInBufferSize,
        [MarshalAs(UnmanagedType.AsAny)]
        [out] object OutBuffer,
        uint nOutBufferSize,
        ref uint pBytesReturned,
        [In] ref System.Threading.NativeOverlapped Overlapped
    );

ни в одной сигнатуре нет массивов байт. Примеры там же, ниже. (http://www.pinvoke.net/default.aspx/kernel32/DeviceIoControl.html)


--------------------
На хорошей работе и сны хорошие снятся.
PM MAIL   Вверх
Aline
Дата 17.12.2007, 15:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 470
Регистрация: 22.7.2005
Где: Таруса

Репутация: нет
Всего: нет



скорее всего тогда сигнатура была для coredll:

Код

[DllImport("coredll.dll", EntryPoint="DeviceIoControl", SetLastError=true)]
        internal static extern int DeviceIoControlCE(
            int hDevice, 
            int dwIoControlCode, 
            byte[] lpInBuffer, 
            int nInBufferSize, 
            byte[] lpOutBuffer, 
            int nOutBufferSize, 
            ref int lpBytesReturned, 
            IntPtr lpOverlapped);


мне значит неправильно подсказали.

Тем не менее я всё равно не понимаю как с этим работать и с вышеприведенными для kernel32

Примеры для меня не совсем понятные
PM MAIL   Вверх
tol05
Дата 17.12.2007, 15:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1632
Регистрация: 21.12.2006
Где: Харьков

Репутация: 63
Всего: 170



почитай это, подставь нужные значения как параметры (но только с типами и значениями, которые указаны в перегрузке с Pinvoke) и работай. smile


--------------------
На хорошей работе и сны хорошие снятся.
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Прежде чем создать тему, посмотрите сюда:
mr.DUDA
THandle

Используйте теги [code=csharp][/code] для подсветки кода. Используйтe чекбокс "транслит" если у Вас нет русских шрифтов.
Что делать если Вам помогли, но отблагодарить помощника плюсом в репутацию Вы не можете(не хватает сообщений)? Пишите сюда, или отправляйте репорт. Поставим :)
Так же не забывайте отмечать свой вопрос решенным, если он таковым является :)


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, mr.DUDA, THandle.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Общие вопросы по .NET и C# | Следующая тема »


 




[ Время генерации скрипта: 0.0527 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.