Доброго времени суток, уважаемые! Имеется у меня исходник на 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 - признак окончания строки; @ - адрес переменной;
Дополнительно привожу пример обработчика кнопки для вывода дисковых устройств. Ещё подумаете, что за халявой пришла . А я не за халявой, а чтобы показали и объяснили Я учиться хочу , но без помощи не получается.
| Код | /* ------------------ ДЛЯ ДИСКОВЫХ УСТРОЙСТВ ------------------ */ 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'
В общем, хочу чтобы вы мне показали и объяснили (прошу не отсылать к литературе, в борьбе с моим мозгом она потерпела фиаско). |