powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / UDF под win работает, под Linux нет. Ну почему ???
12 сообщений из 12, страница 1 из 1
UDF под win работает, под Linux нет. Ну почему ???
    #32183173
Acue
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
/* script */
DECLARE EXTERNAL FUNCTION "TrimR" CSTRING(254)
RETURNS CSTRING(254) FREE_IT
ENTRY_POINT 'TrimR' MODULE_NAME 'udf';

/* delphi / kylix */
function TrimR(CString1: PChar): PChar; stdcall; export;
Begin
TrimR:=PChar(TrimRight(CString1));
End;

/* results */

Под виндой все катит.
Под Linux сервер на вызов фукнции падает, а в Interbase.Log имеем:
Segmentation Fault. The code attempted to access memory without privilege to do so.

IB 6.0.1
...
Рейтинг: 0 / 0
UDF под win работает, под Linux нет. Ну почему ???
    #32183211
Фотография Dnico
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Может все же надо написать Result := PChar(TrimRight(CString1));


Код: plaintext
1.
2.
3.
4.
5.
function TrimR(CString1: PChar): PChar; cdecl; export; // cdecl вместо stdcall
Begin 
 Result := PChar(TrimRight(CString1));
End; 

...
Рейтинг: 0 / 0
UDF под win работает, под Linux нет. Ну почему ???
    #32183220
Acue
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вот эта работает и там и там

/* scrypt */
DECLARE EXTERNAL FUNCTION "DatRuStr" DATE
RETURNS CString(10) FREE_IT
ENTRY_POINT 'DatRuStr' MODULE_NAME 'udf'

/* Delphi / Kylix */
function DatRuStr(var IBDate: TIBDate): PChar; stdcall; export;
Begin
DatRuStr:=PChar(DateToStr(IBDate-15018));
End;
...
Рейтинг: 0 / 0
UDF под win работает, под Linux нет. Ну почему ???
    #32183234
Gold
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Неправильно использовать функцию StdCall. Нужно cdecl. В Борландовской доке ошибка.
...
Рейтинг: 0 / 0
UDF под win работает, под Linux нет. Ну почему ???
    #32183568
Acue
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Не помогло. :-((
...
Рейтинг: 0 / 0
UDF под win работает, под Linux нет. Ну почему ???
    #32183594
Gold
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Может чё-то с правами на файл не то?
...
Рейтинг: 0 / 0
UDF под win работает, под Linux нет. Ну почему ???
    #32183598
Acue
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Если в объявлении опустить Free_IT, а функцию подправить:
/* script */
DECLARE EXTERNAL FUNCTION "TrimR" CSTRING(254)
RETURNS CSTRING(254)
ENTRY_POINT 'TrimR' MODULE_NAME 'udf';

/* delphi / kylix */
function TrimR(CString1: PChar): PChar; stdcall; export;
Begin
TrimR:=PChar(TrimRight(CString1)+ #0 );
End;

то тогда работает,
но вроде так не правильно, или я чего не догоняю.
Опять же под Windows работает с Free_IT и без #0
...
Рейтинг: 0 / 0
UDF под win работает, под Linux нет. Ну почему ???
    #32183602
Gold
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ты обязательно исправь stdcall на cdecl.
Могут быть проблемы. У меня уже было. Функция работала, работала, а в одном месте выдавала левые результаты. Я задолбался потом выяснять, что не так.
...
Рейтинг: 0 / 0
UDF под win работает, под Linux нет. Ну почему ???
    #32183603
Acue
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Это я исправил, просто скопировал с верхнего поста.
Но все таки странно, это я насчет Free_IT не Free_IT
...
Рейтинг: 0 / 0
UDF под win работает, под Linux нет. Ну почему ???
    #32183611
Gold
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Попробуй StrPCopy(Result,TrimRight(CString1))

Вобще-то это чё-то с менеджером памяти. Можешь вверху попробовать прописать первым модулем ShareMem

uses ShareMem, ... остальные модули
...
Рейтинг: 0 / 0
UDF под win работает, под Linux нет. Ну почему ???
    #32183861
Фотография Dnico
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А что за параметр FREE_IT ты знаешь?

Так вот: Он должен использоваться в том случае, если ты в функции делаешь распределение памяти. И тут надо ее освободить после выполнения твоей функции. В твоем варианте - этот параметр не должен указываться.

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
 /* script */  
DECLARE EXTERNAL FUNCTION  "TrimR"  CSTRING( 254 ) 
RETURNS CSTRING( 254 )
ENTRY_POINT 'TrimR' MODULE_NAME 'udf'; 

 /* delphi / kylix */  

function TrimR(CString1: PChar): PChar; cdecl; export; 
Begin 
 
  Return := PChar(TrimRight(CString1)); 

End; 

 /* results */  




Вот это 100% работает и на Linux и в Windows!
...
Рейтинг: 0 / 0
UDF под win работает, под Linux нет. Ну почему ???
    #32184643
Acue
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Спасибо, за то что успокоили. malloc действительно не используем, но я вообще-то думал, что Delphi все же выделяет какую-то память на помещение результата функции и ее надо бы почистить. Теперь объявляем без FREE_IT.
А для надежности функцию переписали:
Код: plaintext
1.
2.
3.
4.
5.
function TrimR(CString1: PChar): PChar; cdecl; export;
Begin
  while (StrLen(CString1)<> 0 ) and (CString1[StrLen(CString1)- 1 ]<# 33 ) do
    CString1[StrLen(CString1)- 1 ]:=# 0 ;
  TrimR:=CString1;
end;


Все работает, уф.
...
Рейтинг: 0 / 0
12 сообщений из 12, страница 1 из 1
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / UDF под win работает, под Linux нет. Ну почему ???
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]