Легенда:
новое сообщение
закрытая нитка
новое сообщение
в закрытой нитке
старое сообщение
|
- Напоминаю, что масса вопросов по функционированию форума снимается после прочтения его описания.
- Новичкам также крайне полезно ознакомиться с данным документом.
[Win32] DLL Instance 09.01.03 11:21
Автор: Kerk Статус: Незарегистрированный пользователь
|
Моя прога делает LoadLibrary нескольким DLL. Передает этим DLL адрес одной и той же процедурки (callback в общем). Все эти DLL эту процедурку время от времени вызывают. Вопрос: может ли процедурка определить какая конкретно DLL ее вызвала?
|
|
Вообще-то может 09.01.03 15:37
Автор: amirul <Serge> Статус: The Elderman
|
Есть несколько вариантов:
1) Смотреть на стеке адрес возврата и определять какому модулю он принадлежит (обработчик int 2e так и делает)
2) Задуматься над тем, почему при регистрации любых колбэков в Win32 API один из параметров HINSTANCE, который может быть любым числом. Короче, если уж все dll-ки твои: и та что с колбякой и те что ее юзают, почему бы не добавить еще один параметр - в котором вызывающая dll-ка будет "представляться"
|
| |
[Win32] DLL Instance 16.01.03 12:51
Автор: Kerk Статус: Незарегистрированный пользователь
|
> Есть несколько вариантов: > 1) Смотреть на стеке адрес возврата и определять какому > модулю он принадлежит (обработчик int 2e так и делает)
Насколько правильно вот это:
var
Instance: HINST;
asm
mov eax,[ebp+4]
xor ax,ax
mov Instance,eax
end;
Вроде работает. Но есть ли гарантия, что это правильно в 100% случаев?
|
| | |
[Win32] No warranty :-))) 16.01.03 14:48
Автор: amirul <Serge> Статус: The Elderman
|
> Насколько правильно вот это: > > var > Instance: HINST; > asm > mov eax,[ebp+4] > xor ax,ax > mov Instance,eax > end; > > Вроде работает. Но есть ли гарантия, что это правильно в > 100% случаев?
Первая проблема, которая приходит на ум: несколько вызовов из разных мест одной dll-ки будут иметь разные инстансы. Вообще я имел в виду, что по адресу на стеке получать модуль, которому этот адрес принадлежит. Но это не слишком хороший способ. Лучше примерно так:
typedef int (*PCALLBACK_PROC)(HINSTANCE, ...); // Вместо точек любая другая инфа
typedef struct _CALLBACK_INSTANCE {
LIST_ENTRY Link;
// Всякая другая чушь...
PCALLBACK_PROC func;
HINSTANCE inst;
} CALLBACK_INSTANCE, PCALLBACK_INSTANCE;
RegisterCallback(HINSTANCE hinst, CALLBACK_PROC func) {
// ...
PCALLBACK_INSTANCE pci = (PCALLBACK_INSTANCE)malloc(sizeof(CALLBACK_INSTANCE));
if (pci == NULL)
goto fail;
pci->inst = hinst;
pci->func = func;
}
А вызывать: pci->func(pci->hinst, ...)
|
|
|