Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > .NET для новичков > Получение имени устройства


Автор: Sonechka 6.2.2012, 11:22
Доброго времени суток, уважаемые! Имеется у меня исходник на Delphi, который выводит список всех устройств в TreeView, как в "Диспетчере устройств", дополнительно выводит в  ListBox сетевые устройства и дисковые накопители. Ввиду того, что мной изучался Delphi (давненько по программистским меркам это и было), а он сейчас (да и тогда) был не актуален, появилось у меня желание овладеть C++. Начала не с самых азов (все языки ведь похожи). Начала с простого, стала переписывать более-менее понятный мне код. Для начала, переписала кнопочки для вывода сетевых и дисковых устройств в соответствующие ListBox'ы, но в обоих обработчиках события OnClick есть функция GetDeviceName (понятно из названия зачем она), а перевести её не могу. Ниже привожу пример её, написанной на Delphi (вроде она простая, понять не трудно будет):

Код

function GetDeviceName(PnPHandle: HDEVINFO; const DevData: TSPDevInfoData): string;
var
  BytesReturned: DWORD;
  RegDataType: DWORD;
  Buffer: array [0..256] of CHAR;
begin
  BytesReturned := 0;
  RegDataType := 0;
  Buffer[0] := #0;
  SetupDiGetDeviceRegistryProperty(PnPHandle, DevData, SPDRP_FRIENDLYNAME,
    RegDataType, PByte(@Buffer[0]), SizeOf(Buffer), BytesReturned);
  Result := Buffer;
  if Result<>'' then exit;
  BytesReturned := 0;
  RegDataType := 0;
  Buffer[0] := #0;
  SetupDiGetDeviceRegistryProperty(PnPHandle, DevData, SPDRP_DEVICEDESC,
    RegDataType, PByte(@Buffer[0]), SizeOf(Buffer), BytesReturned);
  Result:=Buffer;
end;


Собственно о том, что может быть непонятно в коде (сама этого не помню, специально искала):
#0 - признак окончания строки;
@ - адрес переменной;

Дополнительно привожу пример обработчика кнопки для вывода дисковых устройств. Ещё подумаете, что за халявой пришла smile. А я не за халявой, а чтобы показали и объяснили smile Я учиться хочу , но без помощи не получается.

Код

                 /* ------------------ ДЛЯ ДИСКОВЫХ УСТРОЙСТВ ------------------ */
        private: System::Void button7_Click(System::Object^  sender, System::EventArgs^  e) {
                // Импровизированный раздел описания переменных (НАД ЭТИМ НЕ СМЕЙТЕСЬ, ПРОСТО МНЕ ТАК УДОБНО, Я К ДЕЛЬФЯМ ПРИВЫКШИЙ)
                HDEVINFO DrivePnPHandle; // Этот, да и все остальные типы данных описаны соответственно в setupapi.h
                DWORD DeviceNumber;
                PSP_DEVINFO_DATA DevData;
                PSP_DEVICE_INTERFACE_DATA  DeviceInterfaceData;
                BOOL RES; 
                
                // Раздел кода программы
                DrivesListBox->Items->Clear();
                DrivePnPHandle = SetupDiGetClassDevs((LPGUID)&GUID_DEVCLASS_DISKDRIVE, 0, 0, DIGCF_PRESENT /*or DIGCF_PROFILE*/); // GUID_DEVCLASS_DISKDRIVE - чтобы работало #include "devguid.h" написал.
                if  (DrivePnPHandle = INVALID_HANDLE_VALUE) {
                    return;
                };
                DeviceNumber = 0;
                do { // В исходнике использовался дельфийский цикл repeat - until not, как мне кажется do - while - альтернатива в C++
                    DeviceInterfaceData->cbSize = sizeof(SP_DEVICE_INTERFACE_DATA);
                    DevData->cbSize = sizeof(SP_DEVINFO_DATA);
                    RES = SetupDiEnumDeviceInfo(DrivePnPHandle, DeviceNumber, DevData);
                    if (RES) {
                        DrivesListBox->Items->Add(GetDeviceName(DrivePnPHandle, DevData)); // Функция в процессе написания...
                        DeviceNumber++;
                    };
                }
                while (RES);
                SetupDiDestroyDeviceInfoList(DrivePnPHandle);
                DrivesListBox->Enabled = true;
         }


Для сетевых код такой же, только вместо DrivePnPHandle - NetPnPHandle, ну и ListBox не DrivesListBox, а NetDevicesListBox.

Заодно проверите этот код для кнопки, но компилятор только ругается на GetDeviceName.

Показывать то, что я навояла в процессе переписывания GetDeviceName стыдно, но вот:

Код

        int GetDeviceName(HDEVINFO PnPHandle, const PSP_DEVINFO_DATA DevData) {
            // Импровизированный раздел описания переменных
            PDWORD BytesReturned = 0;
            PDWORD RegDataType = 0;
            CHAR Buffer[257];

            // Раздел кода программы
            Buffer[0] = '\0'; // Кажется признак конца строки обозначается \0
            SetupDiGetDeviceRegistryProperty(PnPHandle, DevData, SPDRP_FRIENDLYNAME, RegDataType, PBYTE(&Buffer[0]), sizeof(Buffer), BytesReturned);
            return Buffer;
            if (Buffer!="") { 
                return false;    // Кажется тут так
            };
            BytesReturned = 0;
            RegDataType = 0;
            Buffer[0] = '\0'; 
            SetupDiGetDeviceRegistryProperty(PnPHandle, DevData, SPDRP_DEVICEDESC, RegDataType, PBYTE(&Buffer[0]), sizeof(Buffer), BytesReturned);
            return Buffer;
        }


Компилятор, собственно на мою дурь кричит вот что...

1>h:\зайцев\prog на c++\prog\Form1.h(304) : error C2440: return: невозможно преобразовать 'CHAR [257]' в 'int'

В общем, хочу чтобы вы мне показали и объяснили (прошу не отсылать к литературе, в борьбе с моим мозгом она потерпела фиаско).

Автор: Sonechka 6.2.2012, 12:20
Ай, извините, 2 раза создала тему нечайно :(

Автор: bsa 6.2.2012, 13:33
во-первых, ты создала не в том разделе
во-вторых, это вообще не С++, а .Net.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)