Файл cuspapp.inc

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

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

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

Сообщение SovNarKom »

В названии темы - 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
ushakov
новенький
Сообщения: 51
Зарегистрирован: 18.05.2005 11:15:48
Откуда: Украина, Киев

Сообщение ushakov »

Код: Выделить всё

function GetEnvironmentStrings : pchar; external 'kernel32' name 'GetEnvironmentStringsA';

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

GetEnvironmentStringsA - ASCII-версия функции GetEnvironmentStrings (есть еще GetEnvironmentStringsW - unicode-версия)
SovNarKom
постоялец
Сообщения: 389
Зарегистрирован: 28.05.2005 10:37:39
Откуда: Воронеж [vrn] [36]
Контактная информация:

Сообщение SovNarKom »

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);?
ushakov
новенький
Сообщения: 51
Зарегистрирован: 18.05.2005 11:15:48
Откуда: Украина, Киев

Сообщение ushakov »

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

----------

Нащел :)
SovNarKom
постоялец
Сообщения: 389
Зарегистрирован: 28.05.2005 10:37:39
Откуда: Воронеж [vrn] [36]
Контактная информация:

Сообщение SovNarKom »

Так.... Судя по всему

Код: Выделить всё

 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 »

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

Внимание! Это процедура - глючит только во время отладки...
ushakov
новенький
Сообщения: 51
Зарегистрирован: 18.05.2005 11:15:48
Откуда: Украина, Киев

Сообщение ushakov »

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

Может это связано с тем, что буфер под строку выделяется не в адресном пространстве процесса? Обычно win32 api успользует указатели на уже распределенное пространство внутри адресного пространства процесса, а эта функция одно из исключений.
SovNarKom
постоялец
Сообщения: 389
Зарегистрирован: 28.05.2005 10:37:39
Откуда: Воронеж [vrn] [36]
Контактная информация:

Сообщение SovNarKom »

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