Файл cuspapp.inc

Вопросы программирования на Free Pascal, использования компилятора и утилит.

Модератор: Модераторы

Сообщение SovNarKom » 02.08.2005 13:13:54

В названии темы - custapp
Вот копал я cgi копал и почти сразу наткнулся на странное... при инициализации TCGIApplication, программа валится в SIGSERV... разбор полётов показал, что происходит это в процедуре custapp.inc -> SysGetEnvironmentList
И тут самое странное - комментарий в заголовке этого файла:
{
    This file is part of the Free Pascal run time library.
    Copyright © 2003 by the Free Pascal development team

    Linux version of custom app object routines.

    See the file COPYING.FPC, included in this distribution,
    for details about the copyright.

    This program is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

**********************************************************************}

function GetEnvironmentStrings : pchar; external 'kernel32' name 'GetEnvironmentStringsA';
function FreeEnvironmentStrings(p : pchar) : longbool; external 'kernel32' name 'FreeEnvironmentStringsA';



Linux version?

Лежит он, кстати, в win32.
Laz 1.9.7 - 1.9.9
SovNarKom
постоялец
 
Сообщения: 389
Зарегистрирован: 28.05.2005 10:37:39
Откуда: Воронеж [vrn] [36]

Сообщение ushakov » 02.08.2005 14:41:03

Код: Выделить всё
function GetEnvironmentStrings : pchar; external 'kernel32' name 'GetEnvironmentStringsA';

kernel32.dll - библиотека из WinNT/2k/XP

GetEnvironmentStringsA - ASCII-версия функции GetEnvironmentStrings (есть еще GetEnvironmentStringsW - unicode-версия)
ushakov
новенький
 
Сообщения: 51
Зарегистрирован: 18.05.2005 11:15:48
Откуда: Украина, Киев

Сообщение SovNarKom » 02.08.2005 15:24:07

ushakov
kernel32.dll - библиотека из WinNT/2k/XP

Вот, правильно, значит текст
Linux version of custom app object routines.

Является ошибкой.

А глючит вот эта процедура:
Код: Выделить всё
Procedure SysGetEnvironmentList(List : TStrings;NamesOnly : Boolean);

var
  s : string;
  i,l : longint;
  hp,p : pchar;

begin
 p:=GetEnvironmentStrings;
 hp:=p;
 while hp^<>#0 do
   begin
   s:=strpas(hp);
   l:=Length(s);
   If NamesOnly then
     begin
     I:=pos('=',s);
     If (I>0) then
       S:=Copy(S,1,I-1);
     end;
   List.Add(S);
   hp:=hp+l+1;
   end;
  FreeEnvironmentStrings(p);
end;


Причем происходит это так:
1. Вызывается процедура GetEnvironmentStrings; - OK
2. while hp^<>#0 do - сразу попадает в end;
3. Вызывается процедура FreeEnvironmentStrings(p); - OK
4. end; процедуры
5. Снова begin процедуры - уже не понял! Её никто опять не вызывал
6. end; процедуры - это уже глюки
7. SIGSERV ERROR.

Что-то не так с FreeEnvironmentStrings(p);?
SovNarKom
постоялец
 
Сообщения: 389
Зарегистрирован: 28.05.2005 10:37:39
Откуда: Воронеж [vrn] [36]

Сообщение ushakov » 02.08.2005 15:34:26

Из какого юнита эти функции? В custapp.pp нет таких функций.

----------

Нащел :)
ushakov
новенький
 
Сообщения: 51
Зарегистрирован: 18.05.2005 11:15:48
Откуда: Украина, Киев

Сообщение SovNarKom » 02.08.2005 16:52:27

Так.... Судя по всему
Код: Выделить всё
function GetEnvironmentStringsSub : pchar; external 'kernel32' name 'GetEnvironmentStringsA';

нехорошо... она то возвращает нормальный pchar, то пустоту... nil -> отсюда и SIGSERV при pChar^
------------------спустя некоторое время...
Кто забыл поставить stdcall :)
Так, теперь надо перекомпилировать FPC из под Лазаруса.

Кстати никто ещё не натыкался? Странно... в BUG листе нет вроде...
Видимо осталась старая версия - со времён FPC 1.0 там по умолчаню был stdcall
SovNarKom
постоялец
 
Сообщения: 389
Зарегистрирован: 28.05.2005 10:37:39
Откуда: Воронеж [vrn] [36]

Сообщение SovNarKom » 02.08.2005 17:52:19

Ан-нет... Видимо просто kernel32 - глючит...

Внимание! Это процедура - глючит только во время отладки...
SovNarKom
постоялец
 
Сообщения: 389
Зарегистрирован: 28.05.2005 10:37:39
Откуда: Воронеж [vrn] [36]

Сообщение ushakov » 03.08.2005 13:47:20

>Внимание! Это процедура - глючит только во время отладки...

Может это связано с тем, что буфер под строку выделяется не в адресном пространстве процесса? Обычно win32 api успользует указатели на уже распределенное пространство внутри адресного пространства процесса, а эта функция одно из исключений.
ushakov
новенький
 
Сообщения: 51
Зарегистрирован: 18.05.2005 11:15:48
Откуда: Украина, Киев

Сообщение SovNarKom » 03.08.2005 16:25:36

ushakov
Факт в том, что до того как я поставил stdcall - прога регулярно валилась в AV...
Теперь прога в AV не валится но в режиме отладки эта процедура возвращает пустую строку. В Delphi она тоже не супер работает... но возвращает :=:=#10#13 или что-то в этом роде. :unsure:
Но теперь без отладчика всё ОК :) cgi - пашет.
SovNarKom
постоялец
 
Сообщения: 389
Зарегистрирован: 28.05.2005 10:37:39
Откуда: Воронеж [vrn] [36]


Вернуться в Free Pascal Compiler

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

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

Рейтинг@Mail.ru