WWW.ИСХОДНИКИ.РУ cpp.sources.ru
java.sources.ru web.sources.ru soft.sources.ru
jdbc.sources.ru asp.sources.ru api.sources.ru

  Форум на исходниках
  C / C++ / Visual C++
  LoadLibrary

СПРОСИТЬ  ОТВЕТИТЬ
профайл | регистрация | faq

Автор Тема:   LoadLibrary
sanuka опубликован 27-07-2001 21:50 MSK   Click Here to See the Profile for sanuka   Click Here to Email sanuka  
Последовательность действий:
создаю указатель на функцию, допустим 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     Click Here to See the Profile for Kosha  Click Here to Email Kosha     
Может я чего-то не понимаю...
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     Click Here to See the Profile for DimonT  Click Here to Email DimonT     
Я не секу в DLL, но MSDN у меня фунциклирует, цитирую (под редакцией переводчика Сократ):

...GetProcAddress проверяет, что определенный порядковый - в дипазоне 1 через самую верхнюю порядковую величину экспортированную в файл .DEF. Функция затем используется порядковый как индекс, чтобы прочитать функциональный адрес из функциональной таблицы. Если файл .DEF не перечисляет функции последовательно от 1 до N (где N - количество экспортируемых функций), ошибка может произойти где GetProcAddress возвращает инвалида...

Может этот инвалидный адрес по порядковому номеру как раз по этой причине, раз по имени всё нормально?

DimonT опубликован 28-07-2001 10:41 MSK     Click Here to See the Profile for DimonT  Click Here to Email DimonT     
2Kosha:

HINSTANCE и HMODULE в 32bit-коде действительно одно и то же, хотя, говорят в 16-разрядном это были совершенно разные вещи.

DimonT опубликован 28-07-2001 11:10 MSK     Click Here to See the Profile for DimonT  Click Here to Email DimonT     
Да, кстати, припомнил ещё кое-какую литературу - там автор сетовал, что его прога стала глючить то ли под новой версией системы, то ли просто с новой версией библиотеки. И выяснил он (типа на разработчики Windows - его хорошие знакомые), что Microsoft не в состоянии поддерживать одни и те же порядковые номера функций, даже тех, что присутствуют во всех версиях её API. Короче, после замены номеров на имена всё стало OK. Легенда с хэппи-эндом.
breeder опубликован 28-07-2001 11:12 MSK     Click Here to See the Profile for breeder  Click Here to Email breeder     
Незнаю как у Вас, но у меня в user32.dll 429 это LoadMenuIndirectW, а MessageBoxA это 452 %)
Кроме того, надежнее будет наверное msgbox объявить как int (WINAPI*msgbox)(HWND,LPCTSTR,LPCSTR,UINT);
DimonT опубликован 28-07-2001 17:53 MSK     Click Here to See the Profile for DimonT  Click Here to Email DimonT     
2sanuka, 2Kosha, 2breeder:

Вы бы сравнили свои версии библиотек и систем, если не трудно. Мне интересно, правильную ли мысль я подкинул. Может и пригодиться на будущее.

2ALL:

Да и все, кому интересно, могут поучаствовать.

Kosha опубликован 28-07-2001 18:00 MSK     Click Here to See the Profile for Kosha  Click Here to Email Kosha     
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     Click Here to See the Profile for breeder  Click Here to Email breeder     
Операционная система Microsoft (R) Windows (R) 2000
Версия - 5.00.2195.1600
452 1C3 0002B40C MessageBoxA

Кстати, сейчас посмотрел, в Win98:
429 1AC 0000412E MessageBoxA
а в NT4:
411 19A 0001BC4C MessageBoxA

СПРОСИТЬ  ОТВЕТИТЬ
Перейти:


E-mail | WWW.ИСХОДНИКИ.RU

Powered by: Ultimate Bulletin Board, Freeware Version 5.10a
Purchase our Licensed Version- which adds many more features!
© Infopop Corporation (formerly Madrona Park, Inc.), 1998 - 2000.