Модераторы: Partizan, gambit
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Получение имени устройства, Получение имени устройства GetDeviceName 
:(
    Опции темы
Sonechka
Дата 6.2.2012, 11:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 3
Регистрация: 3.2.2012

Репутация: нет
Всего: нет



Доброго времени суток, уважаемые! Имеется у меня исходник на 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, 18:06
PM MAIL   Вверх
Sonechka
Дата 6.2.2012, 12:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 3
Регистрация: 3.2.2012

Репутация: нет
Всего: нет



Ай, извините, 2 раза создала тему нечайно :(
PM MAIL   Вверх
bsa
Дата 6.2.2012, 13:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: нет
Всего: 196



во-первых, ты создала не в том разделе
во-вторых, это вообще не С++, а .Net.
PM   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Прежде чем создать тему, посмотрите сюда:
Partizan
PashaPash

Используйте теги [code=csharp][/code] для подсветки кода. Используйтe чекбокс "транслит" если у Вас нет русских шрифтов.
Что делать если Вам помогли, но отблагодарить помощника плюсом в репутацию Вы не можете(не хватает сообщений)? Пишите сюда, или отправляйте репорт. Поставим :)
Так же не забывайте отмечать свой вопрос решенным, если он таковым является :)


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, mr.DUDA, Partizan, PashaPash.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | .NET для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.0572 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.