Delphi - [решено] Динамическое подключение DLL

Аватара пользователя
navuhodonosor

Delphi - [решено] Динамическое подключение DLL

Сообщение navuhodonosor »

Доброго времени суток!



Не могу разобраться, как проиходит возврат результата из процедуры в динамической бибилиотеке.

У меня в программе вызов библиотеки происходит успешно, вызов процедуры происходит успешно, занчение в процедуру передается, а вот получить данные из нее не выходит (возникает 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 @revernil then
   begin
     writeln('Function procedure is load');
     rever(str);
   end;
  freelibrary(libhandle);
  writeln(str);
  readln;
end.
Аватара пользователя
Delirium

Re: Delphi - [решено] Динамическое подключение DLL

Сообщение Delirium »

XPEHOMETP, это не немного, это совсем не в тему Изображение
Аватара пользователя
navuhodonosor

Re: Delphi - [решено] Динамическое подключение DLL

Сообщение navuhodonosor »

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

Не совсем я разобрался с указателями...

Если кто может, разжуйте пожалуйста, как можно передать именно string.
Аватара пользователя
navuhodonosor

Re: Delphi - [решено] Динамическое подключение DLL

Сообщение navuhodonosor »

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

Re: Delphi - [решено] Динамическое подключение DLL

Сообщение AlexVol »

Использовать Дельфовые типы при движении данных между ДЛЛ - крайне неправильный подход. Начиная с несовместимости с другими языками и кончая бяками типа той, что получили.

Надо использовать безопасные типы данных. Если требуется увеличивать что-то то память под увеличение надо выделять в вызывающей программе. Учитывайте, что хоть ДЛЛ и использует ту же область данных, что и вызывающая программа, менеджер памяти у нее другой.

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

Числовые переменные возвращаются правильно так как они имеют строго заданный размер и под них не происходит дополнительное выделение памяти.

Для строк при передаче используйте pChar, pWideChar и т.п. При этом, память надо выделять заранее. Посмотрите правила вызова системных функций, которые в аргументах возвращают данные переменной длины.
Аватара пользователя
navuhodonosor

Re: Delphi - [решено] Динамическое подключение DLL

Сообщение navuhodonosor »

AlexVol,

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

Re: Delphi - [решено] Динамическое подключение DLL

Сообщение AlexVol »

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


Почитайте про систему плагинов - там много подводных камней освещено.
Аватара пользователя
navuhodonosor

Re: Delphi - [решено] Динамическое подключение DLL

Сообщение navuhodonosor »

Да там же есть Изображение

Например:
http://www.gunsmoker.ru/2009/01/blog-post.html


И еще можно пользоваться поиском...
Аватара пользователя
AlexVol

Re: Delphi - [решено] Динамическое подключение DLL

Сообщение AlexVol »

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



OLE, OLE - это просто слезы!

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



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

Re: Delphi - [решено] Динамическое подключение DLL

Сообщение XPEHOMETP »

Цитата XPEHOMETP:



Тем более при ущербной документации от производителя
Delphi - [решено] Динамическое подключение DLL




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

Так что универсальное средство вряд ли существует. И кроме описания производителя есть только один грандиозный метод: научного тыка.
Ответить

Вернуться в «Программирование и базы данных»