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

Вниз

Как убить загружающуюся DLL на этапе запуска программы?   Найти похожие ветки 

 
Aleksandr   (2002-04-25 14:21) [0]

Программа поддерживает несколько языков, и настраивается так, чтобы эту поддержку можно было отключить. Но есть одно неприятное "но". Если в папке программы в момент запуска находится ресурсная библиотека с расширением RUS, то прога начинает грузить ее еще до инициализации, и, соответственно, доступ к файлу на удаление становится запрещен. Как-нить можно сделать, чтобы программа не умничала и не пыталась автоматом делать эти загрузки?


 
Digitman   (2002-04-25 14:49) [1]

Программа-то, которая "умничает" - твоя ? Аль чужая, без исходников ?


 
Aleksandr   (2002-04-25 15:06) [2]

Моя, с исходником :). Код исходика проекта:

begin
ATILang:=F.ReadInteger("Main","Language",lgRus);
cDir:=F.ReadString("Paths","MainDir",GetCurrentDir);
NeedLanguage:=F.ReadBool("Main","NeedLanguage",true);
if cDir<>CorrectPath(GetCurrentDir) then begin
SetCurrentDir(cDir);
MainDir:=cDir
end;
OldLang:=ATILang;
{$IFNDEF Local}
if (CheckLangFiles("")<>clNothing) AND (NeedLanguage) then begin
NeedLanguage:=true;
case ATILang of
0 : LoadNewResourceModule($00000419);
1 : LoadNewResourceModule($00000409);
end;
end
else begin
NeedLanguage:=false;
ATILang:=lgRus;
if FileExists(CorrectPath(MainDir)+"atinfo.rus") then
DeleteFile(PChar(CorrectPath(MainDir)+"atinfo.rus"));
if FileExists(CorrectPath(MainDir)+"atinfo.enu") then
DeleteFile(PChar(CorrectPath(MainDir)+"atinfo.enu"))
end;
{$ELSE}
NeedLanguage:=false;
{$ENDIF}
F.CloseKey;
F.RootKey:=HKey_CURRENT_USER;
if F.OpenKey(ATITRegRootKey,true) then begin
F.WriteBool("Main","NeedLanguage",NeedLanguage);
F.CloseKey
end;
G.Free;
F.CloseKey;
F.Free;
Application.Initialize;
Application.ShowHint := True;
if ActivatePrevInstance("TMainForm","") then begin
Application.Terminate;
Exit
end;
Application.CreateForm(TATITMainForm, ATITMainForm);
ATITMainForm.Show;
Application.Run
end.

Даже если я попытаюсь удалить файл самой первой строчкой, он усе равно уже будет запрещен.


 
Digitman   (2002-04-25 17:55) [3]

Вот это

LoadNewResourceModule()

что такое ? Где и как это определено ?


 
Aleksandr   (2002-04-26 10:50) [4]

LoadNewResourceModule() - это борландовская фича из демки по многоязыковой поддержке. Она, кстати, и не вызывается в тех случаях, когда язык не нужен. И вообще она, получается, не слишком нужна при загрузке - если программа текущий язык по умолчанию подгружает. Я ее использую, в основном, при смене "на лету", без перезапуска программы.


 
Digitman   (2002-04-26 11:04) [5]

Ну, скорее всего, *.rus у тебе статически загружается. Замени статическую загрузку на динамическую (по некоторому определенному тобой условию - нужна или не нужна она) - и всех делов


 
emelyanov   (2002-04-26 11:18) [6]

Насколько я знаю библитека с расширением соотв. текущей языковой настройке грузится борландами по умолчанию вызываясь где-то после инициализации модулей и до передачи управления коду проекта написанному разработчиком. Как отключить не знаю. Смотреть надо System, SysInit (по-моему это делает процедура LoadResourceModule)


 
PVOzerski   (2002-04-26 11:20) [7]

Связанное с этим же соображение. Я когда-то пробовал запустить прогу, скомпилированную в D3,
под Win"3.11+Win32s. В проге, по сути дела, ничего не было: MessageBox(0,"Hello","Hello",0) - безо
всякой VCL и безо всяких инициализирующихся модулей, кроме System. И ведь, зараза, эта прога
(назовём её prog.exe) искала последовательно prog.enu, потом prog.en, и лишь убедившись в их
отсутствии, выдавала своё Hello. Спрашивается: кто на самом деле искал эти файлы - код
инициализации в модуле system или сама Win32s, находя какую-то информацию в заголовке файла
или какой-то стандартный ресурс? IMHO, описанная мной ситуация прямо связана с вопросом
Aleksandr"а. В том и в другом случае происходит непрошеный поиск языковых ресурсов, только
описанная мной ситуация более простая.


 
Aleksandr   (2002-04-26 11:37) [8]

2 Digitman
Интересно, а как статическую загрузку сменить на динамическую? :(


 
Digitman   (2002-04-26 11:54) [9]

>Aleksandr
Использовать явно LoadLibrary() и GetProcAddress() вместо декларации импортируемых из DLL в разделах описаний типов


 
PVOzerski   (2002-04-26 12:00) [10]

2 Digitman:
И переделку эту внести в модуль system (смайлик - по желанию, поскольку, возможно,
это и есть единственное решение).



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

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

Наверх





Память: 0.47 MB
Время: 0.01 c
1-26138
CoRpse
2002-04-24 16:36
2002.05.09
Помогите найти!!!


4-26286
Frogkiller
2002-02-28 23:06
2002.05.09
Как считать значение переменной в другом потоке?


4-26308
Афоня
2002-03-05 11:42
2002.05.09
Перехват сообщения вывода строки из консольного приложения


6-26203
Lider
2002-02-22 01:54
2002.05.09
Проксяк


1-26190
perov
2002-04-25 09:39
2002.05.09
Сравнение двух строк





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский