Автор
|
Тема: LoadLibrary
|
sanuka |
опубликован 27-07-2001 21:50 MSK
Последовательность действий: создаю указатель на функцию, допустим MessageBoxA и переменную модуля,загружаю dll содержащую эту функцию, определяю адрес функции, вызываю функцию и освобождаю dll. Проблема: при вызове функции таким способом программа вылетает. MessageBoxA взял для примера на самом деле вызываю диалог открытия файла - ordinal 63 from shell32.dll. Самое интересное, что в VB туже функцию вызываю через Declare... и все работает ok. И такие проблемы только с системными библиотеками(догадываюсь, что может быть как-то это связано с TLS). Ну вообщем помогите идиоту, please. Greate thanks in advance.---=== code sample ===--- int ( *msgbox)(HWND,LPCTSTR,LPCSTR,UINT); HINSTANCE hMdl; hMdl=LoadLibrary("user32.dll"); msgbox=(int (*)(HWND,LPCTSTR,LPCTSTR,UINT)) GetProcAddress(hMdl,(const char*)429); msgbox(hwnd,"yes","oo",MB_OK); FreeLibrary(hMdl);
|
Kosha
|
опубликован 28-07-2001 00:36 MSK
Может я чего-то не понимаю... MSDN повис, поэтому вслепую:разве длл-ка заглавится HINSTANCE а не HMODULE? (или это одно и то же?) Странно... Попробовал поюзать твой код...
строчка msgbox=(int (*)(HWND,LPCTSTR,LPCTSTR,UINT)) GetProcAddress(hMdl,"MessageBoxA"); возвращает один адрес ф-ии, а msgbox=(int (*)(HWND,LPCTSTR,LPCTSTR,UINT)) GetProcAddress(hMdl,(const char*)429); - на 0x10 больше... Хотя 429 - именно MessageBoxA... Попробуй напрямую...
|
DimonT
|
опубликован 28-07-2001 10:31 MSK
Я не секу в DLL, но MSDN у меня фунциклирует, цитирую (под редакцией переводчика Сократ):...GetProcAddress проверяет, что определенный порядковый - в дипазоне 1 через самую верхнюю порядковую величину экспортированную в файл .DEF. Функция затем используется порядковый как индекс, чтобы прочитать функциональный адрес из функциональной таблицы. Если файл .DEF не перечисляет функции последовательно от 1 до N (где N - количество экспортируемых функций), ошибка может произойти где GetProcAddress возвращает инвалида... Может этот инвалидный адрес по порядковому номеру как раз по этой причине, раз по имени всё нормально? |
DimonT
|
опубликован 28-07-2001 10:41 MSK
2Kosha:HINSTANCE и HMODULE в 32bit-коде действительно одно и то же, хотя, говорят в 16-разрядном это были совершенно разные вещи. |
DimonT
|
опубликован 28-07-2001 11:10 MSK
Да, кстати, припомнил ещё кое-какую литературу - там автор сетовал, что его прога стала глючить то ли под новой версией системы, то ли просто с новой версией библиотеки. И выяснил он (типа на разработчики Windows - его хорошие знакомые), что Microsoft не в состоянии поддерживать одни и те же порядковые номера функций, даже тех, что присутствуют во всех версиях её API. Короче, после замены номеров на имена всё стало OK. Легенда с хэппи-эндом. |
breeder
|
опубликован 28-07-2001 11:12 MSK
Незнаю как у Вас, но у меня в user32.dll 429 это LoadMenuIndirectW, а MessageBoxA это 452 %) Кроме того, надежнее будет наверное msgbox объявить как int (WINAPI*msgbox)(HWND,LPCTSTR,LPCSTR,UINT); |
DimonT
|
опубликован 28-07-2001 17:53 MSK
2sanuka, 2Kosha, 2breeder:Вы бы сравнили свои версии библиотек и систем, если не трудно. Мне интересно, правильную ли мысль я подкинул. Может и пригодиться на будущее. 2ALL: Да и все, кому интересно, могут поучаствовать. |
Kosha
|
опубликован 28-07-2001 18:00 MSK
USER32.dll 69632 байт, сбилден 05.05.99 22:22.версия 4.10.2222 PE header: Count of sections 5 Symbol table 0 [0 ] Size of optional header E0 Linker version 2 .3C Image version 0 .0 Entrypoint RVA 3FF0 Size of init data 1E00 Size of image 11000 Base of code 1000 Image base BFF50000 Section alignment 1000 Stack 100000 /1000 Checksum 1E3E7 Machine 14C TimeStamp 379E5661 Magic optional header 10B OS version 4 .0 Subsystem version 4 .0 Size of code B600 Size of uninit data 0 Size of headers 400 Base of data D000 Subsystem 2 File alignment 1000 Heap 100000 /1000 Number of directories 10 |
breeder
|
опубликован 30-07-2001 06:44 MSK
Операционная система Microsoft (R) Windows (R) 2000 Версия - 5.00.2195.1600 452 1C3 0002B40C MessageBoxAКстати, сейчас посмотрел, в Win98: 429 1AC 0000412E MessageBoxA а в NT4: 411 19A 0001BC4C MessageBoxA
|