Я Си практически не знаю, но тут мне пришлось подредактировать один исходничёк. В результате при сборке получил ошибки. помогите, пожалуйста, довести его до *.obj
Это разве плюсы? Это какое-то подобие плюсов. BOOLEAN - в плюсах bool. PDEVICE_OBJECT, NTSTATUS, PKEYBOARD_INPUT_DATA, PIRP и куча других типов - ты не объявляешь эти типы данных, а тянешь их из какой-то очень специфичной библиотеки. Код (Text): NTSTATUS KbFilter_InternIoCtl ( IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp ); Что за новый квалификатор типа IN? В плюсах только два квалификатора типа - это const и volatile. Скорее всего это какой-то убогий макрос, определённый в библиотеке, который пропадет (разрешится) при препроцессировании иначе бы такой код вообще не компилировался.
Ursus А давайте мы с Вами проведем весёлый эксперимент. Запустим ОСЬ на виртуалке - не обязательно Линуху, можно Фряху, можно QNX, главное не Винду - расширим горизонты. Вы там попробуете в любой функции в объявлении аргумента вбить квалификатор IN, например void myfunc(IN int value), и посмотрим, посмеёмся вместе над тем как компилятор отреагировал на это знаменательное событие. WinDDK вы там точно не подрубите, думаю будет весело. "IN" was not declared in this scope - кричит компилятор. Ура! Делаем вывод что тянется этот бодяжный макрос из либы специфичной для Винды и никому он даром не нужен. Один из вариантов как выкрутиться из такого неловкого положения определить макрос #define IN const, тогда gcc должен пропустить эту дьявольскую конструкцию
Nafanya ты - идиот штоле? давай, давай, собирай виндовые дрова под линуксовые операционные системы) не знаешь о чем речь - лучше не пиши ничего... а про обозначения типов принятые в винде: тебя штоль не спросили? Llirik ну во-первых: во-вторых, что за ошибки?
Nafanya Вы повеселись? И как? Понравилось компилить виндовые дрова в линуксе? Вы бы вначале - головой думали, что-ли. Кстати, заметьте, линуксовые дрова в винде никто не пытается собирать. Странно... А я бы хотел посмотреть. И желательно, чтоб собирали с помощью MS VS.
TermoSINteZ MS VS настраивается на target-compilation, проекты делаются с Мэйкфайлами, сборка проекта после этого идет на удаленном целевом Линукс-сервере. Студию используют лишь как удобный редактор. Есть Linux Software Development, а есть Windows Software Development. Я второго не касаюсь,соответственно и сказать об этом ничего не могу ни хорошего, ни плохого. Разработка ПО под Линукс - другое дело.
ничего не имею лично против Nafanya. но, может, стоит сначала изучить С, прежде чем разглагольствовать?
Ursus Что именно из курса Си вы рекомендуете мне изучить? Приведите пример того, что мне бы следовало знать из курса Си, а я не знаю. Если это будет важный момент, то я обязательно уделю ему внимание. Разбирать WinDDK, мне нет смысла, так как под ОС Windows я вообще ПО не пишу. Сейчас я изучаю паттерны проектирования - архитектурные конструкции, призванные разрешить часто возникающие проблемы проектирования.
Паттерны проектьирования - это очень круто. Но даже школьник, вчера начавший изучать С, в курсе, что такое "макрос", и почему конструкция Код (Text): NTSTATUS KbFilter_InternIoCtl ( IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp ); легко компилируется. BTW, мне лень лезть счас в сорсы едра Линуха, но я готов спорить на 100 баксов, что там есть аналогичные конструкции. Просто вместо макроса IN там есть, скажем, __in, или что-то вроде.
плохо изучаете. какбэ пустые макросы IN\OUT это идиома позволяющая документировать назначение парамеров в коде
Где ты видишь в теме, что автор говорит о плюсах? Он пишет о простом Си, а в Си нет никаких bool. Из вообще очень специфичной, говорят, DDK какой-то, но никто не знает, что это такое. "IN - квалификатор" - это же новое расширение Си0x, ты не знал? А зачем же тогда пишешь глупые комментарии к коду, который представляет собой код для ядра Windows? Я уже помнится комментировал твой крутой код на C++... Вот важный момент - принять "IN" за какой-то квалификатор, и не подумать о том, что это просто макрос. Этот макрос служит для улучшения читаемости и понимания Си-кода. Есть же еще, например, OUT. Вот тут тоже кучи неведомых квалификаторов: http://msdn.microsoft.com/en-us/library/ff566424(v=vs.85).aspx
Всем спасибо за интересную и увлекательную дискуссию, вернусь к своим баранам, то есть к шаблонам проектирования
WinDDK естественно есть, а список ошибок есть в архиве в файле buildfre_wxp_x86.err. Вообщем суть такая: я эти функции перевёл на ассемблер и вроде бы правильно, потому что они работают (винда не вылетает), но работают не совсем. Вот я и хочу их собрать в изначальном виде на С и посмотреть, дело именно в них или надо что-то ещё добавить. Я, конечно, немного изменил структуру _DEVICE_EXTENSION, но не думаю, что дело именно в этом, хотя....
Недавно я говорил на васме, что могу написать объект класса, который будет менять своё поведение в зависимости от состояния, в котором он находится. Думаю новичкам в Си++ и не только им, будет полезно взглянуть на то, как реализуется данная идея за счет применения динамического полиморфизма. Суть: Имеем объект класса Machine, предоставляющий внешний интерфейс DoOperation(int iOne,int iTwo). В зависимости от того, в каком состоянии находится объект класса сервис DoOperation будет выполнять различные действия. В одном состоянии он будет складывать два числа, в другом умножать, в третьем вычитать, но главное не в операциях, а в идее. Объект меняет своё поведение в зависимости от состояния. То есть при вызове одного и того же метода класса будут фактически выполнены различные операции. Это подчеркивает красоту и элегантность объектно-ориентированного подхода разработки ПО. Код (Text): #include <iostream> using namespace std; class Machine{ public: Machine():_pState(&_theDefault){} int DoOperation(int iOne,int iTwo) {return _pState->DoOperation(this,iOne,iTwo);} private: void SetNext(){_pState=&_theNext;} void SetDefault(){_pState=&_theDefault;} void SetEnd(){_pState=&_theEnd;} class DefaultState { public: virtual int DoOperation(Machine* pMachine, int iOne,int iTwo) { pMachine->SetNext(); return (iOne+iTwo); } }; class NextState:public DefaultState { public: int DoOperation(Machine* pMachine, int iOne,int iTwo) {pMachine->SetEnd(); return (iOne*iTwo); } }; class EndState:public DefaultState { public: int DoOperation(Machine* pMachine,int iOne,int iTwo) {pMachine->SetDefault(); return (iOne-iTwo); } }; DefaultState _theDefault; NextState _theNext; EndState _theEnd; DefaultState * _pState; }; int main() { int iValue1, iValue2; Machine themachine; for (int i=0;i<3;i++) { cout<<"Enter two values:"<<endl; cin>>iValue1; cin>>iValue2; cout<<themachine.DoOperation(iValue1,iValue2)<<endl; } return (0); }
Nafanya То что вы написали является конечным автоматом и нечего необычного в этом нет. Лучше изучайте программирование, а не пишите баяны.