Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

UDF [D7, XP]


Страницы:   1 2 3 4 5

Irish_34 ©   (2007-12-10 20:02:00) 

Привет ВСЕМ, помогите пожалусто UDF, начиная работать в процедуре "спотыкается" об чего, я уже не знаю в чем и ошибка и чге я некоректно что обозвала

DECLARE EXTERNAL FUNCTION CEX6
   VARCHAR(50)
RETURNS VARCHAR(50) BY DESCRIPTOR
ENTRY_POINT 'psc6' MODULE_NAME 'PDL6.dll'

function psc6(var s:PChar):PChar;cdecl;export;
var
j1,i1:byte;
j: PSmallInt;
s1: string;
 begin
 j:=nil;
 j1:=0;
 i1:=0;
 if ((s=nil) or (s='0') or (s='')) then
  Result:='0'
  else
   if StrPos(s,'6')<>nil then
    begin
     j:=PSmallInt(StrPos(s,'6'));
     s1:=PChar(s)^;
     Result:='';
     delete(s1,1,j^+1);
     if Length(s1)=1 then //s:=copy(s1,1,1)
     StrPLcopy(Result,s1,1)
     else
      begin
       for i1:=1 to length(s1) do
        if ((s1[i1]=',') or (s1[i1]='.') or (s1[i1]=';') or (s1[i1]=' '))
        then
         begin
          delete(s1,i1,length(s1));
            StrPLcopy(Result,s1,length(s1));
         end
        else StrPLcopy(Result,s1,2);
       end;
       end
    else
   Result:='';
   end;


irish_34   (2007-12-12 12:10:00) [81]


> Desdechado ©

Unsuccessful execution caused by a system error that precludes
Successful execution of subsequent statements.
Unable to complete network request to host “”.
Error reading data from the connection.


Desdechado   (2007-12-12 08:47:00) [82]

> системная ошибка из-за выражения которое не может успешно
> выполниться
Да ну? А я думал, FB по-русски не ругается.


Сергей М.   (2007-12-12 08:40:00) [83]

Т.е. результирующая строка не может быть длиннее исходной ?
Тогда можно поступить проще:

DECLARE EXTERNAL FUNCTION CEX6
  VARCHAR(50)
RETURNS PARAMETER 1
ENTRY_POINT 'psc6' MODULE_NAME 'PDL6.dll'

function psc6(AString:PChar):PChar; cdecl;
var
 tmpstr: String;
..
begin
 tmpstr := AString;

... работа с локальной копией (tmpstr) исходной строки в соответствии с [17]
..  результат обработки подразумевается находящимся там же, т.е. в tmpstr

 Result := lstrcpy(AString, PChar(tmpstr)); //возврат результата  
end;


irish_34   (2007-12-11 18:31:00) [84]


> Сергей М.

выделить часть строки после '6' без разделителей


Сергей М.   (2007-12-11 08:11:00) [85]


> Irish_34


Что должна делать эта функция ?


irish_34   (2007-12-10 23:10:00) [86]

системная ошибка из-за выражения которое не может успешно выполниться
написано что так следует передавать параметр в UDF


Desdechado   (2007-12-10 23:03:00) [87]

> ( vars:PChar)
Зачем это?


Desdechado   (2007-12-10 23:00:00) [88]

1.что_дальше?
Текст ошибки где?
Терпение не резиновое...


trubin   (2007-12-10 22:59:00) [89]

Пишешь "by descriptor", только не видно, где ты у себя в функции используешь структуру дескриптора параметра. А на null можно и проверку в ХП делать.


irish_34   (2007-12-10 22:54:00) [90]

FB1


Desdechado   (2007-12-10 22:50:00) [91]

Кроме того, не все модификаторы доступны в разных версиях IB|FB. А ты даже сам сервер не указало, так что о чем речь?


Desdechado   (2007-12-10 22:49:00) [92]

> но судя по попытке запроса выполниться ошибка не в регистрации UDF
Увы, я, не видя ошибки, ничего посоветовать не могу.


irish_34   (2007-12-10 22:34:00) [93]

но судя по попытке запроса выполниться ошибка не в регистрации UDF


irish_34   (2007-12-10 22:26:00) [94]

ну значит и не надо вовлекать сюда FREE_IT, BY DESCRIPTOR по написанному (в тоё же статье) с null позволяет работать, хотя в этой суюд и без него нормально всё работало


Desdechado   (2007-12-10 22:14:00) [95]

Нужно не лепить их бездумно, а понимать, для чего они. FREE_IT, наприер, нужно для того, чтобы сервер освободил выделенную в UDF (и вовзернутую ему)  память после того, как она стала не нужна.


irish_34   (2007-12-10 21:18:00) [96]

а про BY DESCRIPTOR как раз в статье прочла


irish_34   (2007-12-10 21:17:00) [97]

Спасибо большое :*
а без "FREE_IT" разве ни как нельзя....


trubin   (2007-12-10 20:56:00) [98]

1)
> RETURNS VARCHAR(50) BY DESCRIPTOR


зачем "by descriptor", надо "FREE_IT"

2)
Память под Result не выделяется

3)
> s1:=PChar(s)^;

s1:= string(s);


irish_34   (2007-12-10 20:17:00) [99]

Перечитала....


Johnmen   (2007-12-10 20:11:00) [100]

http://www.ibase.ru/devinfo/udf_ok.htm


Страницы:   1 2 3 4 5

Наверх

Титульная страница Поиск, карта сайта Написать письмо