Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Программирование и базы данных (http://forum.oszone.net/forumdisplay.php?f=21)
-   -   [решено] Динамическое подключение DLL (http://forum.oszone.net/showthread.php?t=256716)

navuhodonosor 20-03-2013 13:06 2114910

Динамическое подключение DLL
 
Доброго времени суток!

Не могу разобраться, как проиходит возврат результата из процедуры в динамической бибилиотеке.
У меня в программе вызов библиотеки происходит успешно, вызов процедуры происходит успешно, занчение в процедуру передается, а вот получить данные из нее не выходит (возникает 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 2115393

Я так понимаю проблема именно с возвратом строки, потому что числовые переменные возвращаются успешно, символьный тип char тоже. ????????????????????????

navuhodonosor 21-03-2013 09:40 2115425

Вообщем буду использовать тип ShortString, здесь строка имеет фиксированный размер до 255 символов и без проблем возвращается из dll. В моем понимании проблема при работе с памятью, string передается фиксированно (размер который имеет строка до вызова dll) и по идее мы не можем изменить его в dll.
Не совсем я разобрался с указателями...
Если кто может, разжуйте пожалуйста, как можно передать именно string.

AlexVol 21-03-2013 09:53 2115434

Использовать Дельфовые типы при движении данных между ДЛЛ - крайне неправильный подход. Начиная с несовместимости с другими языками и кончая бяками типа той, что получили.
Надо использовать безопасные типы данных. Если требуется увеличивать что-то то память под увеличение надо выделять в вызывающей программе. Учитывайте, что хоть ДЛЛ и использует ту же область данных, что и вызывающая программа, менеджер памяти у нее другой.
Это же в полной мере относится и к передаче любых объектов: даже объекты казалось бы одного типа в ДЛЛ и вызывающей программе имеют по факту РАЗНЫЙ тип. И словить АВ можно в любой момент. Причем ошибка будет плавающей.
Числовые переменные возвращаются правильно так как они имеют строго заданный размер и под них не происходит дополнительное выделение памяти.
Для строк при передаче используйте pChar, pWideChar и т.п. При этом, память надо выделять заранее. Посмотрите правила вызова системных функций, которые в аргументах возвращают данные переменной длины.

navuhodonosor 21-03-2013 10:29 2115453

AlexVol,
За заметку про несовместимость типов с другими языками спасибо. Не подумал, вернее забыл, shortstring это ж delphi, ну хотя в Си билдере есть smallstring, а вот в Си# хз.

AlexVol 22-03-2013 10:01 2116125

Советую почитать блог GunSmoker'а. Много интересного найдете. http://www.gunsmoker.ru
Почитайте про систему плагинов - там много подводных камней освещено.

navuhodonosor 23-03-2013 17:03 2116963

AlexVol,

Спасибо, буду разбираться. Ещё бы хотелось найти какое-нибудь нормальное описание работы менеджера памяти в delphi.

AlexVol 25-03-2013 11:38 2117991

Да там же есть :)
Например: http://www.gunsmoker.ru/2009/01/blog-post.html
И еще можно пользоваться поиском...

XPEHOMETP 25-03-2013 13:07 2118047

Немного не в тему, но... Ни у кого нет опыта использования в качестве безопасного инкапсулирования переносимых данных средств OLE? Там, массивы ихние, и прочее. Я, конечно понимаю, что по этому поводу еще Агутин пел нечто вроде:

OLE, OLE - это просто слезы!
OLE, OLE - ничего нельзя понять!

Тем более при ущербной документации от производителя. Но, может, кто-то постиг практически?

AlexVol 26-03-2013 09:33 2118709

Цитата:

Цитата XPEHOMETP
Тем более при ущербной документации от производителя »

Ну, дядя Билл дает только правила (см. MSDN), а реализует OLE-сервер каждый сам в меру своей испорченности :)
Так что универсальное средство вряд ли существует. И кроме описания производителя есть только один грандиозный метод: научного тыка.

Delirium 26-03-2013 10:34 2118735

XPEHOMETP, это не немного, это совсем не в тему :)

navuhodonosor 29-03-2013 17:02 2121605

AlexVol,
Спасибо ещё раз, вот ресурс, который ты мне посоветовал прям в тему, особенно про плагины...

P.S. Вообщем сейчас dll с freemem пишу, значит плагины тоже с делфи писать будут :)


Время: 18:42.

Время: 18:42.
© OSzone.net 2001-