OberonCore https://forum.oberoncore.ru/ |
|
CGI-приложения на ББ (Линукс и Windows) https://forum.oberoncore.ru/viewtopic.php?f=34&t=2625 |
Страница 1 из 1 |
Автор: | Kubanych [ Четверг, 06 Май, 2010 13:07 ] |
Заголовок сообщения: | CGI-приложения на ББ (Линукс и Windows) |
Уважаемый Илья Ермаков. Вы выложили модули Terminal_mod, Terminal, позволяющие работать со stdin, stdout. При запуске собранного при помощи Вашего модуля exe файла, например, из Far Manager, exe файл открывает другое консольное окно и запускается в нем. Видимо из-за этого сервер Apache для Windows выдает Internal Error при запуске таких CGI. Такой же консольный exe файл, собранный при помощи компилятора XDS, в качестве CGI отрабатывает нормально, а при запуске из Far Manager запускается в том же консольном окне. 1. Можете ли Вы внести в свой модуль изменения так, чтобы при запуске получаемого в итоге exe файла из Far Manager программа запускалась в том же консольном окне? 2. Есть ли у Вас модуль, позволяющий считывать переменные окружения для работы с CGI через метод POST? Это поможет при помощи BlackBox на Windows платформе отлаживать CGI, а затем компилировать и запускать на Linux серверах. Конечно, это можно было бы делать и при помощи XDS, но интерфейс BlackBox и его встроенные библиотеки намного удобней. BlackBox намного удобней для построения динамических движков сайтов чем, например, Perl и PHP, так как 1. Облегчает построение больших программных комплексов и помогает выявить многие ошибки заранее. 2. Из-за того, что получаются компилированные файлы, можно скрыть, например, шифрацию полей в субд mySQL. Со временем можете и свой сайт oberoncore.ru перенести на BlackBox и не мучаться с неудобными языками программирования. С уважением, Кубаныч. |
Автор: | Димыч [ Четверг, 06 Май, 2010 13:38 ] |
Заголовок сообщения: | Re: Перевод BlackBox под Linux |
Такое поведение бывает у приложений, которые позиционируются как GUI, но фактически являются консольными. У DevLinker есть ключик dos, позволяющий в EXE прописать "консольность" при сборке. Не спрашивайте меня только, как его указывать Знаю это из анализа исходников. Должно помочь. |
Автор: | Илья Ермаков [ Четверг, 06 Май, 2010 14:49 ] |
Заголовок сообщения: | Re: Перевод BlackBox под Linux |
нужно линковать вот так: DevLinker.Link dos YourConsoleApp.exe := Kernel$+ Files HostFiles ... |
Автор: | Kubanych [ Четверг, 06 Май, 2010 17:07 ] |
Заголовок сообщения: | Re: Перевод BlackBox под Linux |
Спасибо за оперативный ответ. Попробовал. В Fare теперь exe файл выводит данные в том же консольном окне, но апач все равно продолжает давать Internal Server Error (перезапускал апач, менял имя CGI файла). Такая же программа на XDS работает без проблем. И еще остался второй вопрос о переменных среды. Интерес у нас общий - популяризация BlackBox среди линуксоидов и возможность выхода на Линукс для оберонщиков. |
Автор: | Димыч [ Четверг, 06 Май, 2010 17:26 ] |
Заголовок сообщения: | Re: Перевод BlackBox под Linux |
Что у Апача в логах? Похоже, что приложение по какой-то причине неправильно себя ведет при запуске под Апачем. Оно точно запускается в Fare и выдает то, что надо (пишет на консоль)? Можно еще код в студию? |
Автор: | Kubanych [ Четверг, 06 Май, 2010 21:06 ] |
Заголовок сообщения: | Re: Перевод BlackBox под Linux |
Код в студию. ББ: MODULE mycgi; IMPORT Term := Terminal_mod; PROCEDURE Start*; BEGIN Term.InitAtomic; Term.BeginAtomic; Term.String('content-type: text/html'); Term.Ln; Term.Ln; Term.String('<HTML>'); Term.Ln; Term.String('<BODY>'); Term.Ln; Term.String('<P>'); Term.Ln; Term.String("Hello, business!!!"); Term.Ln; Term.String('</P>'); Term.Ln; Term.String('</BODY>'); Term.Ln; Term.String('</HTML>'); Term.Ln; Term.EndAtomic; Term.FreeConsole; END Start; BEGIN Start; END mycgi. XDS: <*+MAIN*> MODULE hello; IMPORT Out; BEGIN Out.String('content-type: text/html'); Out.Ln; Out.Ln; Out.String('<HTML>'); Out.Ln; Out.String('<BODY>'); Out.Ln; Out.String('<P>'); Out.Ln; Out.String("Hello, business!!!"); Out.Ln; Out.String('</P>'); Out.Ln; Out.String('</BODY>'); Out.Ln; Out.String('</HTML>'); Out.Ln; END hello. Про логи апача еще не разбирался. Версия индейца httpd-2.2.15-win32-x86-no_ssl.msi |
Автор: | Kubanych [ Четверг, 06 Май, 2010 21:09 ] |
Заголовок сообщения: | Re: Перевод BlackBox под Linux |
Как видите, пример простейший. В Фаре точно запускается и точно выдает все, что надо на экран. |
Автор: | Илья Ермаков [ Четверг, 06 Май, 2010 21:21 ] |
Заголовок сообщения: | Re: CGI-приложения на ББ (Линукс и Windows) |
Возможно, для работы с Апачем не нужно открывать консоль, а просто открыть стандартный ввод-вывод (см. нутро Terminal). Система уже связывает эти потоки с другим приложением, а тут мы заказываем консоль - вот оно и рвётся.. Это предположение. |
Автор: | Евгений Темиргалеев [ Четверг, 06 Май, 2010 22:16 ] |
Заголовок сообщения: | Re: CGI-приложения на ББ (Линукс и Windows) |
Win32 Api писал(а): AllocConsole The AllocConsole function allocates a new console for the calling process. ... Remarks ... AllocConsole also sets up standard input, standard output, and standard error handles for the new console. The standard input handle is a handle to the console's input buffer, and the standard output and standard error handles are handles to the console's screen buffer... Посмотрите viewtopic.php?f=47&t=2626&start=0. Перенаправление в файл вроде работало... |
Автор: | Kubanych [ Пятница, 07 Май, 2010 07:31 ] |
Заголовок сообщения: | Re: CGI-приложения на ББ (Линукс и Windows) |
Спасибо. Заработало с подсистемой с viewtopic.php?f=47&t=2626&start=0 . Действительно, причина была в том, что в прежнем варианте перенаправление > в текстовый файл не работало. Остался один вопрос. Есть ли у кого пример с использованием WinApi.GetEnvironmentVariable ? Это надо для того, чтобы наш CGI получил свои данные через метод POST. И тогда все блэкбоксеры могут свои динам. сайты делать на BB. |
Автор: | Kubanych [ Пятница, 07 Май, 2010 08:01 ] |
Заголовок сообщения: | Re: CGI-приложения на ББ (Линукс и Windows) |
Все, все, попробовал "в лоб" и нашел. MODULE myenv; IMPORT Log := StdLog, Win:=WinApi; PROCEDURE Do* (); VAR lpBuffer: ARRAY 256 OF CHAR; nSize,res: INTEGER; BEGIN res:=Win.GetEnvironmentVariableW ('PATH', lpBuffer, nSize); HALT(1); END Do; END myenv. Теперь будем соединять с mySQL и потом делать вариант для Линукса. |
Автор: | igor [ Пятница, 07 Май, 2010 08:35 ] |
Заголовок сообщения: | Re: CGI-приложения на ББ (Линукс и Windows) |
Kubanych писал(а): ... блэкбоксеры ... "Чёрные боксёры"
|
Автор: | Kubanych [ Пятница, 07 Май, 2010 12:21 ] |
Заголовок сообщения: | Re: CGI-приложения на ББ (Линукс и Windows) |
Еще одна проблема вышла. Слинкованный с ключом dos exe файл при вызове Win.GetEnvironmentVariableW и Win.GetEnvironmentVariableA возвращает мусор . При запуске из самого ББ выходит нормальное значение переменной окружения PATH. Какие могут быть "мысли об Обероне" по поводу обхода этой проблемы? MODULE mycgi2; IMPORT Term := ConsoleOut, Win:=WinApi; CONST var1='PATH'; PROCEDURE Start*; VAR lpBuffer: ARRAY 256 OF CHAR; lpBuffer2: ARRAY 256 OF SHORTCHAR; nSize,res: INTEGER; BEGIN Term.Open; Term.String('content-type: text/html'); Term.Ln; Term.Ln; Term.String('<HTML>'); Term.Ln; Term.String('<BODY>'); Term.Ln; Term.String('<P>'); Term.Ln; Term.String(var1); Term.Ln; Term.String('</P>'); Term.Ln; res:=Win.GetEnvironmentVariableW ('PATH', lpBuffer, nSize); Term.Int(res,10); Term.Ln; res:=Win.GetEnvironmentVariableA ('PATH', lpBuffer2, nSize); Term.Int(res,10); Term.Ln; Term.String('<P>'); Term.Ln; Term.String(lpBuffer); Term.Ln; Term.String('</P>'); Term.Ln; Term.String('<P>'); Term.Ln; Term.String("Hello, business!!!"); Term.Ln; Term.String('</P>'); Term.Ln; Term.String('</BODY>'); Term.Ln; Term.String('</HTML>'); Term.Ln; END Start; BEGIN Start; END mycgi2. mycgi2.Start DevLinker.LinkExe dos mycgi2.exe := National Kernel+ Math Strings ConsoleOpen ConsoleStdStreams ConsoleIn ConsoleOut mycgi2~ |
Автор: | Иван Горячев [ Пятница, 07 Май, 2010 13:03 ] |
Заголовок сообщения: | Re: CGI-приложения на ББ (Линукс и Windows) |
Kubanych писал(а): Какие могут быть "мысли об Обероне" по поводу обхода этой проблемы? Усё работает: Код: MODULE PrivEnv; IMPORT Log, WinConsole, WinApi; PROCEDURE Do*; VAR s : ARRAY 256 OF CHAR; res, size : INTEGER; BEGIN res := WinApi.GetEnvironmentVariableW("PATH", s, 255); IF res = 0 THEN Log.String("GetEnvironmentVariableW fail") ELSIF res > 255 THEN Log.String("Buffer too small. "); Log.Int(res); Log.String(" characters required") ELSE Log.String("PATH='"); Log.String(s$); Log.String("'") END; Log.Ln END Do; BEGIN Do END PrivEnv. (!)DevLinker.LinkExe dos EnvTest.exe := Kernel+ Files Math Strings Dialog Log WinConsole PrivEnv Код: C:\BlackBox\Community\1.6.New>EnvTest.exe PATH='C:\Program Files\Far;C:\WINDOWS\system32;C:\WINDOWS;C:\WINDOWS\System32\Wbem;C:\Program Files\Java\jre6\bin;C:\Program Files\Java\jdk1.6.0_07\bin' ББ 1.6. Может размер строки указать забыли при вызове? |
Автор: | Александр Ильин [ Пятница, 07 Май, 2010 14:21 ] |
Заголовок сообщения: | Re: CGI-приложения на ББ (Линукс и Windows) |
Kubanych писал(а): res:=Win.GetEnvironmentVariableW ('PATH', lpBuffer, nSize); nSize кто будет инициализировать?Kubanych писал(а): Какие могут быть "мысли об Обероне" по поводу обхода этой проблемы? Об Обероне - никаких. ; )PS: Лучше в таких случаях используйте LEN(lpBuffer). |
Автор: | Kubanych [ Пятница, 07 Май, 2010 21:43 ] |
Заголовок сообщения: | Re: CGI-приложения на ББ (Линукс и Windows) |
Цитата: nSize кто будет инициализировать? I am sorry!!! Отвык от таких неудобств сишных функций за 5 лет работы на ББ . Действительно, все работает. |
Автор: | Kubanych [ Суббота, 08 Май, 2010 10:34 ] |
Заголовок сообщения: | Re: CGI-приложения на ББ (Линукс и Windows) |
Уважаемые коллеги. Собственно говоря, вот и CGI на BlackBox. Попробуйте. Благодарности всем, кто содействовал. Всякие проверки можете добавить сами на свое усмотрение. MODULE mycgi2; (*C:\Program Files\Apache Software Foundation\Apache2.2\cgi-bin\mycgi2.exe*) IMPORT Out := ConsoleOut, In:=ConsoleIn, Win:=WinApi,Strings; PROCEDURE Start*; VAR res: INTEGER; lpBuffer: ARRAY 256 OF CHAR; size,i:INTEGER; c:CHAR; BEGIN Out.Open; Out.String('content-type: text/html'); Out.Ln; Out.Ln; Out.String('<HTML>'); Out.Ln; Out.String('<BODY>'); Out.Ln; res:=Win.GetEnvironmentVariableW ('REQUEST_METHOD', lpBuffer, 255); IF (res#0) THEN IF (lpBuffer='POST') THEN Out.String('<P> REQUEST_METHOD POST</P>'); Out.Ln; res:=Win.GetEnvironmentVariableW ('QUERY_STRING', lpBuffer, 255); Out.String('<P>QUERY_STRING</P>'); Out.Ln; Out.String('<P>['+lpBuffer+']</P>'); Out.Ln; res:=Win.GetEnvironmentVariableW ('CONTENT_LENGTH', lpBuffer, 255); Out.String('<P>CONTENT_LENGTH</P>'); Out.Ln; Out.String('<P>['+lpBuffer+']</P>'); Out.Ln; Strings.StringToInt(lpBuffer,size,res); Out.String('<P>StdIn</P>'); Out.Ln; Out.String('<P>'); Out.Ln; i:=0; WHILE i<size DO In.Char(c); Out.Char(c); INC(i) END; Out.String('</P>'); Out.Ln; ELSIF (lpBuffer='GET') THEN Out.String('<P> REQUEST_METHOD GET</P>'); Out.Ln; res:=Win.GetEnvironmentVariableW ('QUERY_STRING', lpBuffer, 255); Out.String('<P>QUERY_STRING</P>'); Out.Ln; Out.String('<P>['+lpBuffer+']</P>'); Out.Ln; ELSE Out.String('<P> INCORRECT REQUEST_METHOD OR INCORRECT SERVER CONFIGS</P>'); Out.Ln; END; ELSE Out.String('<P> INCORRECT SERVER CONFIGS</P>'); Out.Ln; END; Out.String('</BODY>'); Out.Ln; Out.String('</HTML>'); Out.Ln; END Start; BEGIN Start; END mycgi2. mycgi2.Start DevLinker.LinkExe dos mycgi2.exe := National Kernel+ Math Strings ConsoleOpen ConsoleStdStreams ConsoleIn ConsoleOut mycgi2~ C:\Program Files\Apache Software Foundation\Apache2.2\htdocs\myform.htm ----------------------------------- <html> <body> <form method="POST" action="/cgi-bin/mycgi2.exe?preved"> <p>ФИО :<input type="text" name="realname" size=40></p> <p>Оперативный псевдоним :<input type="text" name="nick" size=40></p> <p> Послужной список </p> <p><textarea name ="biography" cols="40" rows="8"></textarea></p> <input type="submit" name="sumbit" value="Подача запроса"> <input type="reset" name="reset" value="Сброс"> </form> </body> </html> ----------------------------------- Осталось сделать вариант для Линукса, пристегнуть mySQL через его API для C и вынести платформозависимый код в отдельный модуль. И тогда можно все заказные многопользовательские программы на BlackBox делать сразу под Интернет или лок сеть с клиентом - браузером, не будет мороки с администрированием многих клиентских рабочих мест. Надеюсь, для программистов на BlackBox это будет достаточной мотивацией для массового перехода на использование варианта BlackBox для Linux с предварительной подготовкой всего кода в Windows. Ну, а если народ начнет использовать, то значит народ начнет доделывать. На сегодняшний день место Линукса - на сервере. Вот и будем это место эксплуатировать по мере всех сил. Завтра, после появления полноценного BB с графич. режимом для Линукса и написания в силу этого большого числа программ с GUI для Линукса, возможно, место Линукса станет сначала на заточенном рабочем месте, а потом и везде. И тогда из экстремистов-маргиналов мы станем мейнстримистами-универсалами. |
Автор: | Kubanych [ Суббота, 08 Май, 2010 11:03 ] |
Заголовок сообщения: | Re: CGI-приложения на ББ (Линукс и Windows) |
Кстати, обещанные подсистемы для программирования под Автокад и будущей замены Автокада ("важный укрепрайон") лежат на http://www.obasoft.narod.ru/blackbox.htm |
Автор: | Kubanych [ Суббота, 08 Май, 2010 12:51 ] |
Заголовок сообщения: | Re: CGI-приложения на ББ (Линукс и Windows) |
Уважаемый Иван Кузьмицкий. Цитата: Привязку к API MySQL я могу сделать, благо что задача попутная, и так стоит в планах на ближайшее время. Вы еще не начали соединять ББ к mySQL APi? |
Страница 1 из 1 | Часовой пояс: UTC + 3 часа |
Powered by phpBB® Forum Software © phpBB Group https://www.phpbb.com/ |