![]() |
|
|
Регистрация Восстановить пароль |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
![]() |
|
Опции темы | Поиск в этой теме |
![]() |
#1 |
Пользователь
Регистрация: 02.04.2010
Сообщений: 11
|
![]()
Народ, как правильно передавать строки из длл в основную программу?
Изрыл весь интернет, так и не пойму до конца. Вот что сам наваял после безумно долгих мучений: Код:
Код:
Возьмем например API функцию GetWindowText, одним из параметров в ней является переменная типа PChar (т.е. ссылка на Char'ы). Тогда каким образом функция вызванная из dll и получив этот указатель, сможет выделить место для этой переменной в области памяти основной программы так, чтобы после выгрузки dll переменная и ее значение еще были живы и вообще, как dll может управлять чужой областью памяти в этом случае? Как вообще работает эта API и подобные ей, в них даже не @PChar передается как у меня, а вообще просто PChar (тела подобных функций не нашел)? Если можно, пожалуйста, приведите простейший код передачи строк из dll в основную прогу и обратно. Последний раз редактировалось sprofxx; 02.04.2010 в 04:49. |
![]() |
![]() |
![]() |
#2 | |
Старожил
Регистрация: 28.01.2009
Сообщений: 21,000
|
![]() Цитата:
Код:
Код:
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел. Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите. |
|
![]() |
![]() |
![]() |
#3 |
Пользователь
Регистрация: 02.04.2010
Сообщений: 11
|
![]() Код:
Вопрос по GetWindowText остается открытым, интересно как именно функция заполняет переданный ей буфер. |
![]() |
![]() |
![]() |
#4 | ||||
Старожил
Регистрация: 28.01.2009
Сообщений: 21,000
|
![]() Цитата:
в таком случае выделяем память в процедуре и возвращаем на нее указатель(предварительно заполнив) но тогда в основной программе нужно освобождать её. Цитата:
но такой подход, не очень хорош, но я обьяснил выше Цитата:
мы возвращаем PChar а не array of Char(и то статический)...ибо массив статический уже будет распределен динамически при входе в функцию.(в стеке, как локальная паременная) Цитата:
вы передаете вторым параметром указатель на область памяти(размер передается третим параметром) и она по этому указателю пишет нужные данные, не превышая размера этой области. но она не выделяем памяти. или что вам не понятно? Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел. Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите. Последний раз редактировалось Пепел Феникса; 02.04.2010 в 05:39. |
||||
![]() |
![]() |
![]() |
#5 |
Участник клуба
Регистрация: 09.11.2007
Сообщений: 1,762
|
![]()
А не легче тогда в DLL использовать не процедуру, а функцию, которая и возвратит в основную прогу строку?!
|
![]() |
![]() |
![]() |
#6 |
Пользователь
Регистрация: 02.04.2010
Сообщений: 11
|
![]()
Хм... тогда если мы хотим независимости от dll, то реализовывается моим способом из первого поста (вы не ответили о правильности)?...
Вообще хотелось бы увидеть простейший пример, подобие использования GetWindowText. код основной программы: Код:
Код:
|
![]() |
![]() |
![]() |
#7 | |
Пользователь
Регистрация: 02.04.2010
Сообщений: 11
|
![]() Цитата:
При этом всем как используется GetWindowText... часто разработчики даже не выделяют память для переменной PChar, а просто объявляют ее, в моих экспериментах это вызывало исключения, поэтому я подумал что может сама функция как то умеет это делать. И еще не ясно как заполнять указатель переданный в функцию, каким оператором? str^:='бла бла' ведь не то.... Последний раз редактировалось sprofxx; 02.04.2010 в 07:09. |
|
![]() |
![]() |
![]() |
#8 |
Форумчанин
Регистрация: 17.09.2009
Сообщений: 294
|
![]()
Попробуй вот так:
Код:
принимаю благодарности в письменном виде( весы слева)...
![]() |
![]() |
![]() |
![]() |
#9 | |||
Старожил
Регистрация: 28.01.2009
Сообщений: 21,000
|
![]() Цитата:
но вообще это на самом деле тоже самое что я написал, только через Ж... Цитата:
вот вам пример функции подобной GetWindowText Модуль программы Код:
Код:
код проги. Код:
Код:
Цитата:
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел. Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите. Последний раз редактировалось Пепел Феникса; 02.04.2010 в 07:24. Причина: дополнил и исправил ширину |
|||
![]() |
![]() |
![]() |
#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 |