Имя пользователя:
Пароль:  
Помощь | Регистрация | Забыли пароль?  | Правила  

Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Программирование и базы данных » Delphi - [решено] Динамическое подключение DLL

Ответить
Настройки темы
Delphi - [решено] Динамическое подключение DLL

Аватара для navuhodonosor

Новый участник


Сообщения: 35
Благодарности: 5


Конфигурация

Профиль | Отправить PM | Цитировать


Изменения
Автор: navuhodonosor
Дата: 20-03-2013
Описание: tag code - #
Доброго времени суток!

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

Отправлено: 13:06, 20-03-2013

 

Аватара для navuhodonosor

Новый участник


Сообщения: 35
Благодарности: 5

Профиль | Отправить PM | Цитировать


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

Отправлено: 08:25, 21-03-2013 | #2



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

Если же вы забыли свой пароль на форуме, то воспользуйтесь данной ссылкой для восстановления пароля.


Аватара для navuhodonosor

Новый участник


Сообщения: 35
Благодарности: 5

Профиль | Отправить PM | Цитировать


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

Отправлено: 09:40, 21-03-2013 | #3


Новый участник


Сообщения: 40
Благодарности: 19

Профиль | Отправить PM | Цитировать


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

Отправлено: 09:53, 21-03-2013 | #4


Аватара для navuhodonosor

Новый участник


Сообщения: 35
Благодарности: 5

Профиль | Отправить PM | Цитировать


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

Отправлено: 10:29, 21-03-2013 | #5


Новый участник


Сообщения: 40
Благодарности: 19

Профиль | Отправить PM | Цитировать


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

Отправлено: 10:01, 22-03-2013 | #6


Аватара для navuhodonosor

Новый участник


Сообщения: 35
Благодарности: 5

Профиль | Отправить PM | Цитировать


AlexVol,

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

Отправлено: 17:03, 23-03-2013 | #7


Новый участник


Сообщения: 40
Благодарности: 19

Профиль | Отправить PM | Цитировать


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

Отправлено: 11:38, 25-03-2013 | #8


Ветеран


Сообщения: 1835
Благодарности: 146

Профиль | Отправить PM | Цитировать


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

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

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

Отправлено: 13:07, 25-03-2013 | #9


Новый участник


Сообщения: 40
Благодарности: 19

Профиль | Отправить PM | Цитировать


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

Отправлено: 09:33, 26-03-2013 | #10



Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Программирование и базы данных » Delphi - [решено] Динамическое подключение DLL

Участник сейчас на форуме Участник сейчас на форуме Участник вне форума Участник вне форума Автор темы Автор темы Шапка темы Сообщение прикреплено

Похожие темы
Название темы Автор Информация о форуме Ответов Последнее сообщение
подключение модуля php_iconv.dll Attila Вебмастеру 1 05-01-2011 21:27
Помогите сбить перехватчиков c user32.dll, advapi32.dll, netapi.dll Pr0ga Лечение систем от вредоносных программ 3 26-06-2010 18:06
FreeBSD - [решено] Динамическое подключение IPFW & NAT Аlchemist Общий по FreeBSD 6 11-08-2008 12:16
Разное - [решено] dwmapi.dll; mpr.dll; shlwapi.dll Reset5 Microsoft Windows 2000/XP 2 14-06-2008 16:31
Динамическое изменение страницы... Kenwood Вебмастеру 5 29-03-2004 14:26




 
Переход