powered by simpleCommunicator - 2.0.60     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Sybase ASA, ASE, IQ [игнор отключен] [закрыт для гостей] / Calling external libraries from procedures Sybase Delphi
11 сообщений из 11, страница 1 из 1
Calling external libraries from procedures Sybase Delphi
    #34217046
dka
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
dka
Гость
есть DLL на Delphi:

library Project1;

{$R *.res}

function Delete_File(filename:ShortString):ShortString; cdecl; export;
begin
result:=filename;
end;
exports Delete_File name 'Delete_File';

begin
end.

Функция на Sybase 9:
create function DBA.dll_func(in @filename char(256))
returns char(256) external name 'Delete_File@D:\\Work\\DLL_Project\\Project1.dll'

Вызываю из InterActive:
CREATE PROCEDURE "DBA"."ttt"()
BEGIN
declare @res char(255);
@res=call dll_func( 'C:\1.txt' );
select @res
END

Сервак виснет. Если входные или выходные параметры внешней функции Integer, то работает.
Вопрос: что Я тут неправильно написал?
...
Рейтинг: 0 / 0
Calling external libraries from procedures Sybase Delphi
    #34217101
Фотография Александр Гoлдун
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
dka
function Delete_File(filename:ShortString):ShortString; cdecl; export;
begin
result:=filename;
end;
exports Delete_File name 'Delete_File';
.....
Сервак виснет. Если входные или выходные параметры внешней функции Integer, то работает.
Вопрос: что Я тут неправильно написал?
Все неправильно (включая название сервера :). Читай доки внимательнее и смотри примеры из папки %ASANY9%\Samples\Asa\ExternalProcedures. Там не все так просто.
...
Рейтинг: 0 / 0
Calling external libraries from procedures Sybase Delphi
    #34217129
Dim2000
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
dka wrote:

> function Delete_File(filename:ShortString):ShortString; cdecl; export;

Оставь в покое животное ! По крайней мере, до тех пор, пока не
поймёшь, почему здесь не место ShortString и cdecl.
Posted via ActualForum NNTP Server 1.3
...
Рейтинг: 0 / 0
Calling external libraries from procedures Sybase Delphi
    #34217149
dka
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
dka
Гость
поменял
function Delete_File(filename:ShortString):ShortString; cdecl; export;
на
function Delete_File(filename:String):PChar; stdcall; export;
всё равно не работает
...
Рейтинг: 0 / 0
Calling external libraries from procedures Sybase Delphi
    #34217253
White Owl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ну а параметр функции то почему String?

---
http://www.rusug.ru] Портал русскоязычной группы пользователей Sybase
...
Рейтинг: 0 / 0
Calling external libraries from procedures Sybase Delphi
    #34217282
Фотография Dmitry.
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
вот такая ф-я работает:
Код: plaintext
1.
create function DBA.exf_deletefile(in @filename char( 256 ))
returns integer external name 'DeleteFileA@kernel32.dll'
...
Рейтинг: 0 / 0
Calling external libraries from procedures Sybase Delphi
    #34217959
dka
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
dka
Гость
White OwlНу а параметр функции то почему String?

---
http://www.rusug.ru] Портал русскоязычной группы пользователей Sybase

Заменил String на PChar- всё равно сервак падает.
...
Рейтинг: 0 / 0
Calling external libraries from procedures Sybase Delphi
    #34218000
dka
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
dka
Гость
Dmitry.вот такая ф-я работает:
Код: plaintext
1.
create function DBA.exf_deletefile(in @filename char( 256 ))
returns integer external name 'DeleteFileA@kernel32.dll'


Заменил PChar на Integer - работает.
Но дело в том, что мне нужно уничтожать файл в функции, в DLL передаётся имя файла.
Файл не удаляется, тогда Я решил проверить а корректно ли передаётся имя файла?
Поэтому решил просто обратно возвратить имя файла из DLL, на возвращаемый PChar параметр Sybase падает.
Как тут быть не знаю.
Пробовал входной и возвращаемый параметр делать char, работает, но возвращает совсем не тот символ, что передавал.
Какая то проблема с кодировкой.
Может нужно как то по особенному писать DLL на Delphi?
...
Рейтинг: 0 / 0
Calling external libraries from procedures Sybase Delphi
    #34218091
Фотография ASCRUS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
dkaНо дело в том, что мне нужно уничтожать файл в функции, в DLL передаётся имя файла.
Нужно через старндартную функцию вызвать командный процессор и передать ему команду DEL <FileName>, а не городить огород из своих функций, давая повод серваку упасть и грохнуть базу. За мои 10 лет работы с различными РСУБД ни разу не потребовалось писать внешнюю процедуру, все решалось штатными средствами сервера. Советую Вам забыть про такие вещи, особенно это пригодится, когда вдруг одну из Ваших БД нужно будет запустить на другой операционной системе, к примеру Linux.
...
Рейтинг: 0 / 0
Calling external libraries from procedures Sybase Delphi
    #34218674
Фотография Dmitry.
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ASCRUS +1

но в продолжении темы

лучше не делать из ф-ции "return CHAR*"
Кто будет освобождать эту память??? (тут придется читать доку.)

можно сделать OUT параметр вместо этого.
НО надо его инициализировать перед передачей в функцию.

по поводу типов и ф-ции:

паскаля не знаю но в С это выглядит так:
extern "C" int __stdcall Delete_File(CHAR*file);

CHAR* это указатель на строку заканьчивающуюся нулевым символом.
--
а вообще прислушайтесь к совету ASCRUS
...
Рейтинг: 0 / 0
Calling external libraries from procedures Sybase Delphi
    #34218807
dka
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
dka
Гость
Всем спасибо за советы. Для меня всё стало гораздо яснее. :)
...
Рейтинг: 0 / 0
11 сообщений из 11, страница 1 из 1
Форумы / Sybase ASA, ASE, IQ [игнор отключен] [закрыт для гостей] / Calling external libraries from procedures Sybase Delphi
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]