Вернуться   Развлекательный портал CN.ru - Форум > Технологии > Программирование > Начинающим

Ответ
 
Опции темы
Старый 19.01.2012, 14:39 ↑ #1
Decoy2 Мужской
The Guard of Dark side
долгожитель эго-форума
 
Аватар для Decoy2
 
Регистрация: 10.07.2007
Адрес: Город несбывшихся надежд...
Возраст: 29
Сообщений: 376
Репутация: 78
Decoy2 на верном пути
По умолчанию C++ и API

Всем доброго времени суток!
Сам я не программист, а в большей степени железячник. Программировать конечно приходилось (на delphi), но задумал написать программку на С++ (и полезное дело сделать и обучиться одному из самых популярных языков). Программка следующая:

Предполагается, что программа будет иметь диагностический характер. Перед пользователем будет появляться диалоговое окно, в котором будет ряд кнопок. По нажатии некоторой кнопки будет появляться другое окно, в котором будет, к примеру, выводиться таблица S.M.A.R.T. Подобную кнопку планируется сделать для процессора (выводиться stepping и т.д.), портов и т.п. Говорят, делается это при помощи функций API.

Собственно вопрос:
1) Позволит ли мне Windows всё это проделать?
2) Подскажите какую-нибудь литературу, где можно ознакомиться с информацией по работе с API в C++.

Заранее спасибо всем отписавшимся.
__________________
Decoy2 вне форума   Ответить с цитированием
Старый 19.01.2012, 15:07 ↑ #2
SwEngineer
старожил эго-форума
 
Регистрация: 18.01.2012
Сообщений: 536
Репутация: 252
SwEngineer всегда в теме SwEngineer всегда в теме SwEngineer всегда в теме
По умолчанию Re: C++ и API

Цитата:
Сообщение от Decoy2 Посмотреть сообщение
1) Позволит ли мне Windows всё это проделать?
.
Да

Цитата:
Сообщение от Decoy2 Посмотреть сообщение
2) Подскажите какую-нибудь литературу, где можно ознакомиться с информацией по работе с API в C++.
Литературы программирования на прикладном уровне для Windows куча, ну если совсем не знакомы с API Windows, то можно начать изучать окнонную систему а так же создание и работу с окнами с помощью WinAPI, а так же прикладное системное программирование (примерно так искать в гугле), дальше на выбор раз уже разговор про
C++, выбрать и изучить GUI библиотеку, к примеру MFC или WTL, или популярную кроссплатформенную QT (с самой библиотекой куча примеров, отличная документация).
Из книг, по GUI, наверное лучше в интернете и MSDN смотреть, по системному программирований, хоть и старая но достаточно актуальная Рихтер Системное программирование в Windows, Руссинович Внутренне устройство Windows, ну и так же MSDN
Как то так.

Последний раз редактировалось SwEngineer; 19.01.2012 в 15:12.
SwEngineer вне форума   Ответить с цитированием
Старый 22.01.2012, 15:47 ↑ #3
Decoy2 Мужской
The Guard of Dark side
долгожитель эго-форума
 
Аватар для Decoy2
 
Регистрация: 10.07.2007
Адрес: Город несбывшихся надежд...
Возраст: 29
Сообщений: 376
Репутация: 78
Decoy2 на верном пути
По умолчанию Re: C++ и API

Большое спасибо за отклик.

Решил для начала освоить API в Дельфях, как раз неплохую статью нашел с исходником, мне как нельзя кстати будет при написании программы, но как-то не хочет работать он. Точнее говоря всё очень здорово, но вот сетевые устройства ни как не хотят отключаться.
Вот статейка http://www.cyberguru.ru/programming/...s-devices.html (исходник можно стянуть на 4-й страничке, после подписи автора).

На второй страничке есть процедурка EnableNetDevice(aState:boolean;index:integer). Кажется мне, что в ней что-то неправильно.
По нажатии кнопок ВКЛ/ОТКЛ в неё передается информация какое сетевое устройство включить/отключить, при этом в лог должна выводиться соответствующая информация. Однако, при нажатии на кнопки ничего не происходит.
Лог работает 100%, если какое-либо сетевое устройство отключить через диспетчер устройств, то информация об этом в логе отображается.

Так же код кидаю и сюда, собственно ищу помощи в отыскании ошибки...
Цитата:
procedure EnableNetDevice(aState:boolean;index:integer);
var
NetPnPHandle:HDEVINFO;
PCHP:TSPPropChangeParams;
DeviceData:TSPDevInfoData;
begin
NetPnPHandle:=SetupDiGetClassDevs(@GUID_DEVCLASS_N ET, 0, 0, DIGCF_PRESENT);
if NetPnPHandle=INVALID_HANDLE_VALUE then exit;
DeviceData.cbSize:=sizeof(TSPDevInfoData);
SetupDiEnumDeviceInfo(NetPnPHandle, index, DeviceData);
PCHP.ClassInstallHeader.cbSize:=sizeof(TSPClassIns tallHeader);
if SetupDiSetClassInstallParams(NetPnPHandle,@DeviceD ata,@PCHP,sizeof(TSPPropChangeParams)) then
begin
PCHP.ClassInstallHeader.cbSize := sizeof(TSPClassInstallHeader);
PCHP.ClassInstallHeader.InstallFunction := DIF_PROPERTYCHANGE;
PCHP.Scope := DICS_FLAG_CONFIGSPECIFIC;
if aState then
PCHP.StateChange := DICS_ENABLE
else
PCHP.StateChange := DICS_DISABLE;
SetupDiSetClassInstallParams(NetPnPHandle,@DeviceD ata,@PCHP,sizeof(TSPPropChangeParams));
SetupDiCallClassInstaller(DIF_PROPERTYCHANGE,NetPn PHandle,@DeviceData);
end;
DeviceData.cbSize := sizeof(TSPDevInfoData);
SetupDiDestroyDeviceInfoList(NetPnPHandle);
end;
__________________

Последний раз редактировалось Decoy2; 23.01.2012 в 07:18.
Decoy2 вне форума   Ответить с цитированием
Старый 24.01.2012, 13:48 ↑ #4
KostikovStas
местный
 
Регистрация: 17.06.2008
Сообщений: 81
Репутация: 525
KostikovStas глас народа KostikovStas глас народа KostikovStas глас народа KostikovStas глас народа KostikovStas глас народа KostikovStas глас народа
По умолчанию Re: C++ и API

Ээээ а как это связанно с темой топика? Это же паскаль...
KostikovStas вне форума   Ответить с цитированием
Старый 24.01.2012, 14:53 ↑ #5
Decoy2 Мужской
The Guard of Dark side
долгожитель эго-форума
 
Аватар для Decoy2
 
Регистрация: 10.07.2007
Адрес: Город несбывшихся надежд...
Возраст: 29
Сообщений: 376
Репутация: 78
Decoy2 на верном пути
По умолчанию Re: C++ и API

Цитата:
Сообщение от KostikovStas Посмотреть сообщение
Ээээ а как это связанно с темой топика? Это же паскаль...
Читать надо было первый пост внимательней и начало второго Решил с более привычного языка осваивать работу с API.

Касаемо текста - он оказывается работает, но только на XP, а на 7ке нет.
__________________
Decoy2 вне форума   Ответить с цитированием
Старый 24.01.2012, 15:34 ↑ #6
McKuzmich
старожил эго-форума
 
Регистрация: 11.01.2007
Возраст: 32
Сообщений: 689
Репутация: 5986
McKuzmich захватил ЭГО-Форум McKuzmich захватил ЭГО-Форум McKuzmich захватил ЭГО-Форум McKuzmich захватил ЭГО-Форум McKuzmich захватил ЭГО-Форум McKuzmich захватил ЭГО-Форум McKuzmich захватил ЭГО-Форум McKuzmich захватил ЭГО-Форум McKuzmich захватил ЭГО-Форум McKuzmich захватил ЭГО-Форум McKuzmich захватил ЭГО-Форум
По умолчанию Re: C++ и API

Админские права нужны под семеркой?
McKuzmich вне форума   Ответить с цитированием
Старый 25.01.2012, 08:47 ↑ #7
Decoy2 Мужской
The Guard of Dark side
долгожитель эго-форума
 
Аватар для Decoy2
 
Регистрация: 10.07.2007
Адрес: Город несбывшихся надежд...
Возраст: 29
Сообщений: 376
Репутация: 78
Decoy2 на верном пути
По умолчанию Re: C++ и API

Цитата:
Сообщение от McKuzmich Посмотреть сообщение
Админские права нужны под семеркой?
Как ни странно, да Почему-то не задумался над этим, хотя довольно часто сталкиваюсь с такой проблемой, например при работе в командной строке. Спасибо за намек

з.ы. осталось перевести каркас программы на C++, а потом буду навешивать на него тесты, наверное в виде dll'ек.
__________________
Decoy2 вне форума   Ответить с цитированием
Старый 03.02.2012, 17:51 ↑ #8
Decoy2 Мужской
The Guard of Dark side
долгожитель эго-форума
 
Аватар для Decoy2
 
Регистрация: 10.07.2007
Адрес: Город несбывшихся надежд...
Возраст: 29
Сообщений: 376
Репутация: 78
Decoy2 на верном пути
По умолчанию Re: C++ и API

Вернулся к задуманному (сессия была). Есть вопрос, как правильно описать константу на C++. Примеров с тем, что значением константы является библиотека не нашёл... К примеру на дельфях это выглядит так: CfgMgrDllName = 'cfgmgr32.dll';, а на C++ будет так #define CfgMgrDllName 'cfgmgr32.dll'?
__________________
Decoy2 вне форума   Ответить с цитированием
Старый 03.02.2012, 22:58 ↑ #9
Abel Nightroad Мужской
реликт эго-форума
 
Аватар для Abel Nightroad
 
Регистрация: 09.02.2005
Адрес: 207 нанка
Возраст: 32
Сообщений: 3,129
Репутация: 358
Abel Nightroad за словом в карман не полезет Abel Nightroad за словом в карман не полезет Abel Nightroad за словом в карман не полезет Abel Nightroad за словом в карман не полезет
Отправить сообщение для Abel Nightroad с помощью ICQ
По умолчанию Re: C++ и API

#define это не совсем константа, это препроцессорная директива. Константы задаются при помощи ключевого слова const (с которым, как это водится в плюсах, связанна целая куча неочевидных граблей)
Чтобы было понятнее, константа - это, по сути, та-же переменная, только с запретом на запись. Она занимает своё место в памяти, имеет адрес и так далее.
А дефайны еще на этапе сборки просто заменяются в коде на их значения.
Для дефайна ваш пример правильный.
__________________
Человекообразный примат по программному обеспечению
Abel Nightroad вне форума   Ответить с цитированием
Старый 04.02.2012, 17:01 ↑ #10
Decoy2 Мужской
The Guard of Dark side
долгожитель эго-форума
 
Аватар для Decoy2
 
Регистрация: 10.07.2007
Адрес: Город несбывшихся надежд...
Возраст: 29
Сообщений: 376
Репутация: 78
Decoy2 на верном пути
По умолчанию Re: C++ и API

Цитата:
Сообщение от Abel Nightroad Посмотреть сообщение
#define это не совсем константа, это препроцессорная директива. Константы задаются при помощи ключевого слова const (с которым, как это водится в плюсах, связанна целая куча неочевидных граблей)
Чтобы было понятнее, константа - это, по сути, та-же переменная, только с запретом на запись. Она занимает своё место в памяти, имеет адрес и так далее.
А дефайны еще на этапе сборки просто заменяются в коде на их значения.
Для дефайна ваш пример правильный.
Большое спасибо Про то что из себя представляет константа я знаю

Добавлено через 3 часа 48 минут
Продолжаю переписывать код и появилась проблемка.
Работаю с функцией SetupDiGetClassDevs, пытаюсь передать в функцию следующие параметры SetupDiGetClassDevs(''4D36E972-E325-11CE-BFC1-08002BE10318'', 0, 0, DIGCF_PRESENT /*or DIGCF_PROFILE*/); Собственно первый параметр не передаётся, дабы, как мне подсказывает компилятор:
Цитата:
SetupDiGetClassDevsW: невозможно преобразовать параметр 1 из 'const char [37]' в 'const GUID *'
Типы, на которые указывают указатели, не связаны; для преобразования требуется reinterpret_cast, приведение в стиле С или приведение в стиле функции
Изучаю, что такое reinterpret_cast...
Ввиду того, что с C++ связался недавно решить самостоятельно проблему затрудняюсь.

Добавлено через 4 часа 34 минуты
reinterpret_cast: невозможно преобразовать 'const char [37]' в 'const GUID' Для преобразования требуется конструктор или оператор пользовательского преобразования, который не может использоваться const_cast или reinterpret_cast это прискорбно

Добавлено через 5 часов 50 минут
Разобрался, подключил <devguid.h> и добавил (LPGUID)& перед GUID_DEVCLASS_DISKDRIVE

Добавлено через 21 час 31 минуту
И снова здравствуйте! Пытался героически перевести функцию с Delphi на C++ и чего-то ничего не получается.
Текст на 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;
Проблема, собственно в том, что по каким-то, непонятным мне причинам, в колледже с массивами мы не работали Так что, к примеру выражение Buffer[0] := #0; мне мало понятно (как я понял: массив якобы пустой т.к. первый элемент - конец)... что такое #0, вроде бы как это признак конца строки... потом присваивают массив result и проверяют его на пустоту, если он пустой то на выход... А что происходит дальше вообще не пойму... В общем попытался переписать, но чего-то не получилось.

Функцию SetupDiGetDeviceRegistryProperty я написал, как
Цитата:
SetupDiGetDeviceRegistryProperty(PnPHandle, DevData, SPDRP_FRIENDLYNAME, RegDataType, PBYTE(@Buffer[0]), sizeof(Buffer), BytesReturned);
Что означает @ в Delphi не помню, вроде адрес переменной.
__________________

Последний раз редактировалось Decoy2; 05.02.2012 в 18:06.
Decoy2 вне форума   Ответить с цитированием
Ответ

Опции темы

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.


Текущее время: 16:02. Часовой пояс GMT +6.
Powered by vBulletin® Version 3.8.7
Copyright ©2000 - 2020, Jelsoft Enterprises Ltd. Перевод: zCarot

ВКонтактeTwitterFacebook
Хотите связаться с нами? Напишите письмо, и мы обязательно ответим.