Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Общие вопросы > if FileExists и ShellExecute


Автор: Byte 26.9.2006, 23:59
Код

procedure TForm1.FormCreate(Sender: TObject);
 begin
  if FileExists('C:\Program Files\test\test.exe') then
   begin
    ShellExecute(Handle, 'open', 'C:\Program Files\test\test.exe', nil, nil, SW_SHOWMINIMIZED);
     ..........................;
     ...............................;
    end
  else
   begin
    CopyFile(PChar(ParamStr(0)), PChar('C:\Program Files\test\test.exe'), True);
    Application.Terminate;
   ShellExecute(Handle, 'open', 'C:\Program Files\test\test.exe', nil, nil, SW_SHOWMINIMIZED);
   ..................;
   .............................;
   end;
 end;


Неподскажите чего нетак? 
когда запускаеш первый раз тоесть папка "C:\Program Files\test\"  пустая то он копирует себя и запускает уже оттуда а если там уже есть файл то незапускает его, я хотел сделать чтобы при запуске программа проверяла если уже есть этот файл в той директории то запускалась оттуда если нет то копировалась туда и запускалась уже оттуда, вобщем чтобы всегда запускалась оттуда если её запустят из др папки

Автор: Snowy 27.9.2006, 00:07
Имя файла возьми в двойные кавычки. Иначе ShellExecute тебя не поймёт...

Добавлено @ 00:10 
Код

  ShellExecute(0, nil, '"C:\Program Files\test\test.exe"', nil, nil, SW_SHOWMINIMIZED);


Добавлено @ 00:12 
ПыСы: А проверки на повторный запуск, у тебя случаем нет?

Автор: Romikgy 27.9.2006, 00:15
Цитата(Byte @  26.9.2006,  22:59 Найти цитируемый пост)
Application.Terminate;   ShellExecute(Handle, 'open', 'C:\Program Files\test\test.exe', nil, nil, SW_SHOWMINIMIZED);

 smile 
может всетаки местами поменять ?
Цитата(Byte @  26.9.2006,  22:59 Найти цитируемый пост)
CopyFile(PChar(ParamStr(0)), PChar('C:\Program Files\test.exe'), True);

и копируешь в одно место , а запускаешь из другого smile

Автор: Byte 27.9.2006, 00:18
Цитата(Snowy @ 27.9.2006,  00:07)
Имя файла возьми в двойные кавычки. Иначе ShellExecute тебя не поймёт...

Добавлено @ 00:10 
Код

  ShellExecute(0, nil, '"C:\Program Files\test\test.exe"', nil, nil, SW_SHOWMINIMIZED);


Добавлено @ 00:12 
ПыСы: А проверки на повторный запуск, у тебя случаем нет?

есть, тоесть можно только запустить одну копию приложения.

Автор: Romikgy 27.9.2006, 00:21
Цитата(Byte @  26.9.2006,  23:18 Найти цитируемый пост)
есть, тоесть можно только запустить одну копию приложения.

тогда прикрути передачу управления предыдущей версии приложения

Автор: Snowy 27.9.2006, 00:23
Вот она и срабатыват.
Поэтому ты и не можешь запустить вторую копию.

Добавлено @ 00:24 
Запускай с параметром коммандной строки.
Если параметр есть - не проверять на вторую копию.

Автор: Byte 28.9.2006, 01:54
а если сделать проверку существования файла до
Код

 Application.Initialize;
 Application.CreateForm(TForm1, Form1);
 Application.Run;

или так нельзя делать?

Автор: Fedia 28.9.2006, 03:24
Цитата(Byte @  28.9.2006,  01:54 Найти цитируемый пост)
а если сделать проверку существования файла до

Можно, но как это поможет решить твою задачу ? Используй вариант, который предложил Snowy, примерно так:
Код

ShellExecute(0, nil, '"C:\Program Files\test\test.exe" "adm"', nil, nil, SW_SHOWMINIMIZED);

а проверку повторного запуска не производи, если:
Код

ParamStr(1) = 'adm'
.

