Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Проблемы с CGI:работает на Си и не работает на асме

7
17 июня 2009 года
@pixo $oft
3.4K / / 20.09.2006
Доброго всем времени суток
Делал пример по книге Котерова "PHP 5".Там код приведён на Си,но,т.к. у меня компилятора нету,да и не знаток Си я,решил переписать на ассемблере
Делал всё,как в книге,но столкнулся с такой проблемой:код выдаёт 500ю ошибку(т.е.,по сути,не работает вывод).В чём дело,не знаю–всё делал так же,как написано в исходнике.Данный в книге код работает(был скомпилирован не мною и проверен,я лично убедился),мой же отказывается
Мои предположения:
• различия в консольном выводе стандартных Си-программ и моей программы
• различная трактовка управляющих символов,а также работа функций printf и WriteConsole
• какие-нибудь проблемы с наследованием дескрипторов(пробовал с помощью GetStartupInfo получать hStdOut и выводить в него,но при непосредственной отладке все консольные дескрипторы имели значение -1,а что было при работе из-под сервера,я не знаю)
И там,и там компилируется консольное приложение(ну это само собой,ведь используется консольный вывод)

Подскажите,пожалуйста,в чём ошибка.В аттаче выложены оба кода–мой и из книги
9.3K
18 июня 2009 года
iridum
175 / / 26.08.2007
Код на си жестокий :) по стантарту надо "int main" писать. Для того чтобы тебе понять как писать запусти asm.exe > asm.txt и ci.exe > ci.txt и посмотри разницу в far-е в текстовом и бинарном виде.
ps. Если нету компилятора си - достань, зачем себе жизнь усложнять, если решение секундное. Да и вообще на развод похоже ) А еще вообще зачем локальные тачки если на серваке можно и кодить и отлаживаться ((:
240
18 июня 2009 года
aks
2.5K / / 14.07.2006
Цитата: iridum
Код на си жестокий :) по стантарту надо "int main" писать.


Это кто тебе такое сказал? В С++ надо, а тут С 90, там ничего такого не надо.
И обычный код для хелловорда.

7
18 июня 2009 года
@pixo $oft
3.4K / / 20.09.2006
Так,ладно,это всё неважно…нормальный код на си,самое главное,что он работает ВЕРНО(на моей машине под 3м денвером).А тот же самый код на асме(вывод у них одинаковый,я проверял…за исключением,конечно,тела документа,но ошибка-то возникает раньше!)
14
18 июня 2009 года
Phodopus
3.3K / / 19.06.2008
Цитата: @pixo $oft
код выдаёт 500ю ошибку


Кто конкретно?
Что за ассемблер (мне чего то казалось ты на fasm кодишь но он это не съел)?
Это из-за переменных в секции кода но, конечно, еще зависит и от асемблера.

9.3K
18 июня 2009 года
iridum
175 / / 26.08.2007
Цитата: aks
Это кто тебе такое сказал? В С++ надо, а тут С 90, там ничего такого не надо.
И обычный код для хелловорда.



Ну в таком случае, согласно еще более старому варианту можно вообще просто main писать. :).
ps. Я тут не забыл случ правильно запятые расставить ) ??

240
18 июня 2009 года
aks
2.5K / / 14.07.2006
Цитата: iridum
Ну в таком случае, согласно еще более старому варианту можно вообще просто main писать. :).


Он не более старый.
И обущенный тип возвращаемого значения по дефолту заменится на int. Тоесть функция будет возвращать целое число. Согласись int не то же самое, что void. =)

7
18 июня 2009 года
@pixo $oft
3.4K / / 20.09.2006
То,что мне выдаёт при этом сервер–в аттаче.Есть там небольшое описание ошибки

