OberonCore

Библиотека  Wiki  Форум  BlackBox  Компоненты  Проекты
Текущее время: Четверг, 28 Март, 2024 23:14

Часовой пояс: UTC + 3 часа




Начать новую тему Ответить на тему  [ Сообщений: 19 ] 
Автор Сообщение
 Заголовок сообщения: CGI-приложения на ББ (Линукс и Windows)
СообщениеДобавлено: Четверг, 06 Май, 2010 13:07 

Зарегистрирован: Суббота, 04 Март, 2006 15:13
Сообщения: 674
Откуда: СССР
Уважаемый Илья Ермаков.

Вы выложили модули 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 и не мучаться
с неудобными языками программирования.

С уважением,
Кубаныч.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Перевод BlackBox под Linux
СообщениеДобавлено: Четверг, 06 Май, 2010 13:38 
Аватара пользователя

Зарегистрирован: Среда, 29 Март, 2006 12:09
Сообщения: 495
Такое поведение бывает у приложений, которые позиционируются как GUI, но фактически являются консольными. У DevLinker есть ключик dos, позволяющий в EXE прописать "консольность" при сборке. Не спрашивайте меня только, как его указывать ;)
Знаю это из анализа исходников.

Должно помочь.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Перевод BlackBox под Linux
СообщениеДобавлено: Четверг, 06 Май, 2010 14:49 
Модератор
Аватара пользователя

Зарегистрирован: Понедельник, 14 Ноябрь, 2005 18:39
Сообщения: 9459
Откуда: Россия, Орёл
нужно линковать вот так:

DevLinker.Link dos YourConsoleApp.exe := Kernel$+ Files HostFiles ...


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Перевод BlackBox под Linux
СообщениеДобавлено: Четверг, 06 Май, 2010 17:07 

Зарегистрирован: Суббота, 04 Март, 2006 15:13
Сообщения: 674
Откуда: СССР
Спасибо за оперативный ответ. Попробовал.

В Fare теперь exe файл выводит данные в том же консольном окне, но апач все равно
продолжает давать Internal Server Error (перезапускал апач, менял имя CGI файла).

Такая же программа на XDS работает без проблем.

И еще остался второй вопрос о переменных среды.
Интерес у нас общий - популяризация BlackBox среди линуксоидов и возможность
выхода на Линукс для оберонщиков.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Перевод BlackBox под Linux
СообщениеДобавлено: Четверг, 06 Май, 2010 17:26 
Аватара пользователя

Зарегистрирован: Среда, 29 Март, 2006 12:09
Сообщения: 495
Что у Апача в логах?
Похоже, что приложение по какой-то причине неправильно себя ведет при запуске под Апачем.
Оно точно запускается в Fare и выдает то, что надо (пишет на консоль)?
Можно еще код в студию?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Перевод BlackBox под Linux
СообщениеДобавлено: Четверг, 06 Май, 2010 21:06 

Зарегистрирован: Суббота, 04 Март, 2006 15:13
Сообщения: 674
Откуда: СССР
Код в студию.

ББ:
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


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Перевод BlackBox под Linux
СообщениеДобавлено: Четверг, 06 Май, 2010 21:09 

Зарегистрирован: Суббота, 04 Март, 2006 15:13
Сообщения: 674
Откуда: СССР
Как видите, пример простейший. В Фаре точно запускается и точно выдает все, что надо на экран.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Четверг, 06 Май, 2010 21:21 
Модератор
Аватара пользователя

Зарегистрирован: Понедельник, 14 Ноябрь, 2005 18:39
Сообщения: 9459
Откуда: Россия, Орёл
Возможно, для работы с Апачем не нужно открывать консоль, а просто открыть стандартный ввод-вывод (см. нутро Terminal).

Система уже связывает эти потоки с другим приложением, а тут мы заказываем консоль - вот оно и рвётся..

Это предположение.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Четверг, 06 Май, 2010 22:16 
Модератор
Аватара пользователя

Зарегистрирован: Среда, 16 Ноябрь, 2005 00:53
Сообщения: 4625
Откуда: Россия, Орёл
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. Перенаправление в файл вроде работало...


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Пятница, 07 Май, 2010 07:31 

Зарегистрирован: Суббота, 04 Март, 2006 15:13
Сообщения: 674
Откуда: СССР
Спасибо. Заработало с подсистемой с

viewtopic.php?f=47&t=2626&start=0 .

Действительно, причина была в том, что в прежнем
варианте перенаправление > в текстовый файл не работало.

Остался один вопрос.
Есть ли у кого пример с использованием WinApi.GetEnvironmentVariable ?

Это надо для того, чтобы наш CGI получил свои данные через метод POST.
И тогда все блэкбоксеры могут свои динам. сайты делать на BB.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Пятница, 07 Май, 2010 08:01 

Зарегистрирован: Суббота, 04 Март, 2006 15:13
Сообщения: 674
Откуда: СССР
Все, все, попробовал "в лоб" и нашел.

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 и потом делать вариант для Линукса.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Пятница, 07 Май, 2010 08:35 

Зарегистрирован: Вторник, 13 Ноябрь, 2007 20:38
Сообщения: 1056
Kubanych писал(а):
... блэкбоксеры ...
"Чёрные боксёры" :D


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Пятница, 07 Май, 2010 12:21 

Зарегистрирован: Суббота, 04 Март, 2006 15:13
Сообщения: 674
Откуда: СССР
Еще одна проблема вышла.

Слинкованный с ключом 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 

Зарегистрирован: Суббота, 26 Ноябрь, 2005 10:37
Сообщения: 875
Откуда: Россия, Владивосток
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 
Аватара пользователя

Зарегистрирован: Вторник, 19 Сентябрь, 2006 21:54
Сообщения: 2449
Откуда: Россия, Томск
Kubanych писал(а):
res:=Win.GetEnvironmentVariableW ('PATH', lpBuffer, nSize);
nSize кто будет инициализировать?
Kubanych писал(а):
Какие могут быть "мысли об Обероне" по поводу обхода этой проблемы?
Об Обероне - никаких. ; )

PS: Лучше в таких случаях используйте LEN(lpBuffer).


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Пятница, 07 Май, 2010 21:43 

Зарегистрирован: Суббота, 04 Март, 2006 15:13
Сообщения: 674
Откуда: СССР
Цитата:
nSize кто будет инициализировать?


I am sorry!!! Отвык от таких неудобств сишных функций за 5 лет работы на ББ :).
Действительно, все работает.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Суббота, 08 Май, 2010 10:34 

Зарегистрирован: Суббота, 04 Март, 2006 15:13
Сообщения: 674
Откуда: СССР
Уважаемые коллеги.
Собственно говоря, вот и 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 для Линукса,
возможно, место Линукса станет сначала на заточенном рабочем месте, а потом и везде.

И тогда из экстремистов-маргиналов мы станем мейнстримистами-универсалами.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Суббота, 08 Май, 2010 11:03 

Зарегистрирован: Суббота, 04 Март, 2006 15:13
Сообщения: 674
Откуда: СССР
Кстати, обещанные подсистемы для программирования под Автокад и
будущей замены Автокада ("важный укрепрайон") лежат на
http://www.obasoft.narod.ru/blackbox.htm


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Суббота, 08 Май, 2010 12:51 

Зарегистрирован: Суббота, 04 Март, 2006 15:13
Сообщения: 674
Откуда: СССР
Уважаемый Иван Кузьмицкий.

Цитата:
Привязку к API MySQL я могу сделать, благо что задача попутная, и так стоит в планах на ближайшее время.


Вы еще не начали соединять ББ к mySQL APi?


Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 19 ] 

Часовой пояс: UTC + 3 часа


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 6


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Вся информация, размещаемая участниками на конференции (тексты сообщений, вложения и пр.) © 2005-2024, участники конференции «OberonCore», если специально не оговорено иное.
Администрация не несет ответственности за мнения, стиль и достоверность высказываний участников, равно как и за безопасность материалов, предоставляемых участниками во вложениях.
Без разрешения участников и ссылки на конференцию «OberonCore» любое воспроизведение и/или копирование высказываний полностью и/или по частям запрещено.
Powered by phpBB® Forum Software © phpBB Group
Русская поддержка phpBB