Главная страница
    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-42380
bk
2001-12-10 14:25
2002.01.14
Ms Outlook


4-42607
YUS
2001-11-11 20:59
2002.01.14
HOOK


1-42499
tovSuhov
2001-12-24 08:37
2002.01.14
Выравнивание текста в ячейках StringGrid`a...


4-42602
Shmel
2001-11-06 01:07
2002.01.14
Как получить текст из ячеек TstringGrid в чужом окне? Handle я знаю.


6-42532
yuger
2001-10-19 17:56
2002.01.14
Доступ к компьютеру из сети





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский