Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 28.10.2011, 06:37   #11
fredwriter
Форумчанин
 
Регистрация: 06.10.2009
Сообщений: 121
По умолчанию

Abstraction, нет ошибки. Но я не понял прикола.
Ищущий да обрящет
fredwriter вне форума Ответить с цитированием
Старый 28.10.2011, 10:12   #12
fredwriter
Форумчанин
 
Регистрация: 06.10.2009
Сообщений: 121
По умолчанию

Посмотрел повнимательнее и кое-что понял, кроме одного: что это за приём, (...)(...) это что альтернативный вариант оператора присваивания? Когда заменил на = появилась та же ошибка. ЧТО МНЕ ДЕЛАТЬ?, уже второй день с этой ошибкой нимогу справиться первый раз такое. Подскажите пожалуйста.
Ищущий да обрящет
fredwriter вне форума Ответить с цитированием
Старый 28.10.2011, 10:35   #13
Abstraction
Старожил
 
Аватар для Abstraction
 
Регистрация: 25.10.2011
Сообщений: 3,178
По умолчанию

Нет, идея была в том, что DriverObject->MajorFunction[IRP_MJ_CREATE] - это ссылка на функцию. Соответственно, я предположил, что, если есть проблема с соответствием типов, попытка вызова этой функции поможет получить более конструктивное сообщение об ошибке. Вместо этого компилятор этот вызов сожрал, как будто так и надо. Странно.
Чем чёрт не шутит, попробуйте написать
Код:
wstdcall NTSTATUS CreateMyDriver(IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp);
Если wstdcall компилятор не поймёт, то просто stdcall.

Последний раз редактировалось Abstraction; 28.10.2011 в 10:36. Причина: поправка синтаксиса
Abstraction вне форума Ответить с цитированием
Старый 28.10.2011, 10:57   #14
fredwriter
Форумчанин
 
Регистрация: 06.10.2009
Сообщений: 121
По умолчанию

Abstraction, ни wstdcall, ни stdcall не помогло (компилятор на оба ругается), я этот код (где ошибки) не с потолка взял, это стандартный способ заполнения массива MajorFunction, массив этот входит в структуру PDRIVER_OBJECT, и служит для хранения указателей на функции драйвева обрабатывающие запросы ввода/вывода. Где ж загвоздка-то ё-моё.
Ищущий да обрящет

Последний раз редактировалось fredwriter; 28.10.2011 в 10:59.
fredwriter вне форума Ответить с цитированием
Старый 28.10.2011, 11:09   #15
Abstraction
Старожил
 
Аватар для Abstraction
 
Регистрация: 25.10.2011
Сообщений: 3,178
По умолчанию

fredwriter,
А на __stdcall? Вообще, попробуйте найти заголовочный файл winnt_types.h и как в нём определён тип driver_dispatch_t.
Я понимаю, что код не с потолка. Просто если не совпадают соглашения о вызовах, это может объяснить творящийся беспредел.
Abstraction вне форума Ответить с цитированием
Старый 28.10.2011, 11:48   #16
fredwriter
Форумчанин
 
Регистрация: 06.10.2009
Сообщений: 121
По умолчанию

Спасибо огромное, Abstraction, ваш __stdcall (Применяется при вызове функций WinAPI. Аргументы передаются через стек, справа налево. Очистку стека производит вызываемая подпрограмма) помог, объясните пожалуйста в чём тут фишка? Что это за __stdcall расскажите поподробнее.
И еще компилятор выдаёт два каких-то сообщения без указания на строку:
1. cannot find -lobjc
2. ld returned 1 exit status
Это он уже давно выдаёт еще до исправления __stdcall.
Аргументы передаются через стек, справа налево - то есть до того как я поставил соглашение вызова, аргументы передавались слева направо, а ожидалось наоборот для MajorFuncrion?
Ищущий да обрящет

Последний раз редактировалось fredwriter; 28.10.2011 в 12:01.
fredwriter вне форума Ответить с цитированием
Старый 28.10.2011, 12:11   #17
Abstraction
Старожил
 
Аватар для Abstraction
 
Регистрация: 25.10.2011
Сообщений: 3,178
По умолчанию

При компиляции программы в машинный код, сами моменты вызова любой функции и возврата обратно превращаются в команды CALL и RET, в которые не заложено никакой функциональности по передаче аргументов. Соответственно, есть так называемые соглашения о вызовах - на какой стороне (вызывающий код, вызванный код) кто чего делает в дополнение к этим командам. Если вызывающий код будет думать, что вызываемый возьмёт аргументы с регистров, а вызванный будет вместо этого искать их в стеке, получится бардак. В данном случае, по всей видимости, компилятор без специального указания считает, что новые объявляемые функции по умолчанию должны быть cdecl, а поскольку driver_dispatch_t явно объявлен как stdcall, у него случился когнитивный диссонанс. Вероятно, можно с помощью директивы #pragma изменить поведение компилятора, чтобы он по умолчанию создавал функции с соглашением stdcall - как именно, надо читать в документации на конкретный компилятор.

Цитата:
1. cannot find -lobjc
2. ld returned 1 exit status
Это уже не компилятор, это компоновщик. По всей видимости, ни в опциях компилятора, ни в make-файле не заданы пути к объектным файлам.
Abstraction вне форума Ответить с цитированием
Старый 28.10.2011, 12:34   #18
fredwriter
Форумчанин
 
Регистрация: 06.10.2009
Сообщений: 121
По умолчанию

Спасибо за информацию, Abstraction, что бы я без тебя делал? Наверное еще долго бы мучился.
Ищущий да обрящет
fredwriter вне форума Ответить с цитированием
Старый 28.10.2011, 14:04   #19
fredwriter
Форумчанин
 
Регистрация: 06.10.2009
Сообщений: 121
По умолчанию

Не могу никак разобраться с этими ошибками:
1. cannot find -lobjc
2. ld returned 1 exit status
Abstraction, вы говорили про подключение объектных файлов, подскажите пожалуйста как и где их подключать.
Вот содержание моего MakeFile:

Код:
!INCLUDE $(NTMAKEENV)\makefile.def
Ищущий да обрящет
fredwriter вне форума Ответить с цитированием
Старый 28.10.2011, 18:01   #20
fredwriter
Форумчанин
 
Регистрация: 06.10.2009
Сообщений: 121
По умолчанию

Нигде не могу найти информацию о том как исправить ошибки написанные в посте выше, Libraries компилятор берёт в папке Dev-Cpp\Lib (кстати у меня Dev-Cpp). Скачал какой-то архив objc-bootstrap-3.2.8, в нем есть файлы с именем _objc1.c, objc.in, objc1.c, но добавление в Libraries папки извлеченной из этого архива: C:\Dev-Cpp\objc-bootstrap-3.2.8\objc-bootstrap-3.2.8 не помогло, честно говоря я даже не понимаю что сделал, и что это за objc-bootstrap-3.2.8, просто название похожее. Подскажите пожалуйста кто-нибудь.
Ищущий да обрящет
fredwriter вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Непонятная ошибка optimator C++ Builder 4 23.12.2010 17:20
непонятная ошибка Mikuro Помощь студентам 0 12.11.2010 20:49
VS C++,непонятная ошибка RFbager Общие вопросы C/C++ 4 31.10.2010 03:30
Непонятная ошибка. jojahti Общие вопросы C/C++ 4 05.09.2009 20:39
Непонятная ошибка RealSHELS Общие вопросы Delphi 16 24.10.2008 20:49