Я вот что ещё подумал:вовсе дело не в том,что переменные в секции кода–у неё атрибут writeable:)
Возможно(и наверняка) дело в различиях низкоуровнего консольного вывода(который я реализую посредством WriteConsole) и высокоуровнего(который реализуется printf'ом).Также могут быть различия в запуске программ

Поясняю:
• может быть какая-то разница между \n и 13,10.Насколько я знаю,они эквивалентны,но мне неизвестно,как поступает си;
• при запуске сишной программы может сбрасываться входной буфер,т.е.,если веб-сервер что-то в него отправил,то данные просто сбросятся и выведется то,что надо.Моя же программа этой специфики не учитывает(ну не знает она об этом!),поэтому пытается отправить данные,не прочитав прежде или не сбросив входной буфер;
• может быть такое,что WriteConsole и printf вообще по разному реализованы.Профессионал,подскажите,пожалуйста,кто знает такие тонкости?(может,вообще надо WriteFile'ом пользоваться);
• я пробовал наследовать дескриптор вывода(а не использовать полученный с помощью GetStdHandle).Не помогло.Мало того,во всех 3х дескрипторах возвращается -1!Почему?(с флагом StartF_UseStdHandles и без него)

Прошу заметить,что выдаваемая сервером ошибка–намёк на то,что заголовок Content-type или не выдаётся,или неверен.Обе эти возможности вроде как исключены–в консоль я пишу,а заголовок скопировал из текста программы на си(которая работает)

Просьба проанализировать изложенные мной замечания,а также ответить на вопросы(это как кто сможет).Из-за такой тупой ошибки как-то неохота всё бросать
240
18 июня 2009 года
aks
2.5K / / 14.07.2006
Дык конечно - printf то в stdout пишет, который веб сервер себе перенаправляет, а WriteConsole куда? =)
Собственно да, тогда можно писать через WriteFile в stdout.
7
18 июня 2009 года
@pixo $oft
3.4K / / 20.09.2006
aks,ты либо исходник не смотрел?Да и я писал,что получаю дескриптор для вывода через GetStdHandle(т.е.,по идее,я должен получать дескриптор,который даётся моему приложению веб-сервером)
Или у тебя какие-то другие насчёт этого убеждения есть?Может,ты поможешь мне справиться с этой проблемой?;)
9.3K
18 июня 2009 года
iridum
175 / / 26.08.2007
Цитата:
To create an application that maintains a single set of sources compatible with both modes, use WriteConsole rather than WriteFile. Although WriteConsole can be used only with a console screen buffer handle, WriteFile can be used with other handles (such as files or pipes). WriteConsole fails if used with a standard handle that has been redirected to be something other than a console handle.


Тоесть юзать надо WriteFile

7
19 июня 2009 года
@pixo $oft
3.4K / / 20.09.2006
Ага!..Т.е.,насколько я понял,если дескрипторы редиректятся сервером,то WriteConsole с такими работать уже не может?
Буду пробовать.Спасибо за такую ценную подсказку…сам бы я вряд ли решился использовать WriteFile по причине "вломнехочу":)

Upd:
ААА!!!ЕЕЕ!!!Всё работает!Спасибо всем за участие,iridum'у отдельно за помощь!
5
19 июня 2009 года
hardcase
4.5K / / 09.08.2005
Цитата: @pixo $oft
Спасибо за такую ценную подсказку…сам бы я вряд ли решился использовать WriteFile по причине "вломнехочу":)


Я ж те сразу в жаббере сказал про ВрайтФайл. ;)

7
19 июня 2009 года
@pixo $oft
3.4K / / 20.09.2006
Ну они-то об этом не знают!..А ты не разглашай тайну переписки:D

К тому же,я просто позабыл об этом
…или,честно говоря,мне влом было это реализовать;)
240
19 июня 2009 года
aks
2.5K / / 14.07.2006
Цитата: @pixo $oft
Ага!..Т.е.,насколько я понял,если дескрипторы редиректятся сервером,то WriteConsole с такими работать уже не может?


Да дело не в дескрипторах сервера. Яж писал тебе уже - WriteConsole низкоуровневое средство для записи в консоль и только.
А через WriteFile ты можешь писать в stdout - который является уже абстракцией и не завязаной на понятие консоли. Его и можно перенаправлять по желанию. Что собственно сервер и делает.

7
19 июня 2009 года
@pixo $oft
3.4K / / 20.09.2006
Ах вот оно что…Получается,что WriteConsole завязана ТОЛЬКО на консоль,и только для простой работы с нею(т.е. в приложениях,которые должны именно в консоль выводить,а не,допустим,перенаправоять вывод)?
Так?
240
19 июня 2009 года
aks
2.5K / / 14.07.2006
Да WriteConsole - только для работы с консольным скринбуфером, но наоборот для сложной и всякой спецефичной именно для консоли работы. Совместно естественно с другими консольными API. Тоесть запись в разные консоли и создание их, запись в указанную позицию (можно менять курсор вывода), запись текста с определенными атрибутами и т.п.
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог