Форум: "Базы";
Поиск по всему сайту: delphimaster.net;
Текущий архив: 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 есть примеры и даже готовые библиотеки.




Форум: "Базы";
Поиск по всему сайту: delphimaster.net;
Текущий архив: 2002.01.14;
Скачать: [xml.tar.bz2];




Наверх





Память: 0.74 MB
Время: 0.024 c
1-42428           TAV48                 2001-12-20 17:51  2002.01.14  
Как сделать чтобы фон кнопки был прозрачным?


1-42398           Fast                  2001-12-24 09:59  2002.01.14  
Консольные программы


4-42638           Jazzy$                2001-11-10 23:17  2002.01.14  
Фокус ввода.


4-42591           MIFI                  2001-11-09 17:31  2002.01.14  
Народ помогите разобраться


1-42463           Тарас                 2001-12-25 11:26  2002.01.14  
Как справиться с проблемкой