Модераторы: Poseidon, Snowy, bems, MetalFan
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> if FileExists и ShellExecute 
:(
    Опции темы
Byte
Дата 26.9.2006, 23:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 11
Регистрация: 26.9.2006

Репутация: нет
Всего: нет



Код

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\"  пустая то он копирует себя и запускает уже оттуда а если там уже есть файл то незапускает его, я хотел сделать чтобы при запуске программа проверяла если уже есть этот файл в той директории то запускалась оттуда если нет то копировалась туда и запускалась уже оттуда, вобщем чтобы всегда запускалась оттуда если её запустят из др папки

Это сообщение отредактировал(а) Byte - 27.9.2006, 00:19
PM MAIL   Вверх
Snowy
Дата 27.9.2006, 00:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 11363
Регистрация: 13.10.2004
Где: Питер

Репутация: 192
Всего: 484



Имя файла возьми в двойные кавычки. Иначе ShellExecute тебя не поймёт...

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

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


Добавлено @ 00:12 
ПыСы: А проверки на повторный запуск, у тебя случаем нет?
PM MAIL   Вверх
Romikgy
Дата 27.9.2006, 00:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Любитель-программер
****


Профиль
Группа: Участник Клуба
Сообщений: 7326
Регистрация: 11.5.2005
Где: Porto Franco Odes sa

Репутация: 26
Всего: 146



Цитата(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


--------------------
Владение русской орфографией это как владение кунг-фу — истинные мастера не применяют его без надобности. 
smile

PM   Вверх
Byte
Дата 27.9.2006, 00:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 11
Регистрация: 26.9.2006

Репутация: нет
Всего: нет



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

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

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


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

есть, тоесть можно только запустить одну копию приложения.
PM MAIL   Вверх
Romikgy
Дата 27.9.2006, 00:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Любитель-программер
****


Профиль
Группа: Участник Клуба
Сообщений: 7326
Регистрация: 11.5.2005
Где: Porto Franco Odes sa

Репутация: 26
Всего: 146



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

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


--------------------
Владение русской орфографией это как владение кунг-фу — истинные мастера не применяют его без надобности. 
smile

PM   Вверх
Snowy
Дата 27.9.2006, 00:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 11363
Регистрация: 13.10.2004
Где: Питер

Репутация: 192
Всего: 484



Вот она и срабатыват.
Поэтому ты и не можешь запустить вторую копию.

Добавлено @ 00:24 
Запускай с параметром коммандной строки.
Если параметр есть - не проверять на вторую копию.
PM MAIL   Вверх
Byte
Дата 28.9.2006, 01:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 11
Регистрация: 26.9.2006

Репутация: нет
Всего: нет



а если сделать проверку существования файла до
Код

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

или так нельзя делать?
PM MAIL   Вверх
Fedia
Дата 28.9.2006, 03:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 465
Регистрация: 2.8.2006
Где: первым встречаю р ассвет

Репутация: 8
Всего: 13



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

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

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

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

ParamStr(1) = 'adm'
.


--------------------
Накануне решающей битвы
Я иду, и надеждою зыбкой
Озаряется эта дорога,
Я мечтаю увидеть улыбку
На лице победившего Бога…
PM MAIL ICQ   Вверх
Byte
Дата 28.9.2006, 03:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 11
Регистрация: 26.9.2006

Репутация: нет
Всего: нет



Цитата(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 версии программы а этого нельзя надо чтоб всегда работала только одна звпуск второй копии невозможен.
PM MAIL   Вверх
Fedia
Дата 28.9.2006, 03:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 465
Регистрация: 2.8.2006
Где: первым встречаю р ассвет

Репутация: 8
Всего: 13



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

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


--------------------
Накануне решающей битвы
Я иду, и надеждою зыбкой
Озаряется эта дорога,
Я мечтаю увидеть улыбку
На лице победившего Бога…
PM MAIL ICQ   Вверх
Byte
Дата 28.9.2006, 12:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 11
Регистрация: 26.9.2006

Репутация: нет
Всего: нет



Код

 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;


тогда получится что сокет два раза откроется тоесть две программы откроют одинаковый порт и будет ошибка(
PM MAIL   Вверх
dumb
Дата 28.9.2006, 19:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


sceloglauxalbifacies
****


Профиль
Группа: Экс. модератор
Сообщений: 2929
Регистрация: 16.6.2006

Репутация: 13
Всего: 158



Код

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

PM MAIL   Вверх
dumb
Дата 28.9.2006, 20:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


sceloglauxalbifacies
****


Профиль
Группа: Экс. модератор
Сообщений: 2929
Регистрация: 16.6.2006

Репутация: 13
Всего: 158



кстати, а зачем вообще такой финт ушами нужен? - есть подозрение, что достаточно было бы сделать SetCurrentDir... user posted image
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Общие вопросы"
SnowyMetalFan
bemsPoseidon
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0649 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.