Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Базы";
Текущий архив: 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.004 c
3-42395
SOFTMASTER
2001-12-09 19:54
2002.01.14
вопрос по запросу


3-42368
andey
2001-12-11 19:49
2002.01.14
Изменение записей таблицы исходя из другой


1-42447
Phisio
2001-12-24 18:53
2002.01.14
Почему ОШИБКА!!!


1-42513
Aleksey_K
2001-12-25 14:19
2002.01.14
Help !!!


1-42479
cpp
2001-12-25 13:11
2002.01.14
Как изменить свойство в EXE





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский