Всем привет! У меня возникла такая проблема: Если попытаться загрузить и отгрузить длл'ку, содержащую ресурсы диалога а потом опять заново ее загрузить и попытаться вызвать оттуда функцию типа DialogBoxParam(которая создаёт диалог из ресурса), то на появившемся диалоге не будет отображаться текст, в том числе и на кнопках! Все это происходит в CUI приложении. В оконном приложениее всё ОК. Кто - нибудь сталкивался с этой проблемой??? P.S. Воспроизвести проблему можно и при помощи мессадж бокса. Вот так(расскомментируйте LoadLibrary/FreeLibrary, чтобы увидеть результат!!!): -----------------------------client.cpp-------------------- #include <windows.h> typedef int (WINAPI * p_msgbox)(HWND hWnd, LPCTSTR lpText, LPCTSTR lpCaption, UINT uType); void main() { HINSTANCE h; //h = ::LoadLibrary("user32.dll"); //::FreeLibrary(h); h = ::LoadLibrary("user32.dll"); p_msgbox msgbox = (p_msgbox)::GetProcAddress(h, "MessageBoxA"); msgbox(NULL, "Title", "Content", MB_YESNO); ::FreeLibrary(h); } -----------------------------client.cpp--------------------
Если нижеприведенный код аналогичен сишному, то воспроизвести проблему не удалось, месаджбокс отображается нормально Код (Text): ;=============================================== format pe console include '%fasminc%\win32a.inc' ;=============================================== l db 'user32.dll',0 f db 'MessageBoxA',0 ;=============================================== entry $ invoke LoadLibrary,l invoke FreeLibrary,eax invoke LoadLibrary,l invoke GetProcAddress,eax,f stdcall eax,0,f,l,MB_ICONINFORMATION invoke ExitProcess,0 ;=============================================== data import library kernel32,'kernel32.dll' include '%fasminc%\apia\kernel32.inc' end data ;===============================================
Кстати, у меня win2k и FreeLibrary не оказывает никакого воздействия на user32.dll, т.е. его не выгружает, такое тоже работает Код (Text): entry $ invoke LoadLibrary,l mov esi,eax invoke GetProcAddress,eax,f push eax invoke FreeLibrary,esi pop eax stdcall eax,0,f,l,MB_ICONINFORMATION
2bogrus: Что значет "месаджбокс отображается нормально"? Ты видишь иконку??!! У тебя проставлено MB_ICONINFORMATION, т.е. показать значок в боксе. А текст получилось увидеть? Под win2k также не работает. Забыл сказать, тестируеммая система Windows XP SP1
У меня w2ksp4ru, все отображается нормально и иконка и текст и MB_YESNO, смотри у себя в отладчике _992939393__msgbox.exe
bogrus w2ksp4 & wxpsp2 текст не отображается ни в твоем коде ни в коде из первого поста, хотя сам статик и его caption msspy++ показывает.
Потестил на WinXPSP1EN, WinXPSP2RU(MUI), Win2000AdvancedSP4En и WinXP2000SP2En. Везде один и тот же пустой диалог кроме последней винды, там все ок. Как такое может быть? Что является причиной этого
q_q У меня русская w2ksp4, версия user32.dll (Библиотека клиента USER API Windows 2000) - 5.0.2195.6688, полет нормальный 540008103__msgbug.png
liss Проверьте в оллидбг, выгружается ли user32.dll после FreeLibrary (у меня нет), возможно проблема именно в этом
Резюмируя скажу, что на некоторых системах работает нормально, на некоторых - нет. Вопрос почему такое поведение, остается открытым...
bogrus Я пробовал на w2ksp4ru user32.dll 5.00.2195.6897. выгружается ли user32.dll после FreeLibrary На wxpsp2 выгружается и загружается внешне нормально, т.е. в комплекте с GDI32.DLL.
Хе, wxpsp2 глюк есть. Предполагаю, что нельзя допускать выгрузки gdi32.dll Если вначале поставить h = ::LoadLibrary("gdi32.dll"); то все в норме, любая другая независящая от gdi32.dll не катит. Может гуру объяснят в чем точно дело...