Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2002.01.14;
Скачать: CL | DM;

Вниз

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;
Скачать: CL | DM;

Наверх




Память: 0.5 MB
Время: 0.015 c
1-42497
Victor
2001-12-25 19:40
2002.01.14
ColorDialog


7-42583
ASTARD
2001-09-28 14:56
2002.01.14
Интересно!


6-42523
Smart
2001-10-10 11:27
2002.01.14
Remote Logoff needed. EXTREMELY URGENT


3-42349
Dush
2001-12-11 11:11
2002.01.14
Delphi+InterBase=Книга


14-42546
T2
2001-11-17 02:43
2002.01.14
Delphi, версия номер 13