|
|
Регистрация Восстановить пароль |
Повторная активизация e-mail |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
|
Опции темы | Поиск в этой теме |
02.04.2010, 04:47 | #1 |
Пользователь
Регистрация: 02.04.2010
Сообщений: 11
|
Передача строк из dll
Народ, как правильно передавать строки из длл в основную программу?
Изрыл весь интернет, так и не пойму до конца. Вот что сам наваял после безумно долгих мучений: Код:
Код:
Возьмем например API функцию GetWindowText, одним из параметров в ней является переменная типа PChar (т.е. ссылка на Char'ы). Тогда каким образом функция вызванная из dll и получив этот указатель, сможет выделить место для этой переменной в области памяти основной программы так, чтобы после выгрузки dll переменная и ее значение еще были живы и вообще, как dll может управлять чужой областью памяти в этом случае? Как вообще работает эта API и подобные ей, в них даже не @PChar передается как у меня, а вообще просто PChar (тела подобных функций не нашел)? Если можно, пожалуйста, приведите простейший код передачи строк из dll в основную прогу и обратно. Последний раз редактировалось sprofxx; 02.04.2010 в 04:49. |
02.04.2010, 04:54 | #2 | |
Старожил
Регистрация: 28.01.2009
Сообщений: 21,000
|
Цитата:
Код:
Код:
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел. Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите. |
|
02.04.2010, 05:28 | #3 |
Пользователь
Регистрация: 02.04.2010
Сообщений: 11
|
Код:
Вопрос по GetWindowText остается открытым, интересно как именно функция заполняет переданный ей буфер. |
02.04.2010, 05:35 | #4 | ||||
Старожил
Регистрация: 28.01.2009
Сообщений: 21,000
|
Цитата:
в таком случае выделяем память в процедуре и возвращаем на нее указатель(предварительно заполнив) но тогда в основной программе нужно освобождать её. Цитата:
но такой подход, не очень хорош, но я обьяснил выше Цитата:
мы возвращаем PChar а не array of Char(и то статический)...ибо массив статический уже будет распределен динамически при входе в функцию.(в стеке, как локальная паременная) Цитата:
вы передаете вторым параметром указатель на область памяти(размер передается третим параметром) и она по этому указателю пишет нужные данные, не превышая размера этой области. но она не выделяем памяти. или что вам не понятно? Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел. Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите. Последний раз редактировалось Пепел Феникса; 02.04.2010 в 05:39. |
||||
02.04.2010, 06:22 | #5 |
Участник клуба
Регистрация: 09.11.2007
Сообщений: 1,761
|
А не легче тогда в DLL использовать не процедуру, а функцию, которая и возвратит в основную прогу строку?!
|
02.04.2010, 06:45 | #6 |
Пользователь
Регистрация: 02.04.2010
Сообщений: 11
|
Хм... тогда если мы хотим независимости от dll, то реализовывается моим способом из первого поста (вы не ответили о правильности)?...
Вообще хотелось бы увидеть простейший пример, подобие использования GetWindowText. код основной программы: Код:
Код:
|
02.04.2010, 06:56 | #7 | |
Пользователь
Регистрация: 02.04.2010
Сообщений: 11
|
Цитата:
При этом всем как используется GetWindowText... часто разработчики даже не выделяют память для переменной PChar, а просто объявляют ее, в моих экспериментах это вызывало исключения, поэтому я подумал что может сама функция как то умеет это делать. И еще не ясно как заполнять указатель переданный в функцию, каким оператором? str^:='бла бла' ведь не то.... Последний раз редактировалось sprofxx; 02.04.2010 в 07:09. |
|
02.04.2010, 07:00 | #8 |
Форумчанин
Регистрация: 17.09.2009
Сообщений: 294
|
Попробуй вот так:
Код:
принимаю благодарности в письменном виде( весы слева)...
|
02.04.2010, 07:08 | #9 | |||
Старожил
Регистрация: 28.01.2009
Сообщений: 21,000
|
Цитата:
но вообще это на самом деле тоже самое что я написал, только через Ж... Цитата:
вот вам пример функции подобной GetWindowText Модуль программы Код:
Код:
код проги. Код:
Код:
Цитата:
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел. Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите. Последний раз редактировалось Пепел Феникса; 02.04.2010 в 07:24. Причина: дополнил и исправил ширину |
|||
02.04.2010, 07:41 | #10 |
Пользователь
Регистрация: 02.04.2010
Сообщений: 11
|
благодарю, теперь все понятно!!!
|
Похожие темы | ||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
Передача указателя из Си++ в dll на delphi | VladimirFF | Общие вопросы C/C++ | 0 | 22.02.2010 19:56 |
Передача StringGrid в DLL | Adamrus | Общие вопросы Delphi | 7 | 30.11.2009 21:46 |
передача фрейма из dll | BESS | Компоненты Delphi | 1 | 20.04.2009 18:54 |
Передача массива строк в функцию. | Crasty | Общие вопросы C/C++ | 2 | 14.04.2009 13:29 |
Передача сообщения из программы в свою Dll | SergeySK | Общие вопросы Delphi | 3 | 01.11.2007 14:42 |