|
Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Программирование и базы данных » Delphi - [решено] Динамическое подключение DLL |
|
|
Delphi - [решено] Динамическое подключение DLL
|
Новый участник Сообщения: 35 |
Доброго времени суток!
Не могу разобраться, как проиходит возврат результата из процедуры в динамической бибилиотеке. У меня в программе вызов библиотеки происходит успешно, вызов процедуры происходит успешно, занчение в процедуру передается, а вот получить данные из нее не выходит (возникает 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 |
Новый участник Сообщения: 35
|
Профиль | Отправить PM | Цитировать Я так понимаю проблема именно с возвратом строки, потому что числовые переменные возвращаются успешно, символьный тип char тоже. ????????????????????????
|
Отправлено: 08:25, 21-03-2013 | #2 |
Для отключения данного рекламного блока вам необходимо зарегистрироваться или войти с учетной записью социальной сети. Если же вы забыли свой пароль на форуме, то воспользуйтесь данной ссылкой для восстановления пароля. |
Новый участник Сообщения: 35
|
Профиль | Отправить PM | Цитировать Вообщем буду использовать тип ShortString, здесь строка имеет фиксированный размер до 255 символов и без проблем возвращается из dll. В моем понимании проблема при работе с памятью, string передается фиксированно (размер который имеет строка до вызова dll) и по идее мы не можем изменить его в dll.
Не совсем я разобрался с указателями... Если кто может, разжуйте пожалуйста, как можно передать именно string. |
Отправлено: 09:40, 21-03-2013 | #3 |
Новый участник Сообщения: 40
|
Профиль | Отправить PM | Цитировать Использовать Дельфовые типы при движении данных между ДЛЛ - крайне неправильный подход. Начиная с несовместимости с другими языками и кончая бяками типа той, что получили.
Надо использовать безопасные типы данных. Если требуется увеличивать что-то то память под увеличение надо выделять в вызывающей программе. Учитывайте, что хоть ДЛЛ и использует ту же область данных, что и вызывающая программа, менеджер памяти у нее другой. Это же в полной мере относится и к передаче любых объектов: даже объекты казалось бы одного типа в ДЛЛ и вызывающей программе имеют по факту РАЗНЫЙ тип. И словить АВ можно в любой момент. Причем ошибка будет плавающей. Числовые переменные возвращаются правильно так как они имеют строго заданный размер и под них не происходит дополнительное выделение памяти. Для строк при передаче используйте pChar, pWideChar и т.п. При этом, память надо выделять заранее. Посмотрите правила вызова системных функций, которые в аргументах возвращают данные переменной длины. |
Отправлено: 09:53, 21-03-2013 | #4 |
Новый участник Сообщения: 35
|
Профиль | Отправить PM | Цитировать AlexVol,
За заметку про несовместимость типов с другими языками спасибо. Не подумал, вернее забыл, shortstring это ж delphi, ну хотя в Си билдере есть smallstring, а вот в Си# хз. |
|
Отправлено: 10:29, 21-03-2013 | #5 |
Новый участник Сообщения: 40
|
Профиль | Отправить PM | Цитировать Советую почитать блог GunSmoker'а. Много интересного найдете. http://www.gunsmoker.ru
Почитайте про систему плагинов - там много подводных камней освещено. |
Отправлено: 10:01, 22-03-2013 | #6 |
Новый участник Сообщения: 35
|
Профиль | Отправить PM | Цитировать AlexVol,
Спасибо, буду разбираться. Ещё бы хотелось найти какое-нибудь нормальное описание работы менеджера памяти в delphi. |
Отправлено: 17:03, 23-03-2013 | #7 |
Новый участник Сообщения: 40
|
Профиль | Отправить PM | Цитировать Да там же есть
![]() Например: http://www.gunsmoker.ru/2009/01/blog-post.html И еще можно пользоваться поиском... |
Отправлено: 11:38, 25-03-2013 | #8 |
Ветеран Сообщения: 1835
|
Профиль | Отправить PM | Цитировать Немного не в тему, но... Ни у кого нет опыта использования в качестве безопасного инкапсулирования переносимых данных средств OLE? Там, массивы ихние, и прочее. Я, конечно понимаю, что по этому поводу еще Агутин пел нечто вроде:
OLE, OLE - это просто слезы! OLE, OLE - ничего нельзя понять! Тем более при ущербной документации от производителя. Но, может, кто-то постиг практически? |
Отправлено: 13:07, 25-03-2013 | #9 |
Новый участник Сообщения: 40
|
Профиль | Отправить PM | Цитировать Цитата XPEHOMETP:
![]() Так что универсальное средство вряд ли существует. И кроме описания производителя есть только один грандиозный метод: научного тыка. |
|
Отправлено: 09:33, 26-03-2013 | #10 |
|
![]() |
Участник сейчас на форуме |
![]() |
Участник вне форума |
![]() |
Автор темы |
![]() |
Сообщение прикреплено |
| |||||
Название темы | Автор | Информация о форуме | Ответов | Последнее сообщение | |
подключение модуля 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 |
|