Проблемы с CGI:работает на Си и не работает на асме
Делал пример по книге Котерова "PHP 5".Там код приведён на Си,но,т.к. у меня компилятора нету,да и не знаток Си я,решил переписать на ассемблере
Делал всё,как в книге,но столкнулся с такой проблемой:код выдаёт 500ю ошибку(т.е.,по сути,не работает вывод).В чём дело,не знаю–всё делал так же,как написано в исходнике.Данный в книге код работает(был скомпилирован не мною и проверен,я лично убедился),мой же отказывается
Мои предположения:
• различия в консольном выводе стандартных Си-программ и моей программы
• различная трактовка управляющих символов,а также работа функций printf и WriteConsole
• какие-нибудь проблемы с наследованием дескрипторов(пробовал с помощью GetStartupInfo получать hStdOut и выводить в него,но при непосредственной отладке все консольные дескрипторы имели значение -1,а что было при работе из-под сервера,я не знаю)
И там,и там компилируется консольное приложение(ну это само собой,ведь используется консольный вывод)
Подскажите,пожалуйста,в чём ошибка.В аттаче выложены оба кода–мой и из книги
ps. Если нету компилятора си - достань, зачем себе жизнь усложнять, если решение секундное. Да и вообще на развод похоже ) А еще вообще зачем локальные тачки если на серваке можно и кодить и отлаживаться ((:
Это кто тебе такое сказал? В С++ надо, а тут С 90, там ничего такого не надо.
И обычный код для хелловорда.
Кто конкретно?
Что за ассемблер (мне чего то казалось ты на fasm кодишь но он это не съел)?
Это из-за переменных в секции кода но, конечно, еще зависит и от асемблера.
И обычный код для хелловорда.
Ну в таком случае, согласно еще более старому варианту можно вообще просто main писать. :).
ps. Я тут не забыл случ правильно запятые расставить ) ??
Он не более старый.
И обущенный тип возвращаемого значения по дефолту заменится на int. Тоесть функция будет возвращать целое число. Согласись int не то же самое, что void. =)
Я вот что ещё подумал:вовсе дело не в том,что переменные в секции кода–у неё атрибут writeable:)
Возможно(и наверняка) дело в различиях низкоуровнего консольного вывода(который я реализую посредством WriteConsole) и высокоуровнего(который реализуется printf'ом).Также могут быть различия в запуске программ
Поясняю:
• может быть какая-то разница между \n и 13,10.Насколько я знаю,они эквивалентны,но мне неизвестно,как поступает си;
• при запуске сишной программы может сбрасываться входной буфер,т.е.,если веб-сервер что-то в него отправил,то данные просто сбросятся и выведется то,что надо.Моя же программа этой специфики не учитывает(ну не знает она об этом!),поэтому пытается отправить данные,не прочитав прежде или не сбросив входной буфер;
• может быть такое,что WriteConsole и printf вообще по разному реализованы.Профессионал,подскажите,пожалуйста,кто знает такие тонкости?(может,вообще надо WriteFile'ом пользоваться);
• я пробовал наследовать дескриптор вывода(а не использовать полученный с помощью GetStdHandle).Не помогло.Мало того,во всех 3х дескрипторах возвращается -1!Почему?(с флагом StartF_UseStdHandles и без него)
Прошу заметить,что выдаваемая сервером ошибка–намёк на то,что заголовок Content-type или не выдаётся,или неверен.Обе эти возможности вроде как исключены–в консоль я пишу,а заголовок скопировал из текста программы на си(которая работает)
Просьба проанализировать изложенные мной замечания,а также ответить на вопросы(это как кто сможет).Из-за такой тупой ошибки как-то неохота всё бросать
Собственно да, тогда можно писать через WriteFile в stdout.
Или у тебя какие-то другие насчёт этого убеждения есть?Может,ты поможешь мне справиться с этой проблемой?;)
Тоесть юзать надо WriteFile
Буду пробовать.Спасибо за такую ценную подсказку…сам бы я вряд ли решился использовать WriteFile по причине "вломнехочу":)
Upd:
ААА!!!ЕЕЕ!!!Всё работает!Спасибо всем за участие,iridum'у отдельно за помощь!
Я ж те сразу в жаббере сказал про ВрайтФайл. ;)
К тому же,я просто позабыл об этом
…или,честно говоря,мне влом было это реализовать;)
Да дело не в дескрипторах сервера. Яж писал тебе уже - WriteConsole низкоуровневое средство для записи в консоль и только.
А через WriteFile ты можешь писать в stdout - который является уже абстракцией и не завязаной на понятие консоли. Его и можно перенаправлять по желанию. Что собственно сервер и делает.
Так?