|
|
Регистрация Восстановить пароль |
Повторная активизация e-mail |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
|
|
Опции темы | Поиск в этой теме |
04.03.2010, 18:54 | #1 |
Форумчанин
Регистрация: 05.04.2008
Сообщений: 244
|
Проблема с вызовом динамической DLL
Добрый вечер!
Delphi 2007. Использую довольно распространенный пример создания динамической DLL: код dll: Код:
Код:
мастера, ну может кто-нибудь может подсказать почему при закрытии окна сообщения компилятор выдает ошибку? что не так прописано в вызове или закрытии или объявлении DLL? Всем спасибо! Может, не будем "апить", а следовать правилам и пользоваться кнопкой "Правка" ? Последний раз редактировалось mihali4; 05.03.2010 в 00:32. |
04.03.2010, 21:54 | #2 | |
Форумчанин
Регистрация: 24.07.2008
Сообщений: 279
|
Код:
Если ты внимательно читал комментарий, который был вставлен сразу после строчки library project1, заботливыми разработчиками дельфи, то знал бы что так делать нельзя. Цитата:
Если не хочешь всюду таскать за собой BORLNDMM.DLL (расплата за ShareMem) рекомендую переделать функцию к такому виду: Код:
Сказал и загрустил от бесспорности своей правоты.
|
|
04.03.2010, 22:14 | #3 |
Форумчанин
Регистрация: 05.04.2008
Сообщений: 244
|
Спасибо, только это не мой пример, а выложен он в интернете.
А как будет полностью выглядеть функция если ее переделать как Вы предлагаете? Код:
|
04.03.2010, 23:03 | #4 |
Форумчанин
Регистрация: 24.07.2008
Сообщений: 279
|
ну, вот функция в dll
Код:
Код:
Сказал и загрустил от бесспорности своей правоты.
|
06.03.2010, 01:48 | #5 |
Похмел
Пользователь
Регистрация: 10.01.2010
Сообщений: 16
|
В данном случае ошибка всеголишь в том, что не указана директива обратного вызова у прототипа функции GetSimpleText.
SkAndrew, вот здесь Код:
0nni, пиши есче, сила с тобой. Последний раз редактировалось NervniiJ; 06.03.2010 в 01:53. |
06.03.2010, 08:43 | #6 |
Форумчанин
Регистрация: 24.07.2008
Сообщений: 279
|
На*соглашение о вызове не обратил внимание, это тоже ошибка. Однако возвращать таким образом строки можно только*при*соглашении cdecl но ни как не при pascal и stdcall;
Сказал и загрустил от бесспорности своей правоты.
|
10.03.2010, 08:13 | #7 | |
Похмел
Пользователь
Регистрация: 10.01.2010
Сообщений: 16
|
Цитата:
|
|
10.03.2010, 08:45 | #8 | ||
Старожил
Регистрация: 28.01.2009
Сообщений: 21,000
|
Цитата:
Цитата:
это указатель на строку символов являющейся константой. и в стеке она не хранится. ошибка вылетала изза того что при смещении указателя стека при возврате из процедуры, было произведенно смещение, а Делфи этого не ожидала от ДЛЛ(по fastcall на один параметр стек не используется) и потому нарушался стек, вот вам и вылет. а про локальную переменную вот пример Код:
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел. Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите. Последний раз редактировалось Пепел Феникса; 10.03.2010 в 08:49. |
||
10.03.2010, 09:29 | #9 |
Участник клуба
Регистрация: 19.01.2009
Сообщений: 1,453
|
Да уж легче загрузить статически и не париться )
|
11.03.2010, 17:07 | #10 |
Форумчанин
Регистрация: 24.07.2008
Сообщений: 279
|
Строка, на которую указывает PChar хранится не в стеке, это верно, а в куче, только кучи это разные. Почему же GetWindowText имеет вид не
*char GetWindowText (HWND handle) или программисты MS решили сделать жизнь программистам веселее? Как вариант, можно вернуть указатель на массив символов, выделенный через LocalAlloc(), и освободить через LocalFree() уже после вызова.
Сказал и загрустил от бесспорности своей правоты.
|
|
Похожие темы | ||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
Проблема с вызовом функции B DLL | doniyor | Мультимедиа в Delphi | 2 | 05.11.2009 16:14 |
Проблема выделения динамической памяти в С++ | oxygen90 | Помощь студентам | 3 | 14.09.2009 21:47 |
Проблема с динамической работой с изображением на экране | andreyasu | Win Api | 3 | 15.06.2009 21:44 |
Проблема с вызовом exec() из php на linux | Fatum123 | PHP | 6 | 13.04.2009 22:36 |
проблемы с вызовом окна логина. | terion | БД в Delphi | 3 | 15.11.2006 00:53 |