Сейчас на форуме: hgdagon, asfa, bartolomeo (+4 невидимых)

 eXeL@B —› Программирование —› Замена DefWindowProc
Посл.ответ Сообщение

Ранг: 44.7 (посетитель)
Активность: 0.040
Статус: Участник

Создано: 20 марта 2007 14:31
· Личное сообщение · #1

Когда в программе использовать API методом LoadLibraryA -> GetProcAddress -> call eax -> Free Library, и когда такое делать с DefWindowProc, то почему-то все окна(BUTTON, STATIC) создаются без текста на них...
С чем это может быть связано???




Ранг: 793.4 (! !), 568thx
Активность: 0.740
Статус: Участник
Шаман

Создано: 20 марта 2007 14:46
· Личное сообщение · #2

Пример кода в студию (ц)

-----
Yann Tiersen best and do not fuck




Ранг: 38.3 (посетитель)
Активность: 0.010
Статус: Участник

Создано: 22 марта 2007 12:23 · Поправил: nv_xor
· Личное сообщение · #3

Адрес оконной процедуры можно узнать/установить, используя GetWindowLong()/SetWindowLong()



Ранг: 44.7 (посетитель)
Активность: 0.040
Статус: Участник

Создано: 23 марта 2007 20:46
· Личное сообщение · #4

PE_Kill пишет:
Пример кода в студию (ц)


LRESULT __DefWindowProc(HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lParam)
{
const char *szDll = "User32.dll";
const char *szProc = "DefWindowProcA";
HMODULE hLib = LoadLibraryA(szDll);
GetProcAddress(hLib, szProc);
LRESULT result;
__asm
{
push lParam;
push wParam;
push Msg;
push hWnd;
call eax;
mov result, eax;
}
FreeLibrary(hLib);
return result;
}

и потом

#define DefWindowProc __DefWindowProc



Ранг: 44.7 (посетитель)
Активность: 0.040
Статус: Участник

Создано: 23 марта 2007 20:55
· Личное сообщение · #5

Ну там таким образом все API-функции переделаны...



Ранг: 44.7 (посетитель)
Активность: 0.040
Статус: Участник

Создано: 23 марта 2007 21:25
· Личное сообщение · #6

кроме GetProcAddress s LoadLibrary



Ранг: 44.7 (посетитель)
Активность: 0.040
Статус: Участник

Создано: 25 марта 2007 13:59
· Личное сообщение · #7

Заметил, что если поубирать со всех функций FreeLibrary, то все становится ок!!!
ПОЧЕМУ???????




Ранг: 793.4 (! !), 568thx
Активность: 0.740
Статус: Участник
Шаман

Создано: 26 марта 2007 09:04
· Личное сообщение · #8

Может потому что, User32.dll уже загружена и тебе передается только ее хэндл. Попробуй переделать так (C не знаю, так что сорри):

LRESULT __DefWindowProc(HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lParam)
{
const char *szDll = "User32.dll";
const char *szProc = "DefWindowProcA";
byte fLoaded = TRUE;
HMODULE hLib = GetModuleHandleA(szDll);
if hLib==0
{
fLoaded=FALSE;
hLib = LoadLibraryA(szDll);
}
GetProcAddress(hLib, szProc);
LRESULT result;
__asm
{
push lParam;
push wParam;
push Msg;
push hWnd;
call eax;
mov result, eax;
}
if fLoaded==FALSE
{
FreeLibrary(hLib);
}
return result;
}

-----
Yann Tiersen best and do not fuck




Ранг: 44.7 (посетитель)
Активность: 0.040
Статус: Участник

Создано: 28 марта 2007 22:09
· Личное сообщение · #9

PE_Kill
Хм... не понял...
DLL загружена и передается хэндл... Ну и что???
Главное, что адрес процедуры определен (иначе вылет был-бы "call 0x00000000"), но результат почему-то разный...
Или я чего-то не понимаю???


 eXeL@B —› Программирование —› Замена DefWindowProc
:: Ваш ответ
Жирный  Курсив  Подчеркнутый  Перечеркнутый  {mpf5}  Код  Вставить ссылку 
:s1: :s2: :s3: :s4: :s5: :s6: :s7: :s8: :s9: :s10: :s11: :s12: :s13: :s14: :s15: :s16:


Максимальный размер аттача: 500KB.
Ваш логин: german1505 » Выход » ЛС
   Для печати Для печати