![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Не могу разобраться с ExtractFilePath(Application.ExeName) [D7, XP]
Феникс © (2006-11-28 16:04:00)При первом обращении ExtractFilePath(Application.ExeName) показывает реальный путь к моему EXE, но только программа работала с OpenDialog, при следующем обращении ExtractFilePath(Application.ExeName) показывает мне путь OpenDialog а не моего EXE. Как ExtractFilePath(Application.ExeName) использовать во "второй" раз? Спасибо за помощь новичку...
vain (2006-11-28 21:06:00) [1]Обычно запускают программы с помощью CraeteProcess, а там, почитай справку, есть параметр:
LPVOID lpEnvironment, // pointer to new environment block
Вот.
А если указать вместо параметра nil, то переменные окружения остануться прежними, то есть, как и у вызывающей программы. Из-за этого и может случиться неразбириха.
В общем, мой тебе совет: используй CreateProcess, почитай по нему справку и постарайся не напутать с переменными сред. Имхо, тогда должно работать.
Reindeer Moss Eater (2006-11-28 17:21:00) [2]Поднял свои старые исходники с запуском одной программы из другой.
Вызов выглядит так:
CreateProcess('mysecondconsole.exe',
'mysecondconsole.exe myparam',
......
Вспомнил, что в случае если опускался первый параметр (что допускается справкой), то получалась та же самая чехарда с ParamStr во втором приложении.
Видимо ShellExecute используя CreateProcess поступает так же.
Reindeer Moss Eater (2006-11-28 17:12:00) [3]В общем надо читать справку по CreateProcess и примечания про первые два её параметра.
Reindeer Moss Eater (2006-11-28 17:07:00) [4]Правильное имя будет в ParamStr(1).
Когда-то давно сталкивался с таким феноменом, но уже не помню в чем там был прикол.
Феникс (2006-11-28 17:05:00) [5]Path_:=ExtractFilePath(Application.ExeName);
BatFilename:='del.bat';
AssignFile(BatFile, BatFilename);
Rewrite(BatFile);
SS:=' :Repeat '+#13#10+
' del '+Path_+ExtractFileName(Application.ExeName)+#13#10+
' if exist "'+ExtractFileName(Application.ExeName)+'" goto Repeat '+#13#10+
' copy '+s+' '+ExtractFilePath(Application.ExeName)+#13#10+s+#13#10;
if FileExists(ReadIni('PATH','RefreshPath')+'\File.txt')=True
then
else begin
HSShowMessage('Отсутсвует файл File.txt');
EXIT;
end;
AssignFile(SpisokFile,ReadIni('PATH','RefreshPath')+'\File.txt');
Reset(SpisokFile);
while not EOF(SpisokFile) do
begin
ReadLn(SpisokFile,Sfile);
if Sfile<>ExtractFileName(Application.ExeName)
then begin
if FileExists(Path_+Sfile)=True then Win32Check(DeleteFile(PChar(Path_+Sfile)));
Win32Check(CopyFile(PChar(ReadIni('PATH','RefreshPath')+'\'+Sfile), PChar(Path_+Sfile), True));
end;
end;//while not EOF(InpFile) do
CloseFile(SpisokFile);
WriteLn(BatFile, SS); // записываем строку
CloseFile(BatFile);
Path_EXE:=PChar(Path_+'\del.bat' );
ShellExecute(Handle, nil,Path_EXE,nil,nil,SW_RESTORE);
Программа создает bat-файл в котором она удаляет EXE, копирует нужные файлы из пути ReadIni('PATH','RefreshPath'), потом запускает EXE.
Так вот во втором запуске EXE - Path_:=ExtractFilePath(Application.ExeName) - показывает путь ReadIni('PATH','RefreshPath')...
Reindeer Moss Eater (2006-11-28 16:59:00) [6]а я просто в onCreate формы глобально сохраняю путь до ехе-шника и не маюсь больше такими вопросами.
не будет же ехе-шник переезжать во время выполнения программы в самом деле?
МудрО.
Останется только надеяться на то, что эту глобальную переменную никто не испортит.
кстати путь к ехешнику также можно достать из нулевого параметра к командной строке. он всегда там есть :)
TApplication = class ...
...
property ExeName: string read GetExeName;
...
function TApplication.GetExeName: string;
begin
Result := ParamStr(0);
end;
Barloggg (2006-11-28 16:53:00) [7]кстати путь к ехешнику также можно достать из нулевого параметра к командной строке. он всегда там есть :)
Игорь Шевченко (2006-11-28 16:51:00) [8]Феникс © (28.11.06 16:49) [7]
А как получаешь Path_EXE ? Ты не стесняйся многословности, рассказывай
Barloggg (2006-11-28 16:51:00) [9]а я просто в onCreate формы глобально сохраняю путь до ехе-шника и не маюсь больше такими вопросами.
не будет же ехе-шник переезжать во время выполнения программы в самом деле?
Dmitrij_K (2006-11-28 16:51:00) [10]ExtractFilePath(Application.ExeName) в EXE-2 я показывает где находится EXE-2
Если подругому, то см. [1]
Феникс (2006-11-28 16:49:00) [11]>>Игорь Шевченко
ShellExecute(Handle, nil,Path_EXE,nil,nil,SW_RESTORE);
Игорь Шевченко (2006-11-28 16:33:00) [12]
> из него я запускаю другой EXE-2.
Вот тут собака и порылась. Как запускаешь ?
Феникс (2006-11-28 16:29:00) [13]Наверное не все написал...
У меня есть EXE-1 в котором я вызываю ExtractFilePath(Application.ExeName).Потом в нем идет обращение по разным путям, после чего, из него я запускаю другой EXE-2.
В EXE-2 я вызываю ExtractFilePath(Application.ExeName). Он мне показывает последний путь по которому я обращался из программы EXE-1.
Вот теперь вроде все написал...
Reindeer Moss Eater (2006-11-28 16:10:00) [14]От этой опции поведение ExtractFilePath(Application.ExeName) не изменится.
clickmaker (2006-11-28 16:09:00) [15]GetCurrentDir может вернуть другое после вызова OpenDialog, если у него не стоит флажок NoChangeDir, но никак не ExtractFilePath
umbra (2006-11-28 16:08:00) [16]в параметрах OpenDialog на до выставить в true опцию ofNoChangeDir
Reindeer Moss Eater (2006-11-28 16:07:00) [17]При любом количестве вызовов ExtractFilePath(Application.ExeName) вернет одно и то же.
У тебя оптический обман.