| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > C/C++: Системное программирование и WinAPI > Получение имени устройства |
| Автор: Sonechka 6.2.2012, 11:19 | ||||||
Доброго времени суток, уважаемые! Имеется у меня исходник на Delphi, который выводит список всех устройств в TreeView, как в "Диспетчере устройств", дополнительно выводит в ListBox сетевые устройства и дисковые накопители. Ввиду того, что мной изучался Delphi (давненько по программистским меркам это и было), а он сейчас (да и тогда) был не актуален, появилось у меня желание овладеть C++ (2 недели уже овладеваю). Начал не с самых азов (все языки ведь похожи). Начал с простого, стал переписывать более-менее понятный мне код. Для начала, переписал кнопочки для вывода сетевых и дисковых устройств в соответствующие ListBox'ы, но в обоих обработчиках события OnClick есть функция GetDeviceName (понятно из названия зачем она), а перевести её не могу. Ниже привожу пример её, написанной на Delphi (вроде она простая, понять не трудно будет):
Собственно о том, что может быть непонятно в коде (сам этого не помню, специально искал): #0 - признак окончания строки; @ - адрес переменной; Дополнительно привожу пример обработчика для вывода дисковых устройств (для сетевых всё то же самое, только одна переменная иначе названа (А то подумаете, что за халявой пришёл
Для сетевых код такой же, только вместо DrivePnPHandle - NetPnPHandle, ну и ListBox не DrivesListBox, а NetDevicesListBox. Заодно проверите этот код для кнопки, но компилятор только ругается на GetDeviceName. Показывать то, что я навоял в процессе переписывания GetDeviceName стыдно, но вот:
В общем, хочу чтобы вы мне показали и объяснили (прошу не отсылать к литературе, лучше понимаю на примерах). |
| Автор: xvr 6.2.2012, 14:20 | ||
У вас почти все правильно. Должно быть так -
|
| Автор: feodorv 12.2.2012, 05:12 | ||
Девятая строка кода выглядит как-то неправильно ;)
|
| Автор: xvr 12.2.2012, 13:24 | ||
Угу, посыпаю голову пеплом
|
| Автор: maxfox 15.2.2012, 14:02 |
| Подскажите пожалуйста, почему не получается скомпилировать описанный выше код? На сам код студия не ругается, но выдаёт кучу ошибок во включаемых файлах setupapi.h, и prsht.h и spapidef.h. При этом в проект я включил файл: #include <setupapi.h> Я предполагаю, что необходимо ещё включить какие то заголовочные файлы или библиотеки, но не знаю, какие. Подскажите пожалуйста! |
| Автор: maxfox 16.2.2012, 13:46 | ||
| xvr, Мне кажется, что судя по синтаксису заголовка процедуры:
-это студия и проект Windows Forms. Но. могу и ошибаться. windows.h - не было. когда включил, все предыдущие ошибки ушли, но появилась другая: В проекте пользуюсь NET библиотекой, чтобы взять путь, от куда запущена программа: System::IO::Directory::GetCurrentDirectory(); однако в библиотеке WinBase.h, есть такая строчка: #define GetCurrentDirectory GetCurrentDirectoryW На сколько я понял, эта строчка переопределяет(или что то в этом роде) функцию из NET - библиотеке. В общем. выдаёт такую ошибку: error C2039: GetCurrentDirectoryW: не является членом "System::IO::Directory" Я не понимаю сути этой ошибки, т.к. у меня в тексте нигде нет переменной: GetCurrentDirectoryW |
| Автор: xvr 16.2.2012, 14:19 | ||
Этот исходник да - на .NET (C++/CLI)
Это проблема с совместимостью .NET и WinAPI. windows.h расчитана на чистый С, и она явно передралась с .NET заголовками. В WinAPI #define GetCurrentDirectory GetCurrentDirectoryW - это стандартный способ настройки приложения под Unicode. Советую не рожать помесь ужа с ежём, а писать либо на C# либо на чистом С++. С++/CLI - это порождение проблем совместимости, и делать на нем проект с нуля это явный идиотизм и самоубийство |
| Автор: GremlinProg 16.2.2012, 15:43 | ||||
после включения windows.h можно конечно прописать:
но не факт, что не появится чего-то другого, вобщем, это будет куча undef'ов, пока не появятся проблемы с дублированием типов данных и функций ( и это будет финиш ), p.s.: вот потом посмотришь на эту гору костылей и наверное поймешь, что проще было пользоваться чем-то одним |