powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Помогите с UDF
13 сообщений из 13, страница 1 из 1
Помогите с UDF
    #32393008
Kadi
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Есть проблемма нужно строку вида 12.2.3.4 переделать в строку вида
12020304
Пишу DLL

Function PTN(var IN_P:PCHAR):PCHAR; cdecl; export;
VAR
Out_Schet,IN_Schet,Stat:ShortString;
Res:pchar;
begin
In_Schet:=StrPas(In_P);
Out_schet:='';
Res:='';
Repeat
if (Pos('.',In_SCHET)=0) and (Length(In_SCHET)<>0)
then In_SCHET:=In_SCHET+'.';
Stat:='';
Stat:=copy(In_SCHET,1,Pos('.',In_SCHET)-1);
if length(Stat)<2 then Stat:='0'+Stat;
Out_Schet:=Out_Schet+Stat;
In_SCHET:=copy(In_SCHET,Pos('.',In_SCHET)+1,Length(In_Schet));
Until (Pos('.',In_SCHET)=0) and (Length(In_SCHET)=0);
StrPCopy(Res,Out_Schet);
Result:=Res;
end;
Exports
PTN index 1 name 'PTN';
Begin
end.

Пятый день мучаюсь. При вызове функции в IB обрывает связь.
Помогите чайнику, где лажа?
...
Рейтинг: 0 / 0
Помогите с UDF
    #32393037
Фотография Zmeishe
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
1. Насколько я помню dll негативно относится к типам String, ShortString, AnsiString. Скорее всего менеджер памяти подцеплять надо. Либо обойтись простым типом char.

2. Все функции должны быть совместимы с extern "C" и т.д.

Если ты уже успешно писал работающие UDF, попробуй тип char, если не писал научись, может IB не видит точку входа в DLL, посмотри логи. Что там?
...
Рейтинг: 0 / 0
Помогите с UDF
    #32393118
Kadi
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
1. Входные параметры я специально сделал Pchar, как я думаю какие типы крутятся внутри DLL не важно, вход и выход нужного типа.
2. Для совместимости пишу cdecl; export;
3. В логах Access violation.
The code attempted to access a virtual
address without privilege to do so.
This exception will cause the Firebird server
to terminate abnormally.
4. UDF раньше не писал, обходился готовыми, но опыт работы с DLL есть, но чисто на Delphi и для Delphi.
...
Рейтинг: 0 / 0
Помогите с UDF
    #32393245
Фотография Zmeishe
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Попробуй закоментировать тело своей функции целиком. Затем откомпилируй и обратись к UDF из БД.
Если проблема останется - учись писать dll на Delphi (тут я не помошник, у меня только на C++Builder и проблем с Dll нет)
Если изчезнет будем думать.
...
Рейтинг: 0 / 0
Помогите с UDF
    #32393282
dimitr
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
1. Как объявляешь UDF в базе?
2. Не заюзан ли часом в dll-ке модуль ShareMem? Если да, то выкидывай его нафиг.
...
Рейтинг: 0 / 0
Помогите с UDF
    #32393285
Kadi
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Вот это работает:
Function PTN(IN_P:Pchar):PChar; cdecl; export;
begin
Result:=IN_p;
end;
Exports
PTN index 1 name 'PTN';
Begin
end.

Теперь появился следующий вопрос как из строки '11.12' убрать точку используя только PCHAR функции.
...
Рейтинг: 0 / 0
Помогите с UDF
    #32393300
dimitr
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Значит, так. Подключай ibutil.pas, выделяй память под результат с помощью ib_util_malloc(), декларируй функцию с FREE_IT.

У тебя проблема в StrPCopy(Res,Out_Schet) - куда она по-твоему пишет строку? На что указывает Res? И как эта строка будет освобождаться?
...
Рейтинг: 0 / 0
Помогите с UDF
    #32393303
Фотография Zmeishe
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Теперь пробуй так.

Если по С++
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
// Насколько я понял PChar и мой char* это одно и то же.
char* PTN(char* IN_P)
{
  char *C; // Временная переменная
  ShortString In_Schet;
  C = IN_P; // Присвоение временной переменной того, что пришло
  In_Schet =StrPas(C); // Далее работа с временной переменной.
  ....
}
Вообщем сделай аналогию на Паскале.
...
Рейтинг: 0 / 0
Помогите с UDF
    #32393408
Kadi
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Как Выделить память с помощью ib_util_malloc(), что за входной параметр типа integer?
...
Рейтинг: 0 / 0
Помогите с UDF
    #32393571
dimitr
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Размер блока памяти, вестимо.
...
Рейтинг: 0 / 0
Помогите с UDF
    #32393629
Kadi
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Делаю так:
library Conv_ML;
uses
SysUtils,Classes,ib_util;

Function PTN(var IN_P:PCHAR):PCHAR; cdecl; export;
VAR
Out_Schet,IN_Schet,Stat:ShortString;
begin
In_Schet:=StrPas(In_P);
Out_schet:='';
Repeat
if (Pos('.',In_SCHET)=0) and (Length(In_SCHET)<>0) then In_SCHET:=In_SCHET+'.';
Stat:='';
Stat:=copy(In_SCHET,1,Pos('.',In_SCHET)-1);
if length(Stat)<2 then Stat:='0'+Stat;
Out_Schet:=Out_Schet+Stat;
In_SCHET:=copy(In_SCHET,Pos('.',In_SCHET)+1,Length(In_Schet));
Until (Pos('.',In_SCHET)=0) and (Length(In_SCHET)=0);
Result:=ib_util_malloc(Length(Out_Schet)+1);
StrPCopy(Result,Out_Schet);
end;
Exports
PTN index 1 name 'PTN';
Begin
end.

Не работает, что не так?
...
Рейтинг: 0 / 0
Помогите с UDF
    #32393635
Kadi
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
В IB публикую так.
DECLARE EXTERNAL FUNCTION PTN
CSTRING (256)
RETURNS CSTRING (256) FREE_IT
ENTRY_POINT 'PTN' MODULE_NAME 'conv_ML.dll';
...
Рейтинг: 0 / 0
Помогите с UDF
    #32393688
Kadi
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Всем огромное спасибо все пошло, не знаю по чему но вместо
Result:=ib_util_malloc(Length(Out_Schet)+1) было написано
GetMem(Result, Length(Out_Schet)+1)
Хотя я читал на
http://]www.ibase.ru/devinfo/udf_ok.htm

"""""А почему мы "распределяли" память таким способом, не проще ли было через GetMem?
К сожалению, нет. Функции GetMem и FreeMem работают с менеджером памяти Deplhi, который является "надстройкой" над менеджером памяти Win32. Поэтому, поручая IB DataBase "освободить" память, мы должны распределить ее "заранее оговоренным" способом, т.е. при помощи стандартной функции malloc. """""

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


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