Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 01.12.2011, 23:02   #1
iLnes
Пользователь
 
Регистрация: 07.10.2011
Сообщений: 66
По умолчанию Проверка и запуск файла.

Что за программа: Берет адрес из Edit1 до файла, проверяет, если он запущен, то сидит молча, если он не запущен, то запускает его. Работало все норм, пока не добавил Edit1 (то есть работал напрямую с именем файла в папке), как добавил, пришлось менять код и теперь игнорится проверка. То есть, он проверяет, запущена программа, и даже если она запущена уже, запускает еще одну копию и так бесконечное количество раз. Кто пожскажет, что не так?) Сам код:
Код:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, Psapi, tlhelp32, StdCtrls, ShellAPI, ExtCtrls, sSkinManager,
  Buttons, sSpeedButton, sEdit, sDialogs;

type
  TForm1 = class(TForm)
    Timer1: TTimer;
    sSkinManager1: TsSkinManager;
    sEdit1: TsEdit;
    sSpeedButton1: TsSpeedButton;
    sOpenDialog1: TsOpenDialog;
    sSpeedButton2: TsSpeedButton;
    procedure Timer1Timer(Sender: TObject);
    procedure sSpeedButton1Click(Sender: TObject);
    procedure sSpeedButton2Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure CreateWin9xProcessList(List: TstringList);
var
  hSnapShot: THandle;
  ProcInfo: TProcessEntry32;
begin
  if List = nil then Exit;
  hSnapShot := CreateToolHelp32Snapshot(TH32CS_SNAPPROCESS, 0);
  if (hSnapShot <> THandle(-1)) then
  begin
    ProcInfo.dwSize := SizeOf(ProcInfo);
    if (Process32First(hSnapshot, ProcInfo)) then
    begin
      List.Add(ProcInfo.szExeFile);
      while (Process32Next(hSnapShot, ProcInfo)) do
        List.Add(ProcInfo.szExeFile);
    end;
    CloseHandle(hSnapShot);
  end;
end;

procedure CreateWinNTProcessList(List: TstringList);
var
  PIDArray: array [0..1023] of DWORD;
  cb: DWORD;
  I: Integer;
  ProcCount: Integer;
  hMod: HMODULE;
  hProcess: THandle;
  ModuleName: array [0..300] of Char;
begin
  if List = nil then Exit;
  EnumProcesses(@PIDArray, SizeOf(PIDArray), cb);
  ProcCount := cb div SizeOf(DWORD);
  for I := 0 to ProcCount - 1 do
  begin
    hProcess := OpenProcess(PROCESS_QUERY_INFORMATION or
      PROCESS_VM_READ,
      False,
      PIDArray[I]);
    if (hProcess <> 0) then
    begin
      EnumProcessModules(hProcess, @hMod, SizeOf(hMod), cb);
      GetModuleFilenameEx(hProcess, hMod, ModuleName, SizeOf(ModuleName));
      List.Add(ModuleName);
      CloseHandle(hProcess);
    end;
  end;
end;

procedure GetProcessList(var List: TstringList);
var
  ovi: TOSVersionInfo;
begin
  if List = nil then Exit;
  ovi.dwOSVersionInfoSize := SizeOf(TOSVersionInfo);
  GetVersionEx(ovi);
  case ovi.dwPlatformId of
    VER_PLATFORM_WIN32_WINDOWS: CreateWin9xProcessList(List);
    VER_PLATFORM_WIN32_NT: CreateWinNTProcessList(List);
  end
end;

function EXE_Running(FileName: string; bFullpath: Boolean): Boolean;
var
  i: Integer;
  MyProcList: TstringList;
begin
  MyProcList := TStringList.Create;
  try
    GetProcessList(MyProcList);
    Result := False;
    if MyProcList = nil then Exit;
    for i := 0 to MyProcList.Count - 1 do
    begin
      if not bFullpath then
      begin
        if CompareText(ExtractFileName(MyProcList.Strings[i]), FileName) = 0 then
          Result := True
      end
      else if CompareText(MyProcList.strings[i], FileName) = 0 then Result := True;
      if Result then Break;
    end;
  finally
    MyProcList.Free;
  end;
end;

procedure TForm1.sSpeedButton1Click(Sender: TObject);
begin
if sOpenDialog1.Execute then
 begin
 sEdit1.Text := sOpenDialog1.FileName;
 end;
end;

procedure TForm1.Timer1Timer(Sender: TObject);
begin
  if EXE_Running(sOpenDialog1.FileName, False) then
   Sleep(100)
  else
    ShellExecute(Handle, nil, PAnsiChar(sOpenDialog1.FileName), nil, nil, SW_SHOW);
end;

procedure TForm1.sSpeedButton2Click(Sender: TObject);
begin
 Timer1.Enabled := True;
end;

end.
iLnes вне форума Ответить с цитированием
Старый 01.12.2011, 23:10   #2
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

ну видимо потому что в таймере вы берете имя не из эдита.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 01.12.2011, 23:35   #3
iLnes
Пользователь
 
Регистрация: 07.10.2011
Сообщений: 66
По умолчанию

Цитата:
Сообщение от Пепел Феникса Посмотреть сообщение
ну видимо потому что в таймере вы берете имя не из эдита.
Пробывал Edit = та же шляпа.
iLnes вне форума Ответить с цитированием
Старый 01.12.2011, 23:40   #4
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

В EXE_Running передаете полное имя файла, а второй параметр False. Не в этом ли проблема?
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 02.12.2011, 00:01   #5
iLnes
Пользователь
 
Регистрация: 07.10.2011
Сообщений: 66
По умолчанию

Цитата:
Сообщение от Аватар Посмотреть сообщение
В EXE_Running передаете полное имя файла, а второй параметр False. Не в этом ли проблема?
Да, действительно. Спасибо большое Не доглядел)
iLnes вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Проверка архивов rar, zip, arj, 7z на наличие файла используя cmd-файла cerberochek Win Api 5 05.10.2011 19:26
Запуск стороннего файла CraftR14 Общие вопросы Delphi 8 17.04.2010 18:05
Запуск файла из Excel Фернан Microsoft Office Excel 6 29.01.2009 22:51
запуск файла С# TaTT DoGG Общие вопросы .NET 10 24.11.2008 23:05
Запуск одной проги при помощи второй (проверка) Yurk@ Общие вопросы Delphi 9 28.12.2007 19:48