Почему это не работает?
От: Lopcom  
Дата: 13.12.02 12:14
Оценка:
Ну гуру, помогите. Почему не работает эта прога?


#include <windows.h>
#include <setupapi.h>
#include <stdio.h>
#include <conio.h>

int main(int argc, char* argv[])
{
    HDEVINFO hDI;
    SP_DEVICE_INTERFACE_DATA did;
    SP_DEVINFO_DATA dd;
    DWORD i;
    TCHAR name[256];
    HKEY hKey;
    LONG ret;

    printf("Detecting serial ports...\n");

    hDI = SetupDiGetClassDevs(&GUID_DEVINTERFACE_SERENUM_BUS_ENUMERATOR, NULL, NULL, DIGCF_DEVICEINTERFACE|DIGCF_PRESENT);
    if (hDI==INVALID_HANDLE_VALUE) printf("SetupDiGetClassDevs return 0");

    did.cbSize = sizeof(SP_DEVICE_INTERFACE_DATA);
    dd.cbSize = sizeof(SP_DEVINFO_DATA);
    for(i=0;;i++)
    {
        if (!SetupDiEnumDeviceInterfaces(hDI, NULL, &GUID_DEVINTERFACE_SERENUM_BUS_ENUMERATOR, i, &did))
        {
            if (GetLastError()==ERROR_NO_MORE_ITEMS) break;
            else printf("SetupDiEnumDeviceInterfaces return 0");
        }
        if (!SetupDiGetDeviceInterfaceDetail(hDI, &did, NULL, 0, NULL, &dd))
        {
            if (GetLastError()!=ERROR_INSUFFICIENT_BUFFER) printf("SetupDiGetDeviceInterfaceDetail return 0");
        }
        if (!SetupDiGetDeviceRegistryProperty(hDI, &dd, SPDRP_FRIENDLYNAME, NULL, name, 256, NULL)) printf("SetupDiGetDeviceRegistryProperty return 0");
        printf("%s\n", name);

        hKey = SetupDiOpenDeviceInterfaceRegKey(hDI, &did, 0, KEY_READ);
        if (hKey==INVALID_HANDLE_VALUE)
        {
            printf("SetupDiOpenDeviceInterfaceRegKey return INVALID_HANDLE_VALUE\n");
            printf("GetLastError() return %u\n", GetLastError());
            return 0;
        }

        ret = RegCloseKey(hKey);
        if (ret) printf("RegCloseKey return %i", ret);
    }

    if (!SetupDiDestroyDeviceInfoList(hDI)) printf("SetupDiDestroyDeviceInfoList return 0");

    printf("Detection complete.\n");
    _getch();

    return 0;
}


SetupDiOpenDeviceInterfaceRegKey возвращает INVALID_HANDLE_VALUE.
GetLastError возвращает ERROR_FILE_NOT_FOUND.

{Вставлять в проект как обычное консольное Win32
приложение на C, и линковать с setupapi.lib.}
Re: Почему это не работает?
От: Pimanov Sergey  
Дата: 13.12.02 12:30
Оценка:
Здравствуйте, Lopcom, Вы писали:

L>Ну гуру, помогите. Почему не работает эта прога?


L> hDI = SetupDiGetClassDevs(&GUID_DEVINTERFACE_SERENUM_BUS_ENUMERATOR, NULL, NULL, DIGCF_DEVICEINTERFACE|DIGCF_PRESENT);


L>{Вставлять в проект как обычное консольное Win32

L>приложение на C, и линковать с setupapi.lib.}

Не могу откомпилить — нет описания GUID_DEVINTERFACE_SERENUM_BUS_ENUMERATOR
Re[2]: Почему это не работает?
От: Lopcom  
Дата: 13.12.02 12:51
Оценка:
PS>Не могу откомпилить — нет описания GUID_DEVINTERFACE_SERENUM_BUS_ENUMERATOR

Скорее всего у тебя чистый VC6.0 со старыми *.h. Поставь себе MS Platform SDK и настрой Studio на использование его *.h.

Или можешь просто вписать в исходник:

DEFINE_GUID(GUID_DEVINTERFACE_SERENUM_BUS_ENUMERATOR, 0x4D36E978L, 0xE325, 0x11CE, 0xBF, 0xC1, 0x08, 0x00, 0x2B, 0xE1, 0x03, 0x18);


если ставить SDK лень.
Re[3]: Неужели никто не знает? :(
От: Lopcom  
Дата: 13.12.02 17:14
Оценка:
Re[4]: Неужели никто не знает? :(
От: Pimanov Sergey  
Дата: 15.12.02 08:16
Оценка:
Здравствуйте, Lopcom, Вы писали:

L>


Можно вызвать что-то типа
SetupDiGetDeviceRegistryProperty(hDI, &dd, SPDRP_DRIVER, NULL, (PBYTE)&name, 256, NULL)
получить name = "{4D36E978-E325-11CE-BFC1-08002BE10318}\0001"

и получить HKEY самому
"HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Class\" + name
Re[5]: Неужели никто не знает? :(
От: Lopcom  
Дата: 16.12.02 19:35
Оценка:
PS>Можно вызвать что-то типа
PS>SetupDiGetDeviceRegistryProperty(hDI, &dd, SPDRP_DRIVER, NULL, (PBYTE)&name, 256, NULL)
PS>получить name = "{4D36E978-E325-11CE-BFC1-08002BE10318}\0001"

PS>и получить HKEY самому

PS>"HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Class\" + name

Не... это не подходит, так как должно работать не только на NT. Я уже нашёл решение, дело было в том, что я пытался получить ключ реестра с настройками для "интерфейса", а такого ключа дейстивельно нет. Мне нужно было получать на самом деле ключ самого "устройства". И, соответственно, использовать совсем другие функции. Что я успешно и сделал.

Однако, в любом случае, спасибо за ответ.
Re[6]: Неужели никто не знает? :(
От: assad Россия  
Дата: 22.03.05 14:26
Оценка:
Здравствуйте, Lopcom, Вы писали:

L>Не... это не подходит, так как должно работать не только на NT. Я уже нашёл решение, дело было в том, что я пытался получить ключ реестра с настройками для "интерфейса", а такого ключа дейстивельно нет. Мне нужно было получать на самом деле ключ самого "устройства". И, соответственно, использовать совсем другие функции. Что я успешно и сделаа что за функции?
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.