Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 2004.02.25;
Скачать: [xml.tar.bz2];

Вниз

Где Win98 ищет dll ?   Найти похожие ветки 

 
VID   (2004-02-10 18:14) [0]

В папке вместе с моей программой лежат две dll-ки: riched32.dll и riched20.dll
Они обе используются моей программной. В Win2k программа автоматически загружала именно эти две длл, т.е. те которые лежат в одной папке с прогой, ну а если их не было, то только тогда искала их в Winnt\System...
В 98 винде похоже всё наоборот! Т.е. сначала прога ищет dll-ки в System, а потом в своей папке. А это не есть гуд, т.к. dll которые идёт с моей прогой и лежат с ней в одной папке высшей версии (более новые) по сравнению с тем что лежат в папке System 98-ой винды.
Вариант с перезаписью библиотек, находящихся в папке System своими, не подходит, т.к. я не любитель переписывать "чужие" файлы... Вопрос: как надо настроить винду, или программу, что ваще надо сделать что бы в Windows 98 программа в первую очередь искала нужные ей dll в своей папке ?


 
TUser   (2004-02-10 18:33) [1]

Прописывать путь при подключении библиотеки. Application.ExeFileName (или что-то вроде того) и ExtractFilePath.


 
Владислав   (2004-02-10 18:45) [2]

> VID © (10.02.04 18:14)

Вообще, LoadLibrary + MSDN. Подробней некуда. И про 98 там тоже написано. И не только про 98. Прямо алгоритм поиска DLL есть.


 
VID   (2004-02-10 19:50) [3]

Если объект TRichEdit лежит на Form1 (главная форма), то
будет ли верным вызов LoadLibrary в секции Initialization этого юнита(формы), или же LoadLibrary надо вызывать ещё раньще, в коде самого приложения (dpr) ?


 
Владислав   (2004-02-10 20:06) [4]

Ну тут надо понимать одну вещь (И с некоторыми оговорками). Если библиотека уже загружена, то LoadLibrary нам уже мало чем поможет, кроме счетчика ссылок. Общий ответ, чем раньше, тем лучше. Остальное - конкретика.


 
VID   (2004-02-10 20:20) [5]

Ну вот я и хочу понять... в каком момент программа загружает библиотеку автоматически ?
Логически, это должно происходить в момент инициилизации юнита, который в секции USES использует юнит, вообще это легко проверить написав тестовое приложение в котором Form1 использует одну библиотеку, а Form2 другую а потом просто пройтись дебаггером от первой строчки кода DPR и каждый раз пытаться удалять файл библиотеки из папки программы ( у меня Win2k ).
Если удаляется - значит ещё не нужна...


 
VID   (2004-02-10 20:25) [6]

вот и получилось что например RichEd20.dll загружается ещё аж до Application.Initialize;
т.е. LoadLibrary надо вызывать до этой строчки файла DPR...


 
VID   (2004-02-10 20:27) [7]

Var RichEd20:Cardinal = 0;
RichEd32:Cardinal = 0;

Procedure InitDlls;
begin
RichEd20 := LoadLibrary(Pchar(way+"riched20.dll"));
RichEd32 := LoadLibrary(Pchar(way+"riched32.dll"));
end;

Procedure FreeDlls;
begin
IF RichEd20 <> 0 then try FreeLibrary(RichEd20) except end;
IF RichEd32 <> 0 then try FreeLibrary(RichEd32) except end;
end;

begin
InitDlls;
Application.Initialize;
Application.Title := "";
Application.CreateForm(TForm1, Form1);
Application.CreateForm(TCREForm, CREForm);
Application.Run;
FreeDlls;
end.


 
VID   (2004-02-10 20:29) [8]

или может лучше



begin
InitDlls;
try
Application.Initialize;
Application.Title := "";
Application.CreateForm(TForm1, Form1);
Application.CreateForm(TCREForm, CREForm);
Application.Run;
finally
FreeDlls;
end;
end.



?


 
Владислав   (2004-02-10 20:40) [9]

Проблема чуть шире, конечно, но на это VID © (10.02.04 20:25) [6] не надейтесь. Тут может проверять версии установленных библиотек?..


 
VID   (2004-02-10 20:48) [10]

а зачем ? объясни в чём собственно заключается проблема и почему мне не надеятся на шестой пост ?


 
Владислав   (2004-02-10 20:56) [11]

На счет шестого поста... Тут за тебя "понадеятся" другие. Не знаю конкретной реализации, конечно, но тем не менее... Наверное, используешь и прочие модули...

Вообще, я в полемику ударился, видимо. В начале TUser © (10.02.04 18:33) [1] все было сказано... Не помогает?


 
VID   (2004-02-10 21:20) [12]

я внимательно прочитал Help по LoadLibrary, и странно получается. там ясно написано что перво-наперво приложение ищет вызываемую DLL в папку откуда была запущена программа.

Тогда почему же когда я запукал прогу в вин98, и в папке проги были нужные ей библиотеки, програ всё равно подключала аналогичные библиотеки из папки SYSTEM ?


the function searches for the file in the following sequence:

1. The directory from which the application loaded.
2. The current directory.
3. Windows 95: The Windows system directory. Use the GetSystemDirectory function to get the path of this directory.


Из этой вырезки видно, что в папке System програ ищет dll аж в третью очередь (случай для win95/98). И это есть вопрос № 1.

А теперь ещё:
я в dpr-файле написал вот такой код:

{$R *.RES}

Var RichEd20:Cardinal = 0;
RichEd32:Cardinal = 0;

Procedure InitDlls;
begin
RichEd20 := LoadLibrary(Pchar(IncludeTrailingBackslash(ExtractFilePath(ParamStr(0))+"riched20.dll"));
RichEd32 := LoadLibrary(Pchar(IncludeTrailingBackslash(ExtractFilePath(ParamStr(0)))+"riched32.dll"));
end;

Procedure FreeDlls;
begin
{Точка1}IF RichEd20 <> 0 then try FreeLibrary(RichEd20) except end;
IF RichEd32 <> 0 then try FreeLibrary(RichEd32) except end;
end;

begin
{Точка 0}InitDlls;
try
Application.Initialize;
Application.Title := "";
Application.CreateForm(TForm1, Form1);
Application.CreateForm(TCREForm, CREForm);
Application.Run;
finally
FreeDlls;
end;
end.


нужные две dLL-были в одной папке с прогой. Так вот что интересно, обе эти библиотеки были уже подключены (их невозможно было удалить), ещё до выполнения {точки 0}... по сути получается что вся канитель с InitDlls идёт коту под хвост...
по сути получается что LoadLibrary используемый в InitDll возвращает Handle уже подключённой библиотеки и просто инкрементирует счётчик обращений к библиотеки.

тогда я не понимаю, где ещё раньше надо ВРУЧНУЮ подключать dll ??? в главной форме исользуется RxRichEdit, richedit и тонна других юнитов...



Страницы: 1 вся ветка

Форум: "Основная";
Текущий архив: 2004.02.25;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.49 MB
Время: 0.036 c
3-79675
Zorik
2004-01-30 13:51
2004.02.25
DLL и приложение


1-79781
MadGhost
2004-02-04 21:52
2004.02.25
можно ли неактивное окно из панели задач открыть по таймеру?


1-79728
ceval
2004-02-14 12:17
2004.02.25
программа с использыванием dbf файлов


1-80017
Developer
2004-02-13 08:59
2004.02.25
Объект автоматизации с поддержкой определенного COM-интерфейса


1-79950
Khabibulin
2004-02-13 21:25
2004.02.25
Открыть с помощью ...





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский