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

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

Вернуться   Форум программистов > Низкоуровневое программирование > Win Api
Регистрация

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 19.07.2007, 12:48   #1
malor
Форумчанин
 
Регистрация: 23.05.2007
Сообщений: 151
По умолчанию FindWindow не нашел окна, а ShellExecute возвращает ERROR_PATH_NOT_FOUND

Функция ShellExecute возвращает ERROR_PATH_NOT_FOUND(числовое значение - 2), хотя путь указан верный
в переданных ей пораметрах.
Код:
procedure TFMain.TimerFindWindowTimer(Sender: TObject);
var
  err:integer;
begin
  if FindWindow(nil, 'MyWindow') = 0 then
    err := ShellExecute(handle, 'Open', PChar(MyProgaEXE), nil, nil, sw_restore);
1.Программа, из которой приведен отрывок, один раз она запускает прогу, указанную в пути MyProgaEXE, а потом(согласно таймеру), хотя уже экземпляр запущен и работат,
FindWindow не обнаруживает его, всед за чем дело доходит до строки с функцией ShellExecute. Почему FindWindow не находит окна с
заголовком MyWindow?
2.Почему ShellExecute позвращает двойку? Ведь если б путь был неправилен, то и первый экземпляр не запустился бы.

Delphi 7
malor вне форума Ответить с цитированием
Старый 19.07.2007, 13:42   #2
_SERGEYX_
Участник клуба
 
Аватар для _SERGEYX_
 
Регистрация: 07.07.2007
Сообщений: 1,518
По умолчанию

Цитата:
FindWindow не обнаруживает его, всед за чем дело доходит до строки с функцией ShellExecute.
Почему ShellExecute позвращает двойку?
Ну, почему не обнаруживает. Если бы не обнаружил, то вернул бы ноль.

Я проверил вот этот код.. все ОК, Блокнот запускается только один раз.
Код:
var err:integer;
begin
  if FindWindow(nil, 'Безымянный - Блокнот') = 0 then
  err := ShellExecute(handle, 'Open', 'notepad.exe', nil, nil, sw_restore);
end;
Если уже совсем ничего не получается можно попробовать проверить запущена ли программа более идиотским способом:
Код:
uses 
  Psapi, tlhelp32; 

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.Button1Click(Sender: TObject); 
begin 
  if EXE_Running('Notepad.exe', False) then 
    ShowMessage('Запущен') 
  else 
    ShowMessage('Не запущен'); 
end;
Второй код проверил. Работает.
_SERGEYX_ вне форума Ответить с цитированием
Старый 19.07.2007, 15:15   #3
malor
Форумчанин
 
Регистрация: 23.05.2007
Сообщений: 151
По умолчанию

>>Ну, почему не обнаруживает. Если бы не обнаружил, то вернул бы ноль.

Так FindWindow и вернул ноль! Благодаря чему программа и попала на строку с функцией ShellExecute.
malor вне форума Ответить с цитированием
Ответ


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

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
FindWindow Comer_Jus Win Api 7 29.11.2008 10:17
Нашел вирус! Удалял и через антивирисник-бесполезно! При перезагрузке находится снова! MihShev Свободное общение 5 04.05.2008 16:01
FILD, FSQRT, FSUBP, FISTP - не нашел по ним справки Д'якон Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 7 21.12.2007 17:18
Как сделать чтобы дочерние окна в MDI-приложениях были вне главного окна??? dimonchuk Общие вопросы Delphi 1 11.08.2007 12:13
Вопрос про функцию FindWindow Dromok Общие вопросы Delphi 3 12.02.2007 23:00