С Новым годом! Форум программистов, компьютерный форум, киберфорум
C/C++: WinAPI
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.57/7: Рейтинг темы: голосов - 7, средняя оценка - 4.57
26 / 25 / 3
Регистрация: 22.01.2013
Сообщений: 273

Работа с устройством через Win API

21.06.2017, 17:12. Показов 1465. Ответов 6
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Переделываю статичный lib написанный в Builder на си шарп. Код открывает устройство и работает с ним через драйвер.
Первую функцию которая читает ключи рееста - и вызывает метод InitCard при наличии устройства я реализовал и тут не привожу... Параметр arg=0 если устройство есть.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
unsigned char InitCard(unsigned short arg)
{
    HANDLE hndarr[5] = {NULL, NULL, NULL, NULL, NULL};
    baseAddr = arg;
    CreateAccessMkioKmbo(hndarr, 5);
        int i;
        for (i=0; i<5 && !hndarr[i]; i++);
        if (i>=5) {
                SetLastError(ERROR_BAD_UNIT);
                DisplayErrorMessageBox();
                return DEVICE_NOT_FOUND;
        }
    hnd = hndarr[i];
        return PCI_BIOS_SUCCESSFUL;
}
Далее проблема. CreateFileW не отрабатывает ввиду различных ошибок. Вызов SetupDiEnumDeviceInterfaces и других API-шек пробовал со всеми видами параметров из примеров в интернете... все равно не получается.
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
void CreateAccessMkioKmbo(HANDLE *hnd, DWORD hCount)
{
    HDEVINFO devInfo;
    DWORD length,devIndex = 0;
    SP_DEVICE_INTERFACE_DATA devInterfaceData;
    PSP_DEVICE_INTERFACE_DETAIL_DATA_W devInterfaceDetailData;
    devInfo = SetupDiGetClassDevs(&guidManchKMBOInterface,NULL,NULL,DIGCF_DEVICEINTERFACE);
    devInterfaceData.cbSize = sizeof(SP_DEVICE_INTERFACE_DATA);
    while(SetupDiEnumDeviceInterfaces(devInfo,NULL,&guidManchKMBOInterface,devIndex,&devInterfaceData)
                && devIndex < hCount)
    {
        //printf("\n#%li Device found, flags :   ",devIndex);
                devIndex++;
        switch(devInterfaceData.Flags)
        {
        case SPINT_ACTIVE   :
            SetupDiGetInterfaceDeviceDetailW(devInfo,&devInterfaceData,0,0,&length,0);
            devInterfaceDetailData = (PSP_INTERFACE_DEVICE_DETAIL_DATA_W)malloc(length);
            devInterfaceDetailData->cbSize = sizeof(SP_INTERFACE_DEVICE_DETAIL_DATA_W);     
            SetupDiGetInterfaceDeviceDetailW(devInfo,&devInterfaceData,devInterfaceDetailData,length,&length,0);        
            hnd[devIndex-1] = CreateFileW(devInterfaceDetailData->DevicePath,GENERIC_READ|GENERIC_WRITE,FILE_SHARE_READ|FILE_SHARE_WRITE,0,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,0);
            break;
        case SPINT_DEFAULT  :
            //printf("DEFAULT");
            break;
        case SPINT_REMOVED  :
            //printf("REMOVED");
            break;
        }
    }   
}
Может кто опытен и сразу подскажет точку нестыковки ?
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
21.06.2017, 17:12
Ответы с готовыми решениями:

Работа с клавиатурой win api
case WM_PAINT: hdc = BeginPaint(hWnd, &amp;ps); GetClientRect(hWnd, &amp;rect); InvalidateRect(hWnd, NULL, TRUE); hdc =...

WIN API C++ Работа с FAT
Доброго времени суток. У меня задание: Программа просматривает все каталоги в поисках файлов с одинаковым именем, после чего...

Взаимодействие с устройством через usb порт
Добрый день! Есть принтер Kyocera fs4100 DN Есть программа от производителя status monitor, Которая показывает состояние принтера и...

6
Ушел с форума
Эксперт С++
 Аватар для Убежденный
16481 / 7444 / 1187
Регистрация: 02.05.2013
Сообщений: 11,616
Записей в блоге: 1
21.06.2017, 17:41
Для начала сделай полноценную проверку ошибок. С выводом причины ошибки (GetLastError и т.п.)
на экран или в лог.
0
26 / 25 / 3
Регистрация: 22.01.2013
Сообщений: 273
22.06.2017, 09:33  [ТС]
Вверху был пример исходного кода. Вот код-эквивалент который написан мною на C# в среде vs2017...
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
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
public static void CreateAccessMkioKmbo(IntPtr[] hnd, uint hCount)
        {
            IntPtr devInfo;
            int length = 0;
            uint devIndex = 0; 
            SP_DEVICE_INTERFACE_DATA devInterfaceData;
            SP_DEVINFO_DATA devInfoData = new SP_DEVINFO_DATA();
 
            devInfo = SetupDiGetClassDevs(ref KossKMBO.guidManchKMBOInterface, null, IntPtr.Zero, DIGCF_DEVICEINTERFACE);
 
            devInterfaceData = GetDevIntData();
            devInterfaceData.cbSize = Marshal.SizeOf(typeof(SP_DEVICE_INTERFACE_DATA));
            
            while (SetupDiEnumDeviceInterfaces(devInfo, null, ref guidManchKMBOInterface, (int)devIndex, devInterfaceData)
                        && devIndex < hCount)
            {
                                devIndex++;
                switch (devInterfaceData.flags)
                {
                    case SPINT_ACTIVE:
 
                        bool result1 = false;
                                    result1 = SetupDiGetDeviceInterfaceDeviceDetail(devInfo, devInterfaceData, IntPtr.Zero, 0, ref length, null);
 
                                    if (!result1)
                                    {
                                       uint ui =  GetLastError();
                                    }
 
 
                                    IntPtr DeviceInterfaceDetailData = Marshal.AllocHGlobal((int)length);
                            try
                            {
                                int size = length;
                                Marshal.WriteInt32(DeviceInterfaceDetailData, (int)size);
 
                                bool result4 = SetupDiGetDeviceInterfaceDetail(devInfo, devInterfaceData,
                                                                        DeviceInterfaceDetailData, size, ref length, devInfoData);
                                if (!result4)
                                {
                                    int error = Marshal.GetLastWin32Error();
                                }
 
              SP_DEVICE_INTERFACE_DETAIL_DATA pData =
                (SP_DEVICE_INTERFACE_DETAIL_DATA)Marshal.PtrToStructure(DeviceInterfaceDetailData, typeof(SP_DEVICE_INTERFACE_DETAIL_DATA));
 
              hnd[devIndex - 1] = CreateFile(pData.devicePath, GENERIC_READ | GENERIC_WRITE, FILE_SHARE_READ | FILE_SHARE_WRITE, 0, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0);
                               
                            }
                            finally
                            {
                                Marshal.FreeHGlobal(DeviceInterfaceDetailData);
                            }                        
                        break;
                    case SPINT_DEFAULT:                     
                        break;
                    case SPINT_REMOVED:
                        //printf("REMOVED");
                        break;
                        
                }
            }
        }
При этом все ошибки я вижу. Описание DLL импорта используемых функций вот такое(взято из примеров ...)
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
[DllImport("setupapi.dll", CharSet = CharSet.Auto)]
static extern IntPtr SetupDiGetClassDevs(
ref Guid ClassGuid,
[MarshalAs(UnmanagedType.LPTStr)] string Enumerator,
IntPtr hwndParent,
uint Flags);
[DllImport("setupapi.dll", SetLastError = true, CharSet = CharSet.Auto)]
        internal static extern bool SetupDiGetDeviceInterfaceDetail(
            IntPtr deviceInfoSet,
            ref SP_DEVICE_INTERFACE_DATA deviceInterfaceData,
            SP_DEVICE_INTERFACE_DETAIL_DATA deviceInterfaceDetailData,
            UInt32 deviceInterfaceDetailDataSize,
            out UInt32 requiredSize,
            IntPtr deviceInfoData
            );
