Форум: "Базы";
Текущий архив: 2002.01.14;
Скачать: [xml.tar.bz2];
ВнизDLL Найти похожие ветки
← →
Dim (2001-12-10 12:48) [0]Была библиотека с несколькими функциями которые использовались в InterBase. Пришло время и добавил еще несколько функций, а вот пользоваться ими нет возможности. При обращении к ним вылетает на ошибку
A fatal exception occurred during the execution of a user defined function.
Access violation. The code attempted to access a virtual address without privilege to do so.
Как с этим бороться?
← →
Dr. Web (2001-12-10 14:02) [1]А новые функции зарегистрировал на Сервере?
← →
Dim (2001-12-10 14:11) [2]Yes!
← →
Desdechado (2001-12-10 19:48) [3]судя по тексту ошибки, глюк в функции - обращение к неизвестной памяти. код в студию. вполне может быть и из-за путаницы менеджеров памяти.
← →
Dim (2001-12-11 07:42) [4]Это код на Delphi:
library MyDLL;
uses
SysUtils,
Classes;
type
PInteger = ^Integer;
{$R *.RES}
var ResultInteger: Integer;
function LenString(var str : PChar):PInteger; cdecl;export;
begin
ResultInteger := Length(Trim(str));
Result := @ResultInteger;
end;
function SubStr(var str : PChar; var Index, Count : integer) : PChar; cdecl;export;
begin
str := PChar(Copy(str, Index, Count));
Result := @str;
end;
exports
LenString,
SubStr;
begin
end.
А это описание функций на сервере:
DECLARE EXTERNAL FUNCTION SUBSTRING
VARCHAR(50), INTEGER, INTEGER
RETURNS VARCHAR(50)
ENTRY_POINT "SubStr" MODULE_NAME "MyDLL"
DECLARE EXTERNAL FUNCTION LENGTHSTRING
VARCHAR(70)
RETURNS INTEGER BY VALUE
ENTRY_POINT "LenString" MODULE_NAME "MyDLL"
← →
Dim (2001-12-11 09:58) [5]Ведь не может же быть, чтоб ни кто не знал в чем тут заковыка.
В этой же dll"ке есть еще три функции которые прекрасно работают, а вот эти две ни как. Мне так кажется, что дело в типах переменных, но что и как поправить.
Help me please.
← →
Мадорский Г.В. (2001-12-11 10:33) [6]У меня вот как написано и работает
uses
SysUtils,
Classes,
ib_util in "ib_util.pas";
Function SubStr(Value : PChar; var Start, Count : Cardinal) : PChar; cdecl;export;
var Cnt : Cardinal;
begin
Result := ib_util_malloc(256);
if (Start + Count) > StrLen(Value) then
Cnt := StrLen(Value) - Start
else
Cnt := Count;
StrMove(Result, Value + Start - 1, Count);
Result[Start + Cnt - 2] := #0;
end;
DECLARE EXTERNAL FUNCTION SUBSTR
CSTRING(256), INTEGER, INTEGER
RETURNS CSTRING(256) FREE_IT
ENTRY_POINT "SubStr" MODULE_NAME "Udf.dll";
а по поводу LenString попробуй
function LenString(var str : PChar):PInteger; cdecl;export;
begin
Result := Length(Trim(str));
end;
← →
Desdechado (2001-12-11 10:56) [7]подозрительно
function LenString(var str : PChar): PInteger; cdecl;export;
и
RETURNS INTEGER BY VALUE
← →
Dim (2001-12-11 10:58) [8]>Мадорский Г.В. © (11.12.01 10:33)
У меня почему то на сервере прописывается только так
DECLARE EXTERNAL FUNCTION SUBSTR
CSTRING(256), INTEGER, INTEGER
RETURNS CSTRING(256) -1
ENTRY_POINT "SubStr" MODULE_NAME "MyDLL";
И ошибка таже:(((
← →
Dim (2001-12-11 11:26) [9]>Мадорский Г.В.
Спасибо за подсказку. Если я правильно понял то ошибка была в отсутсвии строки Result := AllocMem(256); Во всяком случае после этого заработало. Хотелось бы узнать Ваше мнение.
Удачи и процветания. Дмитрий
← →
Desdechado (2001-12-11 14:01) [10]проверять корректность UDF лучше на НТ. всякие 95/98/Ме зевают, когда память теряется, а потом виснут. сам с таким сталкивался, поэтому почитай на ib.demo.ru хорошие советы по написанию UDF, особенно по динамическому выделению памяти и конфликту менеджеров памяти MicroSoft(на котором написан IB) и Borland.
← →
Dim (2001-12-11 14:11) [11]Вообщето код предоставленный Мадорским Г.В. не совсем корректно работает.
Почему то обрезает последние несколько символов, причем параметр Count ему по барабану, всегда отсекает несколько последних символов хоть Count=1 хоть Count=40. И как освобождать память в таком случае я к сожалению не знаю? .А вот с функцией LenString вообще ничего не выходит, вылетает все таже ошибка
A fatal exception occurred during the execution of a user defined function.
Access violation. The code attempted to access a virtual address without privilege to do so.
← →
Desdechado (2001-12-11 15:11) [12]есть же готовые, не надо изобретать
DECLARE EXTERNAL FUNCTION strlen
CSTRING(32767)
RETURNS INTEGER BY VALUE
ENTRY_POINT "IB_UDF_strlen" MODULE_NAME "ib_udf";
DECLARE EXTERNAL FUNCTION substr
CSTRING(4096)
RETURNS CSTRING(4096) FREE_IT
ENTRY_POINT "IB_UDF_substr" MODULE_NAME "ib_udf";
← →
Dim (2001-12-13 07:25) [13]Доброго утра всем.
>Desdechado
Прошу прощения за назойливость, но как работает SUBSTR, я что-то не пойму. И еще, можно ли где нибудь поиметь исходники. Если у Вас есть, то пожалуйста сбросте на e-mail:dim-spider@yandex.ru, или ссылочку.
Удачи и процветания.Дмитрий
← →
Desdechado (2001-12-13 16:33) [14]я что-то действительно намудрил с SubStr. вот:
DECLARE EXTERNAL FUNCTION SubStr
CSTRING(4096), INTEGER, INTEGER
RETURNS CSTRING(4096) FREE_IT
ENTRY_POINT "IB_UDF_substr" MODULE_NAME "ib_udf";
ib_udf.dll - стандартная DLL, поставляющаяся с IB. Должна лежать в подкаталоге UDF у IB-сервера. там еще куча полезных других функций.
на ib.demo.ru есть примеры и даже готовые библиотеки.
Страницы: 1 вся ветка
Форум: "Базы";
Текущий архив: 2002.01.14;
Скачать: [xml.tar.bz2];
Память: 0.48 MB
Время: 0.005 c