Форум: "Основная";
Текущий архив: 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.006 c