Есть несколько вариантов:
1) Смотреть на стеке адрес возврата и определять какому модулю он принадлежит (обработчик int 2e так и делает)
2) Задуматься над тем, почему при регистрации любых колбэков в Win32 API один из параметров HINSTANCE, который может быть любым числом. Короче, если уж все dll-ки твои: и та что с колбякой и те что ее юзают, почему бы не добавить еще один параметр - в котором вызывающая dll-ка будет "представляться"
Моя прога делает LoadLibrary нескольким DLL. Передает этим DLL адрес одной и той же процедурки (callback в общем). Все эти DLL эту процедурку время от времени вызывают. Вопрос: может ли процедурка определить какая конкретно DLL ее вызвала?
Вообще-то может09.01.03 15:37 Автор: amirul <Serge> Статус: The Elderman
Есть несколько вариантов:
1) Смотреть на стеке адрес возврата и определять какому модулю он принадлежит (обработчик int 2e так и делает)
2) Задуматься над тем, почему при регистрации любых колбэков в Win32 API один из параметров HINSTANCE, который может быть любым числом. Короче, если уж все dll-ки твои: и та что с колбякой и те что ее юзают, почему бы не добавить еще один параметр - в котором вызывающая dll-ка будет "представляться"
> Насколько правильно вот это: > > 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, ...)