А ошибка которая возникает на компе где устройство не установлено такая...
Помощник по отладке управляемого кода "PInvokeStackImbalance" :
"Вызов функции PInvoke "`!SpectrControl.Models.KossKMBO::SetupD iGetDeviceInterfaceDetail"
разбалансировал стек. Вероятно, это вызвано тем, что управляемая сигнатура PInvoke не совпадает
с неуправляемой целевой сигнатурой. Убедитесь, что соглашение о вызовах и параметры сигнатуры
PInvoke совпадают с неуправляемой целевой сигнатурой."
И я не могу понять толи играться с параметрами API функций то ли еще где...?
0
Ушел с форума
Эксперт С++
 Аватар для Убежденный
16481 / 7444 / 1187
Регистрация: 02.05.2013
Сообщений: 11,616
Записей в блоге: 1
22.06.2017, 11:26
Цитата Сообщение от Duzekrutov Посмотреть сообщение
CreateFileW не отрабатывает ввиду различных ошибок.
Каких, например?

Цитата Сообщение от Duzekrutov Посмотреть сообщение
При этом все ошибки я вижу.
Что у тебя возвращает, например, GetLastError() после неудачного CreateFileW?

Цитата Сообщение от Duzekrutov Посмотреть сообщение
Описание DLL импорта используемых функций вот такое
На pinvoke.net немного отличается:
C#
1
2
3
4
5
6
7
8
9
[DllImport(@"setupapi.dll", CharSet = CharSet.Auto, SetLastError = true)]
public static extern Boolean SetupDiGetDeviceInterfaceDetail(
   IntPtr hDevInfo,
   ref SP_DEVICE_INTERFACE_DATA deviceInterfaceData,
   ref SP_DEVICE_INTERFACE_DETAIL_DATA deviceInterfaceDetailData,
   UInt32 deviceInterfaceDetailDataSize,
   ref UInt32 requiredSize,
   ref SP_DEVINFO_DATA deviceInfoData
);
0
26 / 25 / 3
Регистрация: 22.01.2013
Сообщений: 273
22.06.2017, 13:15  [ТС]
Цитата Сообщение от Убежденный Посмотреть сообщение
Что у тебя возвращает, например, GetLastError() после неудачного CreateFileW?
до CreateFileW не доходит... Ошибку вызывает функция result1 = SetupDiGetDeviceInterfaceDeviceDetail. Хотя параметры вроде правильные...
error_code=1784 - то что дает GetLastError. А описание вот такое его уже давал -
"Вызов функции PInvoke "`!SpectrControl.Models.KossKMBO::SetupD iGetDeviceInterfaceDetail"
разбалансировал стек. Вероятно, это вызвано тем, что управляемая сигнатура PInvoke не совпадает
с неуправляемой целевой сигнатурой. Убедитесь, что соглашение о вызовах и параметры сигнатуры
PInvoke совпадают с неуправляемой целевой сигнатурой."

Добавлено через 8 минут
...P.S ... Изменил параметры вызова SetupDiGetDeviceInterfaceDetail на твои - ошибка такая же.
0
26 / 25 / 3
Регистрация: 22.01.2013
Сообщений: 273
23.06.2017, 14:40  [ТС]
Нашел более старый вариант своего кода. Здесь работает SetupDiEnumDeviceInterfaces но не работает SetupDiGetDeviceInterfaceDetail. Ошибка 1784.
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
public static void CreateAccessMkioKmbo(IntPtr[] hnd, uint hCount)
        {
            IntPtr devInfo;
            uint devIndex = 0;
            UInt32 length = 0; // dword
            SP_DEVICE_INTERFACE_DATA devInterfaceData;
            SP_DEVINFO_DATA devInfoData= new SP_DEVINFO_DATA();
            SP_DEVICE_INTERFACE_DETAIL_DATA devInterfaceDetailData= new SP_DEVICE_INTERFACE_DETAIL_DATA();
            ////SP_DEVICE_INTERFACE_DETAIL_DATA
            //devInfo = GetDevInfo(guidManchKMBOInterface);
            devInfo = SetupDiGetClassDevs(ref KossKMBO.guidManchKMBOInterface, null, IntPtr.Zero, DIGCF_DEVICEINTERFACE);
 
            devInterfaceData = new SP_DEVICE_INTERFACE_DATA();
            devInterfaceData.cbSize = Marshal.SizeOf (typeof(SP_DEVICE_INTERFACE_DATA));
 
            while ( SetupDiEnumDeviceInterfaces(devInfo, null, ref guidManchKMBOInterface, (int)devIndex, devInterfaceData)
                        && devIndex < hCount)
            {
                //                //printf("\n#%li Device found, flags :   ",devIndex);
                               
                switch (devInterfaceData.flags)
                {
                    case SPINT_ACTIVE:
                        IntPtr deviceInterfaceDetailData = IntPtr.Zero;
                        bool result3 =
                            SetupDiGetDeviceInterfaceDetail(devInfo, ref devInterfaceData, ref devInterfaceDetailData, 0,
                                     ref length, ref devInfoData);
После идет уже последняя и долгожданная функция CreateFile.
0
26 / 25 / 3
Регистрация: 22.01.2013
Сообщений: 273
26.06.2017, 10:26  [ТС]
Как определять SP_DEVICE_INTERFACE_DATA - как структуру или как internal class ??
Проблема собственно в заполнении именно её полей. На pinvoke.net она определена как структура но так не работает !
А когда как класс то работает...
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
26.06.2017, 10:26
Помогаю со студенческими работами здесь

API Win 32
Вообщем-то нужно определить конфигурацию компьютера посредствам функций api win 32. Какие диски, чтение каталогов... Но я не пойму, что это...

WIN API C++
Недавно заинтересовался win api, с++ знаю только по консоли и с++ билдере. У меня 2 вопроса) 1. Стоит ли учить win API, насколько он...

Win API в Windows 7
Здравствуйте! Пдскажите, пожалуйста, почему не работает следующая строка в Delphi7 procedure TFMain.Label9Click(Sender: TObject); ...

Функции WIN API
Здравствуйте. Подскажите пожалуйста где можно посмотреть реализацию некоторых функций в WIN API, например таких как DefWindowProc и...

GDI+ WIN API
Ребят все добрый день, Подскажите пожалуйста или поделитесь линком где можно подробнее почитать про GDI+ WIN API на мсдн не могу...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
Новые блоги и статьи
Модель микоризы: классовый агентный подход 3
anaschu 06.01.2026
aa0a7f55b50dd51c5ec569d2d10c54f6/ O1rJuneU_ls https:/ / vkvideo. ru/ video-115721503_456239114
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR
ФедосеевПавел 06.01.2026
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR ВВЕДЕНИЕ Введу сокращения: аналоговый ПИД — ПИД регулятор с управляющим выходом в виде числа в диапазоне от 0% до. . .
Модель микоризы: классовый агентный подход 2
anaschu 06.01.2026
репозиторий https:/ / github. com/ shumilovas/ fungi ветка по-частям. коммит Create переделка под биомассу. txt вход sc, но sm считается внутри мицелия. кстати, обьем тоже должен там считаться. . . .
Расчёт токов в цепи постоянного тока
igorrr37 05.01.2026
/ * Дана цепь постоянного тока с сопротивлениями и напряжениями. Надо найти токи в ветвях. Программа составляет систему уравнений по 1 и 2 законам Кирхгофа и решает её. Последовательность действий:. . .
Новый CodeBlocs. Версия 25.03
palva 04.01.2026
Оказывается, недавно вышла новая версия CodeBlocks за номером 25. 03. Когда-то давно я возился с только что вышедшей тогда версией 20. 03. С тех пор я давно снёс всё с компьютера и забыл. Теперь. . .
Модель микоризы: классовый агентный подход
anaschu 02.01.2026
Раньше это было два гриба и бактерия. Теперь три гриба, растение. И на уровне агентов добавится между грибами или бактериями взаимодействий. До того я пробовал подход через многомерные массивы,. . .
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост.
Programma_Boinc 28.12.2025
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост. Налог на собак: https:/ / **********/ gallery/ V06K53e Финансовый отчет в Excel: https:/ / **********/ gallery/ bKBkQFf Пост отсюда. . .
Кто-нибудь знает, где можно бесплатно получить настольный компьютер или ноутбук? США.
Programma_Boinc 26.12.2025
Нашел на реддите интересную статью под названием Anyone know where to get a free Desktop or Laptop? Ниже её машинный перевод. После долгих разбирательств я наконец-то вернула себе. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru