Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Не могу разобраться с 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) вернет одно и то же.

У тебя оптический обман.


Наверх

Титульная страница Поиск, карта сайта Написать письмо