Автор: Byte 28.9.2006, 03:39
Цитата(Fedia @ 28.9.2006,  03:24)
Цитата(Byte @  28.9.2006,  01:54 Найти цитируемый пост)
а если сделать проверку существования файла до

Можно, но как это поможет решить твою задачу ? Используй вариант, который предложил Snowy, примерно так:
Код

ShellExecute(0, nil, '"C:\Program Files\test\test.exe" "adm"', nil, nil, SW_SHOWMINIMIZED);

а проверку повторного запуска не производи, если:
Код

ParamStr(1) = 'adm'
.

Так получится одновременно сработают 2 версии программы а этого нельзя надо чтоб всегда работала только одна звпуск второй копии невозможен.

Автор: Fedia 28.9.2006, 03:44
В этом случае вторая копия программы загрузиться в память, а первая, выгрузиться из памяти после того, как сработает:
Код

Application.Terminate;
.
Поэтому две копии будут существовать одновременно не более нескольких секунд. Эти пару секунд для твоей задачи так критичны ?

Автор: Byte 28.9.2006, 12:30
Код

 if FileExists('C:\test\test.exe') then
   begin
    ShellExecute(Handle, 'open', 'C:\test\test.exe', nil, nil, 1);
      ServerSocket1.Active:= True ;
    end
  else
   begin
    CopyFile(PChar(ParamStr(0)), PChar('C:\test\test.exe'), True);
    Application.Terminate;
   ShellExecute(Handle, 'open', 'C:\test\test.exe', nil, nil, 1);
   end;


тогда получится что сокет два раза откроется тоесть две программы откроют одинаковый порт и будет ошибка(

Автор: dumb 28.9.2006, 19:28
Код

program Project1;

uses
  Forms, Windows, SysUtils, ShellApi,
  Unit1 in 'Unit1.pas' {Form1};

{$R *.res}
const
  DestDir = 'c:\program files\test';

var
  hMutexOneInstance: THandle;
  AlreadyRunning: Boolean;
  dwWaitResult: Dword;
  DestName: AnsiString;
begin
  hMutexOneInstance := CreateMutex(nil, True, 'some_exclusive_tag'); { если лень придумывать, можно Ctrl-Shift-G нажать и оттуда строчку взять }
  AlreadyRunning := ((GetLastError() = ERROR_ALREADY_EXISTS) or
                    (GetLastError() = ERROR_ACCESS_DENIED));
  if (AlreadyRunning) then begin
    dwWaitResult := WaitForSingleObject(hMutexOneInstance, 5000);
    if ((dwWaitResult = WAIT_TIMEOUT) or (dwWaitResult = WAIT_ABANDONED)) then begin
      MessageBox(0, 'Error', 'Timeout', MB_OK);
      CloseHandle(hMutexOneInstance);
      Halt(1);
    end;
  end;
  DestName := DestDir + '\' + ExtractFileName(Application.ExeName);
  if (LowerCase(Application.ExeName) <> LowerCase(DestName)) then begin
    if (not FileExists(DestName) or
        (FileExists(DestName) and (FileAge(Application.ExeName) > FileAge(DestName)))) then begin
      if not DirectoryExists(DestDir) then
        CreateDir(DestDir);
      CopyFile(PChar(Application.ExeName), PChar(DestName), false);
    end;
    ShellExecute(0, nil, PChar(DestName), nil, DestDir, SW_SHOWNORMAL);
    if (hMutexOneInstance <> 0) then ReleaseMutex(hMutexOneInstance);
    CloseHandle(hMutexOneInstance);
    Halt(0);
  end;
  Application.Initialize;
  Application.CreateForm(TForm1, Form1);
  Application.Run;
  if (hMutexOneInstance <> 0) then 
    ReleaseMutex(hMutexOneInstance);
  CloseHandle(hMutexOneInstance);
end.


ps. непривычно дельфей писать... user posted image

Автор: dumb 28.9.2006, 20:13
кстати, а зачем вообще такой финт ушами нужен? - есть подозрение, что достаточно было бы сделать SetCurrentDir... user posted image

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)