Форум: "WinAPI";
Текущий архив: 2003.07.24;
Скачать: [xml.tar.bz2];
ВнизLoadLibrary и LoadLibraryEx Найти похожие ветки
← →
evvcom (2003-05-21 16:32) [0]Использовал в своей проге LoadLibrary, потом заменил ее на вызов LoadLibraryEx, чтобы только определить найдет ли система некую dll. На основе этого делаю некоторую инициализацию. А потом уже в нужный момент загружаю/выгружаю её. Отлаживал на XP. Все работало.
Потом протестировал удаленно на ME. И по логам определил, что LoadLibraryEx не может найти dll, лежащую в System, а LoadLibrary ее нормально находит. ME мне сказали базовая, никаких заплат на нее не ставили.
Что это глюк ОС? В хелпе написано, что во всех этих ОС эти функции реализованы.
← →
Игорь Шевченко (2003-05-21 17:58) [1]Код в студию
← →
evvcom (2003-05-22 08:23) [2]Пожал-ста!
function TryLoadLibrary(lpLibFileName: PChar): Boolean;
var l_hModule: HMODULE;
begin
{$IFDEF DebugMode}
WriteLnLog("Вызывается LoadLibraryEx.");
{$ENDIF}
l_hModule := LoadLibraryEx(lpLibFileName, 0, LOAD_LIBRARY_AS_DATAFILE);
if l_hModule = 0 then begin
{$IFDEF DebugMode}
WriteLnLog("ОШИБКА! Библиотека " + lpLibFileName + " не найдена.");
WriteLnLog("Вызывается LoadLibrary.");
{$ENDIF}
l_hModule := LoadLibrary(lpLibFileName);
end;
Result := l_hModule > 0;
if Result then FreeLibrary(l_hModule);
{$IFDEF DebugMode}
if not Result then WriteLog("ОШИБКА! ");
WriteLog("Библиотека " + lpLibFileName + " ");
if not Result then WriteLog("не ");
WriteLnLog("найдена.");
{$ENDIF}
end;
Ну и естественно WriteLog и WriteLnLog - самописные простейшие функции записи в лог-файл, не заслуживающие особого внимания. Повторюсь, что на XP LoadLibraryEx нормально отрабатывала, а на ME с некоторыми dll отрабатывала, а одну не находила. Пользователь сказал, что все они лежат у него в System. Надо, наверное, добавить в лог еще определение каталога, в котором найдена dll. Хотя те dll, которые были найдены, у него продублированы еще в одном каталоге, который возможно прописан в path.
Выдержки из присланного лог-файла:
Вызывается LoadLibraryEx.
Библиотека msfl70.dll найдена.
Вызывается LoadLibraryEx.
Библиотека msfl72.dll найдена.
Вызывается LoadLibraryEx.
ОШИБКА! Библиотека mtapi.dll не найдена.
Вызывается LoadLibrary.
Библиотека mtapi.dll найдена.
← →
Игорь Шевченко (2003-05-22 09:11) [3]Windows 95/98/Me: If you are using LoadLibraryEx to load a module that contains a resource whose numeric identifier is greater than 0x7FFF, LoadLibraryEx fails. If you are attempting to load a 16-bit DLL directly from 32-bit code, LoadLibraryEx fails. If you are attempting to load a DLL whose subsystem version is greater than 4.0, LoadLibraryEx fails. If your DllMain function tries to call the Unicode version of a function, LoadLibraryEx fails.
Уж не случилась ли одна из этих ситуаций ?
← →
evvcom (2003-05-22 09:37) [4]
> Игорь Шевченко © (22.05.03 09:11)
Возможно. Еще в MSDN нашел
It is not safe to call LoadLibraryEx from DllMain.
А у меня как раз эта инициализация происходит в функциях, вызываемых из DllMain. MustDie одним словом. Ладно, спасибо. Буду иметь ввиду, что есть такая проблема в Win9x/Me.
← →
Игорь Шевченко (2003-05-22 10:58) [5]evvcom © (22.05.03 09:37)
> It is not safe to call LoadLibraryEx from DllMain.
> А у меня как раз эта инициализация происходит в функциях,
> вызываемых из DllMain
Это не Mustdie, это делать так не надо - вызывать из Dllmain. Читайте Рихтера, коллега.
← →
nikkie (2003-05-22 15:28) [6]>Игорь Шевченко © (22.05.03 09:11)
>Уж не случилась ли одна из этих ситуаций ?
Вряд ли. Про LoadLibrary написано ровно то же самое.
>evvcom © (22.05.03 09:37)
>It is not safe to call LoadLibraryEx from DllMain.
То же самое написано и про LoadLibrary.
Я тоже сталкивался с подобной проблемой с LoadLibraryEx и тоже с флагом LOAD_LIBRARY_AS_DATAFILE. Симптомы такие же - работает на одной системе и не работает на другой. Заметь только, что ошибка не означает, что dll не найдена. Она или не найдена, или не может быть загружена. Посмотри, что возвратит GetLastError.
Не помню, нашел ли я этому объяснение... Поиск на groups.google.com возвращает немало жалоб на то, что на Win95 после загрузки dll таким образом не получается загрузить bitmap-ы. В конце концов, я плюнул на это дело и стал загружать через LoadLibrary.
← →
Игорь Шевченко (2003-05-22 15:49) [7]nikkie © (22.05.03 15:28)
> Поиск на groups.google.com возвращает немало жалоб на то,
> что на Win95 после загрузки dll таким образом не получается
> загрузить bitmap-ы.
Все правильно:
LOAD_LIBRARY_AS_DATAFILE
If this value is used, the system maps the file into the calling process"s virtual address space as if it were a data file. Nothing is done to execute or prepare to execute the mapped file. Use this flag when you want to load a DLL only to extract messages or resources from it.
Windows NT/2000/XP: You can use the resulting module handle with any functions that operate on resources.
Windows 95/98/Me: You can use the resulting module handle only with resource management functions such as EnumResourceLanguages, EnumResourceNames, EnumResourceTypes, FindResource, FindResourceEx, LoadResource, and SizeofResource. You cannot use this handle with specialized resource management functions such as LoadBitmap, LoadCursor, LoadIcon, LoadImage, and LoadMenu.
Можно и не по Google искать, а по MSDN.
← →
nikkie (2003-05-22 16:15) [8]>Можно и не по Google искать, а по MSDN.
Объясняю, что я имел ввиду - в MSDN ничего не написано про проблему evvcom. Поиск по гуглу дает кучу жалоб на LOAD_LIBRARY_AS_DATAFILE, но из другой оперы. Может у меня и ложное воспоминание про мои проблемы - это было 3 года назад и под рукой тех сорсов нет, нужно время, чтобы их найти и проверить на разных ОС.
Не так давно стакивался еще с одной проблемой - только что посмотрел на нее еще раз. Когда dll загружена через LoadLibraryEx(LOAD_LIBRARY_AS_DATAFILE), то вызов CreateDialog приводит к access violation где-то внутри user32. Загрузка через LoadLibrary - все нормально. Тестировал на Win2000.
← →
Игорь Шевченко (2003-05-22 17:40) [9]nikkie © (22.05.03 16:15)
> в MSDN ничего не написано про проблему evvcom
Если бы она до конца была понятна, эта проблема... :))
> Когда dll загружена через LoadLibraryEx(LOAD_LIBRARY_AS_DATAFILE),
> то вызов CreateDialog приводит к access violation где-то
> внутри user32. Загрузка через LoadLibrary - все нормально.
> Тестировал на Win2000.
Можно предположить, что в DLL при инициализации регистрируется оконный класс для какого-либо элемента управления в диалоге, а при загрузке через LoadLibraryEx (AS_DATA_FILE) не вызывается процедура инициализации и класс не регистрируется, например...
← →
nikkie (2003-05-22 18:39) [10]>Можно предположить...
Да нет, dll написана мною и содержит только ресурсы. В том числе диалоговый ресурс. На нем только едитбоксы и кнопки. DllMain пустая, возвращает TRUE.
Диалог создается так (g_hInstance - хендл dll, IDD_PROPERTIES - id диалог-ресурса):
CreateDialog(g_hInstance,
MAKEINTRESOURCE(IDD_PROPERTIES),
hwndParent,
PropertiesDlg_DlgProc);
DlgProc вызывается только один раз для WM_SETFONT. Поcле этого валится - в стеке после моего кода, вызвавшего CreateDialog 3 точки из User32 и адрес 0.
Точно также валится при попытке показать диалог модально:
DialogBoxParam(g_hInstance,
MAKEINTRESOURCE(IDD_CONNECT),
hwndParent,
ConnectDlg_DlgProc, 0);
Когда dll загружается через LoadLibrary - все нормально. Когда вместо хендла dll первым параметром передается хендл exe (в exe точно такие же ресурсы) - все нормально.
← →
evvcom (2003-05-23 08:13) [11]
> Посмотри, что возвратит GetLastError.
Да, посмотрю, спасибо. Что-то не догадался проанализировать код ошибки.
Страницы: 1 вся ветка
Форум: "WinAPI";
Текущий архив: 2003.07.24;
Скачать: [xml.tar.bz2];
Память: 0.48 MB
Время: 0.008 c