Показать полную графическую версию : [решено] Динамическое подключение DLL
navuhodonosor
20-03-2013, 13:06
Доброго времени суток!
Не могу разобраться, как проиходит возврат результата из процедуры в динамической бибилиотеке.
У меня в программе вызов библиотеки происходит успешно, вызов процедуры происходит успешно, занчение в процедуру передается, а вот получить данные из нее не выходит (возникает access violation at...).
Вот код библиотеки:
library mydll;
uses
System.SysUtils,
System.Classes;
{$R *.res}
procedure showing(var s:string); stdcall;
begin
s:=s+'Procedure';
writeln(s);
end;
exports showing index 1 ;
begin
end.
Вот код вызывающей программы:
uses
System.SysUtils, Winapi.Windows, Winapi.Messages;
type
trever=procedure (var s:string); stdcall;
var
rever:trever;
libhandle:THandle;
str,str2:string;
begin
str:='Stroka ';
@rever:=nil;
Libhandle:=LoadLibrary('mydll.dll');
if libhandle>=32 then
begin
writeln('Library is load');
@rever:=Getprocaddress(libhandle,pchar(longint(1)));
end;
if @rever<>nil then
begin
writeln('Function procedure is load');
rever(str);
end;
freelibrary(libhandle);
writeln(str);
readln;
end.
navuhodonosor
21-03-2013, 08:25
Я так понимаю проблема именно с возвратом строки, потому что числовые переменные возвращаются успешно, символьный тип char тоже. ????????????????????????
navuhodonosor
21-03-2013, 09:40
Вообщем буду использовать тип ShortString, здесь строка имеет фиксированный размер до 255 символов и без проблем возвращается из dll. В моем понимании проблема при работе с памятью, string передается фиксированно (размер который имеет строка до вызова dll) и по идее мы не можем изменить его в dll.
Не совсем я разобрался с указателями...
Если кто может, разжуйте пожалуйста, как можно передать именно string.
Использовать Дельфовые типы при движении данных между ДЛЛ - крайне неправильный подход. Начиная с несовместимости с другими языками и кончая бяками типа той, что получили.
Надо использовать безопасные типы данных. Если требуется увеличивать что-то то память под увеличение надо выделять в вызывающей программе. Учитывайте, что хоть ДЛЛ и использует ту же область данных, что и вызывающая программа, менеджер памяти у нее другой.
Это же в полной мере относится и к передаче любых объектов: даже объекты казалось бы одного типа в ДЛЛ и вызывающей программе имеют по факту РАЗНЫЙ тип. И словить АВ можно в любой момент. Причем ошибка будет плавающей.
Числовые переменные возвращаются правильно так как они имеют строго заданный размер и под них не происходит дополнительное выделение памяти.
Для строк при передаче используйте pChar, pWideChar и т.п. При этом, память надо выделять заранее. Посмотрите правила вызова системных функций, которые в аргументах возвращают данные переменной длины.
navuhodonosor
21-03-2013, 10:29
AlexVol,
За заметку про несовместимость типов с другими языками спасибо. Не подумал, вернее забыл, shortstring это ж delphi, ну хотя в Си билдере есть smallstring, а вот в Си# хз.
Советую почитать блог GunSmoker'а. Много интересного найдете. http://www.gunsmoker.ru
Почитайте про систему плагинов - там много подводных камней освещено.
navuhodonosor
23-03-2013, 17:03
AlexVol,
Спасибо, буду разбираться. Ещё бы хотелось найти какое-нибудь нормальное описание работы менеджера памяти в delphi.
Да там же есть :)
Например: http://www.gunsmoker.ru/2009/01/blog-post.html
И еще можно пользоваться поиском...
XPEHOMETP
25-03-2013, 13:07
Немного не в тему, но... Ни у кого нет опыта использования в качестве безопасного инкапсулирования переносимых данных средств OLE? Там, массивы ихние, и прочее. Я, конечно понимаю, что по этому поводу еще Агутин пел нечто вроде:
OLE, OLE - это просто слезы!
OLE, OLE - ничего нельзя понять!
Тем более при ущербной документации от производителя. Но, может, кто-то постиг практически?
Тем более при ущербной документации от производителя »
Ну, дядя Билл дает только правила (см. MSDN), а реализует OLE-сервер каждый сам в меру своей испорченности :)
Так что универсальное средство вряд ли существует. И кроме описания производителя есть только один грандиозный метод: научного тыка.
Delirium
26-03-2013, 10:34
XPEHOMETP, это не немного, это совсем не в тему :)
navuhodonosor
29-03-2013, 17:02
AlexVol,
Спасибо ещё раз, вот ресурс, который ты мне посоветовал прям в тему, особенно про плагины...
P.S. Вообщем сейчас dll с freemem пишу, значит плагины тоже с делфи писать будут :)
© OSzone.net 2001-2012
vBulletin v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.
Available in ZeroNet 1osznRoVratMCN3bFoFpR2pSV5c9z6sTC