SetupDiGetClassDevs - USB-устройства - Получить имя, отображаемое на USB-устройствах, от deviceinstanceid? - PullRequest
0 голосов
/ 02 ноября 2018

У меня подключен принтер, у которого нет драйвера и он не отображается под принтерами, но он отображается в разделе «Пуск-> Настройки-> Bluetooth и другие устройства» с именем «SRP300».

Я могу отправить данные на принтер с помощью следующей процедуры (см. Здесь: https://www.levelextreme.com/ViewPageGenericLogin.aspx?LoadContainer=1&NoThread=1157607), где он получает идентификатор экземпляра устройства и Guid - но я просто не могу выяснить, где я могу получить имя от "SP300"?

Как мне будет нужно позвонить, как только я найду ГУИД? лучше всего было бы, если бы я мог искать имя для начала, и если SP300 найден, тогда получить идентификатор экземпляра / guid, но я пробовал разные способы перечисления, чтобы получить то имя, которое отображается, но ничто не производит его?

Если я проверяю реестр, я вижу, что он сгруппирован по USB, а затем в папке с именем USBPRINT, а затем в папке 00000001 и там есть имя, но интересно, как я могу получить это с помощью вызовов Win API?

int test2()
{
int           MemberIndex = 0;
LONG          Result = 0;
DWORD         Length = 0;
HANDLE        hDevInfo;
ULONG         Required;

HANDLE m_hComm=NULL;

PSP_DEVICE_INTERFACE_DETAIL_DATA detailData = NULL;

SP_DEVICE_INTERFACE_DATA  devInfoData;

hDevInfo = SetupDiGetClassDevs((LPGUID)&(USB_PRINT), NULL, NULL, DIGCF_PRESENT | DIGCF_INTERFACEDEVICE);

if (hDevInfo == INVALID_HANDLE_VALUE)
{

    printf("No hardware device");
    return 0;
}

devInfoData.cbSize = sizeof(SP_DEVICE_INTERFACE_DATA);

//Step through the available devices looking for the one we want. 
do
{
    //[1]
    Result = SetupDiEnumDeviceInterfaces(hDevInfo, 0, (LPGUID)&(USB_PRINT), MemberIndex, &devInfoData);
    if (Result != 0)
    {
        SetupDiGetDeviceInterfaceDetail(hDevInfo, &devInfoData, NULL, 0, &Length, NULL);
        //Allocate memory for the hDevInfo structure, using the returned Length.

        detailData = (PSP_DEVICE_INTERFACE_DETAIL_DATA)new BYTE[Length * 4];
        //Set cbSize in the detailData structure.

        detailData->cbSize = sizeof(SP_DEVICE_INTERFACE_DETAIL_DATA);
        //Call the function again, this time passing it the returned buffer size.

        if (SetupDiGetDeviceInterfaceDetail(hDevInfo, &devInfoData, detailData, Length, &Required, NULL) == TRUE)
        {
            m_hComm = CreateFile(detailData->DevicePath,
                GENERIC_READ | GENERIC_WRITE,
                NULL,
                NULL,
                OPEN_EXISTING, 0, NULL);
            if (m_hComm != INVALID_HANDLE_VALUE)
            {
                //Result = 0;
                printf("USB port Available");
            }
            CloseHandle(m_hComm);
        }
        delete(detailData);
    }
    MemberIndex = MemberIndex + 1;

} while (Result != 0);

SetupDiDestroyDeviceInfoList(hDevInfo);

printf("%u\r\n", MemberIndex);
;
return 0;
}

1 Ответ

0 голосов
/ 05 ноября 2018

Если значение параметра перечисления не используется для выбора устройств, присвойте Enumerator значение NULL, а когда Enumerator равен NULL, SetupDiGetClassDevs возвращает устройства для всех перечислителей PnP. Вы можете установить этот параметр, будь то глобальный уникальный идентификатор (GUID) значения или символическое имя.

Для получения дополнительной информации вы можете обратиться к этому документу ниже.

https://docs.microsoft.com/en-us/windows/desktop/api/setupapi/nf-setupapi-setupdigetclassdevsw

С наилучшими пожеланиями,

Барон Би

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...