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

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

21.06.2017, 17:12. Показов 1467. Ответов 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
Ответ Создать тему
Новые блоги и статьи
сукцессия микоризы: основная теория в виде двух уравнений.
anaschu 11.01.2026
https:/ / rutube. ru/ video/ 7a537f578d808e67a3c6fd818a44a5c4/
WordPad для Windows 11
Jel 10.01.2026
WordPad для Windows 11 — это приложение, которое восстанавливает классический текстовый редактор WordPad в операционной системе Windows 11. После того как Microsoft исключила WordPad из. . .
Classic Notepad for Windows 11
Jel 10.01.2026
Old Classic Notepad for Windows 11 Приложение для Windows 11, позволяющее пользователям вернуть классическую версию текстового редактора «Блокнот» из Windows 10. Программа предоставляет более. . .
Почему дизайн решает?
Neotwalker 09.01.2026
В современном мире, где конкуренция за внимание потребителя достигла пика, дизайн становится мощным инструментом для успеха бренда. Это не просто красивый внешний вид продукта или сайта — это. . .
Модель микоризы: классовый агентный подход 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 законам Кирхгофа и. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru