Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
||
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[3.136.97.64] |
|
Сообщ.
#1
,
|
|
|
Добрый день.
Есть некий пример кода, где результат работы GetModuleHandle() сохраняется в переменную типа uintptr_t. Если сохранять его в HMODULE (как на msdn) и использовать дальше - приложение крашится. Без примеров кода, кто-нибудь может порассуждать на эту тему? Почему GetModuleHandle() способна свой результат сохранять в переменной uintptr_t, вместо HMODULE? PS: весь код под win10, x86 app, msvs 2017. |
Сообщ.
#2
,
|
|
|
Способна, наверное, потому, что sizeof(uintptr_t) = sizeof(void*). А пример ломающегося кода лучше уж выложите, - там и посмотрим, в чём поломка.
|
Сообщ.
#3
,
|
|
|
Цитата barberan @ Если сохранять его в HMODULE (как на msdn) и использовать дальше - приложение крашится. Без примеров кода, кто-нибудь может порассуждать на эту тему? Совсем без примера я не хочу. Ты сам попробуй сделать такой пример: HMODULE aH = ::GetModuleHandle(NULL); uintptr_t uH = (uintptr_t)::GetModuleHandle(NULL); _tprintf(_T("aH=0x%p uH=0x%p\n"),aH,uH); ++aH; ++uH; _tprintf(_T("aH=0x%p uH=0x%p\n"),aH,uH); |
Сообщ.
#4
,
|
|
|
Рассуждаю: в текущей версии вашей библиотеки HMODULE есть некое число, которое совпадает по размерности с указателем (или является указателем). В следующей версии авторы библиотеки захотят сделать HMODULE структурой, хранящей кучу дополнительной информации. Код, использующий явное приведение типа к uintptr_t, будет компилиться с новой версией вашей библиотеки, но работать не будет и вы потратите непредсказуемо большое количество времени на поиск причины.
|
Сообщ.
#5
,
|
|
|
Суть дела - я делаю inject dll и хочу вызвать свою ф-цию в моем .ехе файле из своей dll.
Суть основного вопроса как раз в коде DLL, в теле потоковой ф-ции ThreadProc() Вот пример: Есть DLL: #include <windows.h> typedef int (__stdcall *_funcA)(); _funcA funcA; DWORD WINAPI ThreadProc(LPVOID lpParameter) { // если написать: HMODULE hBaseAddr = (uintptr_t)GetModuleHandle(NULL); - то все упадет, но я не понимаю почему uintptr_t hBaseAddr = (uintptr_t)GetModuleHandle(NULL); funcA = (_funcA)(hBaseAddr + 0x11730); funcA(); return 0; } BOOL WINAPI DllMain( HINSTANCE hinstDLL, // handle to DLL module DWORD fdwReason, // reason for calling function LPVOID lpReserved) // reserved { // Perform actions based on the reason for calling. switch (fdwReason) { case DLL_PROCESS_ATTACH: CreateThread(0, 0, ThreadProc, hinstDLL, 0, 0); break; case DLL_THREAD_ATTACH: // Do thread-specific initialization. break; case DLL_THREAD_DETACH: // Do thread-specific cleanup. break; case DLL_PROCESS_DETACH: // Perform any necessary cleanup. break; } return TRUE; // Successful DLL_PROCESS_ATTACH. } Есть EXE, ф-цию которого я вызываю: #include <stdio.h> #include <windows.h> int funcA(void) { const char * s = "for b"; printf("Message from FuncA()\n"); return 0; } int main(void) { funcA(); getchar(); return 0; } |
Сообщ.
#6
,
|
|
|
Цитата barberan @ Суть дела - я делаю inject dll и.. Есть DLL: // если написать: HMODULE hBaseAddr = (uintptr_t)GetModuleHandle(NULL); - то все упадет, но я не понимаю почему Чтобы понять разницу напиши такой тест - это же не сложно: int __cdecl _tmain(void) { _tprintf(_T("Hello, world!\n")); HMODULE aH = ::GetModuleHandle(NULL); uintptr_t uH = (uintptr_t)::GetModuleHandle(NULL); _tprintf(_T("aH=0x%p uH=0x%p\n"),aH,uH); aH += 0x11730; uH += 0x11730; _tprintf(_T("aH=0x%p uH=0x%p\n"),aH,uH); } |
Сообщ.
#7
,
|
|
|
Да, я уже понял, спасибо
|