![]() |
Модераторы: Poseidon, Snowy, bems, MetalFan |
![]() ![]() ![]() |
|
z-END |
|
|||
![]() прафесар™ ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 3014 Регистрация: 13.3.2003 Где: Венья, Пиетари Репутация: 11 Всего: 102 |
есть объект надо передать его функцию в подгружаемую dll
хотя если вынести данный код (TheSomeFunc) из тела объекта и поместить в качестве отдельной функции то все работает, но нужно именно из объекта... как быть? -------------------- Каждый чилавек пасвоему праф...а памоему НЕТ! |
|||
|
||||
Snowy |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 11363 Регистрация: 13.10.2004 Где: Питер Репутация: 192 Всего: 484 |
Попробуй создать тип
|
|||
|
||||
z-END |
|
||||||
![]() прафесар™ ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 3014 Регистрация: 13.3.2003 Где: Венья, Пиетари Репутация: 11 Всего: 102 |
так работает... но несовсем так как надо
![]() в dll использую такую конструкцию:
в объекте такой код:
причем код {ля-ля-ля} выполняется, но если в нем использовать такой вариант:
то вываливается сообщение об ошибке AV. а я как раз и пытался переместить тело функции в объект чтобы работать с его переменными. получается что так нельзя? или я неправильно что-то деалю? -------------------- Каждый чилавек пасвоему праф...а памоему НЕТ! |
||||||
|
|||||||
Snowy |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 11363 Регистрация: 13.10.2004 Где: Питер Репутация: 192 Всего: 484 |
Это же dll. Конечно нельзя.
Вместо прямого доступа к полям, ты должен передать указатель на структуру, которую функция заполнит и вернет тебе. А ты уже раскладывай по нужным тебе полям. |
|||
|
||||
z-END |
|
|||
![]() прафесар™ ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 3014 Регистрация: 13.3.2003 Где: Венья, Пиетари Репутация: 11 Всего: 102 |
дык из длл я и не использую прямой доступ к полям объекта, из длл я выполняю функцию которая является частью объекта, и уже она в свою очередь использует доступ к полям... или я душа заблудшая? -------------------- Каждый чилавек пасвоему праф...а памоему НЕТ! |
|||
|
||||
Snowy |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 11363 Регистрация: 13.10.2004 Где: Питер Репутация: 192 Всего: 484 |
Нет, из dll ты не можешь использовать доступ к полям, даже вызывая этот метод. Для dll это обычная функция, а не функция класса. Как вариант, ты можешь использовать левую функцию и передавать ей указатель на объект. При возврате в exe, именуешь указатель объектом и вызываешь метод. |
|||
|
||||
z-END |
|
|||
![]() прафесар™ ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 3014 Регистрация: 13.3.2003 Где: Венья, Пиетари Репутация: 11 Всего: 102 |
приблизительно так и делал.. уж больно массивно показалось решил упростить... ну лан придется обратно откатываться ![]() -------------------- Каждый чилавек пасвоему праф...а памоему НЕТ! |
|||
|
||||
Snowy |
|
||||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 11363 Регистрация: 13.10.2004 Где: Питер Репутация: 192 Всего: 484 |
Только в таком случае нужно делать не объект, а класс. Добавлено @ 15:02
|
||||
|
|||||
Snowy |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 11363 Регистрация: 13.10.2004 Где: Питер Репутация: 192 Всего: 484 |
Кратко объясню суть проблемы.
Реально, т.к. функция function TheSomeFunc(Param1:Word; Param2:PAnsiChar):PAnsiChar является методом, то у нее не 2 параметра а 3. Третий параметр - Self, указывающий на экземпляр. Т.к. ты вызываешь ее из dll, то она не получает этого Self и не может обратиться к полям экземпляра. Поэтому для корректной работы нужно дать ей этот параметр. Внедряться в модель дельфи неразумно. Поэтому лучше сделать третью функцию, которая будет явно получать указатель на этот экземпляр и вызывать метод так, как полагается. |
|||
|
||||
Демо |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1278 Регистрация: 3.11.2005 Репутация: 30 Всего: 50 |
> Автор
Для подобных манипуляций есть простой прием: Создается промежуточная функция в основной программе, которая получает экземпляр объекта. В этой функции уже вызывается метод и функция из DLL. -------------------- |
|||
|
||||
z-END |
|
||||
![]() прафесар™ ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 3014 Регистрация: 13.3.2003 Где: Венья, Пиетари Репутация: 11 Всего: 102 |
почему-то в этом месте obj всегда nil, хотя при вызове таковым не является ![]() Добавлено @ 16:13
этого мне категорически ненадо, доступа из длл к объекту быть недолжно, т.е. в длл даже неизвестна его структура... -------------------- Каждый чилавек пасвоему праф...а памоему НЕТ! |
||||
|
|||||
Snowy |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 11363 Регистрация: 13.10.2004 Где: Питер Репутация: 192 Всего: 484 |
Проверь, чему равняется obj в других функциях: Init и _open. |
|||
|
||||
z-END |
|
|||
![]() прафесар™ ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 3014 Регистрация: 13.3.2003 Где: Венья, Пиетари Репутация: 11 Всего: 102 |
Все разобрался! Snowy спасибо! за разъяснения
-------------------- Каждый чилавек пасвоему праф...а памоему НЕТ! |
|||
|
||||
![]() ![]() ![]() |
Правила форума "Delphi: Общие вопросы" | |
|
Запрещается! 1. Публиковать ссылки на вскрытые компоненты 2. Обсуждать взлом компонентов и делиться вскрытыми компонентами
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader. |
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | Delphi: Общие вопросы | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |