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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 15.02.2010, 21:31   #1
besserebrenik
 
Регистрация: 23.03.2009
Сообщений: 6
По умолчанию WaitForSingleObject

Задача у меня следующая.. получить список процессов, получить имена модулей. Среди них определить есть ли calc.exe и если такой существует текущее приложение перевести в режим ожидания, пока работает calc.exe. (это лаба)

Вот код
PHP код:
var
  
procesess: array[0..$FFFof DWORD
  
mem: array[0..$FFFof DWORD;
  
icountcmcardinal;
  
phTHandle;
  
ModName: array[0..MAX_PATHof char;
  
mhHMODULE;
  List: 
TStringList;
begin
  
if not EnumProcesses(@procesessSizeOf(procesess), countthen
    
Exit
  else
  
begin
    
List := TStringList.Create;
    for 
i:=0 to count div 4 do
    
begin
      ph 
:= OpenProcess(PROCESS_QUERY_INFORMATION or PROCESS_VM_READfalseprocesess[i]);
      if 
ph 0 then
      begin
        EnumProcessModules
(ph, @mhsizeOf(mh), cm);
       
// GetModuleFileNameEx(ph, mh, ModName, sizeof(ModName));
        
GetModuleBaseName(phmhModNamesizeOf(ModName));
        List.
Add(string(ModName));
        
CloseHandle(ph);
      
end;
    
end;
  
end;
  
Memo1.Lines.AddStrings(List);
  for 
:= 0 to (List.Count 1) do
  
begin
    
if List.Strings[i] = 'calc.exe' then
    begin
      ShowMessage
('Ok');
      
ph := OpenProcess(PROCESS_QUERY_INFORMATION or PROCESS_VM_READfalseprocesess[i]);
      
WaitForSingleObject(phINFINITE);
    
end;
  
end;
end
Вообщем налицо дескриптор процесса ph, но WaitForSingleObject не работает.. Еще если в цикле выводить ph, то на выходе одно и тоже значение

Подскажите в чем ошибка


Только что додумался, заменить
PHP код:
OpenProcess(PROCESS_QUERY_INFORMATION or PROCESS_VM_READfalseprocesess[i]); 
на
PHP код:
OpenProcess(PROCESS_ALL_ACCESSfalseprocesess[i]); 
Стало приложение "висеть" и ждать закрытия калькулятора! Но при закрытии калькулятора все равно продолжает висеть..


Все, вопрос решил. Ошибка была в нарушении соответствия индекс массива и индекс списка. Т.е. приложение ждало завершения совсем другой программы а не калькулятора

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

надо открывать процесс с SYNCHRONIZE флагом
Цитата:
Process The CreateProcess or OpenProcess function returns the handle. A process object's state is signaled when the process terminates.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 15.02.2010, 22:31   #3
besserebrenik
 
Регистрация: 23.03.2009
Сообщений: 6
По умолчанию

Цитата:
Сообщение от Пепел Феникса Посмотреть сообщение
надо открывать процесс с SYNCHRONIZE флагом
Поступил так..

SYNCHRONIZE or PROCESS_QUERY_INFORMATION or PROCESS_VM_READ
Т.к. нужно еще считывать информацию о процессе.
besserebrenik вне форума Ответить с цитированием
Старый 15.02.2010, 22:40   #4
besserebrenik
 
Регистрация: 23.03.2009
Сообщений: 6
По умолчанию DuplicateHandle

Еще возник вопрос по использованию DuplicateHandle()

PHP код:
BOOL DuplicateHandle(
HANDLE hSourceProcessHandle,           // Дескриптор процесса-источника.
HANDLE hSourceHandle,                       // Копируемый дескриптор.
HANDLE hTargetProcessHandle,           // Дескриптор процесса-приемника.
LPHANDLE IpTargetHandle,                  // Указатель на копию дескриптора.
DWORD dwDesiredAccess,                     // Доступ к копии дескриптора.
BOOL bInheritHandle,                             // Флаг наследования дескриптора.
DWORD dwOptions                                 // Необязательные опции.

Есть псевдодескриптор текущего процесса, полученный путем вызова функции GetCurrentProcess, как определить дескриптор?
Читал справку по функции, не совсем ее понял. Смотрел пример здесь

PHP код:
DuplicateHandle(GetCurrentProcessPipeWriteOutGetCurrentProcess,
           @
PipeWriteErr0TrueDUPLICATE_SAME_ACCESS
и опять же не понял пример. Совпадает дескриптор процесса источника и процесса цели???
@PipeWriteErr - указатель на копию дескриптора ?
PipeWriteOut - здесь результат копирования?

Вот мое
PHP код:
var
  
curProcIdcardinal;  
  
psevdoProcDesccardinal
  
DescDescDupTHandle
....
PHP код:
  curProcId:= GetCurrentProcessId;  // получил ID процесса 
  
psevdoProcDesc := GetCurrentProcess// псевдодескриптор процесса 
  
if not (DuplicateHandle(GetCurrentProcessDescGetCurrentProcess, @DescDup0FalseDUPLICATE_SAME_ACCESS)) then
     ShowMessage
('Дескриптор не копирован'
Не работает.

Последний раз редактировалось besserebrenik; 15.02.2010 в 22:46.
besserebrenik вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
WaitForSingleObject в Delphi 2009 Хамяг Win Api 11 03.12.2009 09:06
вопрос по функции WaitForSingleObject shurik_7866 Общие вопросы Delphi 2 08.12.2008 10:53