|
|
Регистрация Восстановить пароль |
Повторная активизация e-mail |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
|
|
Опции темы | Поиск в этой теме |
05.08.2008, 12:45 | #1 |
Форумчанин Подтвердите свой е-майл
Регистрация: 20.11.2007
Сообщений: 500
|
Взаимодействие DLL и программы
Мне необходимо использовать в DLL функцию которая описана в модуле моей программы! я пытаюсь передать адрес этой функций как параметр-константу в процедуру DLL в результате чего получаю ошибку Privileged instruction. в объявлений и описании функций в моей программе я указал stdcall.
что мне делать в такой ситуации? |
05.08.2008, 13:11 | #2 |
Белик Виталий :)
Старожил
Регистрация: 23.07.2007
Сообщений: 57,097
|
Наверное показать код
I'm learning to live...
|
05.08.2008, 14:20 | #3 |
Телепат с дипломом
Старожил
Регистрация: 10.06.2007
Сообщений: 4,929
|
Как-то странно, а почему ее не вынести в эту DLL?
The future is not a tablet with a 9" screen no more than the future was a 9" black & white screen in a box. It’s the paradigm that survives. (Kroc Camen)
Проверь себя! Онлайн тестирование | Мой блог |
05.08.2008, 14:24 | #4 |
Форумчанин Подтвердите свой е-майл
Регистрация: 20.11.2007
Сообщений: 500
|
потому что тогда придется вызывать уже не эту функцию, а другие, которые так же описаны в модулях программы...
вот вам код!! Код:
Последний раз редактировалось zetrix; 05.08.2008 в 15:09. Причина: объединение |
05.08.2008, 14:54 | #5 |
Android Developer
Старожил Подтвердите свой е-майл
Регистрация: 19.02.2007
Сообщений: 3,708
|
Честно говоря я чтот не пойму что здесь ввообще происходит!
По порядку 1. Ехе получает указатель на DllProc 2. Ехе получает указатель на не экспортируемую функцию причем из Application.Handle 3. Полученый непонятный указатель передается функции в dll и вызывается и после чего длл передает управленее коду по данному указателю в памяти. Сразу вопрос! Функция не постоянна, т.е. если бы вы написали @MyBestFunction вам бы компилятор "показал бы где раки зимууют" так вы решили его обдурить?! Вам вот что надо Код:
Ах да, если уж так надо то попробуйте функции MyBestFunction еще приписать export; |
05.08.2008, 14:59 | #6 | |
Белик Виталий :)
Старожил
Регистрация: 23.07.2007
Сообщений: 57,097
|
Цитата:
I'm learning to live...
|
|
05.08.2008, 15:17 | #7 |
Форумчанин Подтвердите свой е-майл
Регистрация: 20.11.2007
Сообщений: 500
|
BOBAH13, то же самое сообщение в том же самом месте!
Мне кажется что у Dll нет прав работать с областью памяти приложения... или это не так? |
05.08.2008, 15:19 | #8 |
Форумчанин Подтвердите свой е-майл
Регистрация: 20.11.2007
Сообщений: 500
|
Хотя теперь @MyBestFunction как параметр у меня прокатило, хотя раньше было сообщение об ошибке, вот я и сделал через GetProcAddress.
|
05.08.2008, 15:30 | #9 |
Android Developer
Старожил Подтвердите свой е-майл
Регистрация: 19.02.2007
Сообщений: 3,708
|
Я уверен на 99% что в сообщения об ошибки сообщалось, что требуется переменна или функция которая указывается параметру @ не является постоянной, т.е. зависима от класса. А мы теперь убрали зависимость от класса и функция просто загружена в память и имеет указатель, в коде он является просто MyBestFunction
p.s. так работает или нет ? чет я не понял ))) |
05.08.2008, 16:00 | #10 |
Пользователь
Регистрация: 30.07.2008
Сообщений: 14
|
В дельфи при передаче строки между модулями в качестве параметра или результата функции, необходимо использовать библиотеку менеджера памяти borlndmm.dll, указывая ShareMem первым в списке юнитов обоих проектов, как сказано ниже (из сгенерированного проекта dll).
{ Important note about DLL memory management: ShareMem must be the first unit in your library's USES clause AND your project's (select Project-View Source) USES clause if your DLL exports any procedures or functions that pass strings as parameters or function results. This applies to all strings passed to and from your DLL--even those that are nested in records and classes. ShareMem is the interface unit to the BORLNDMM.DLL shared memory manager, which must be deployed along with your DLL. To avoid using BORLNDMM.DLL, pass string information using PChar or ShortString parameters. } Если в Ваших проектах это уже сделано - попытайтесь сначала вызвать функцию, имеющую параметры и результат примитивных типов. |
|
Похожие темы | ||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
Взаимодействие flash и C#? | mrakaziabra | Общие вопросы .NET | 3 | 16.07.2008 07:16 |
взаимодействие с QIP | Toxa | Общие вопросы Delphi | 5 | 20.06.2008 19:39 |
Взаимодействие с виндой и еще кое-что | Manitu | Помощь студентам | 5 | 25.03.2008 09:28 |