Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / FoxPro, Visual FoxPro Новый топик    Ответить
 Kill Process  [new]
ALEXPFR
Member

Откуда:
Сообщений: 72
Привет всем.
Задача такая:
1. Запущена программа QWERTY.exe (в Caption окна может быть все что угодно)
2. Из FOXa просмотреть список всех запущенных процессов (с их идентификаторами)
3. Из FOXa по выбранному ID процесса убить этот процесс

Помогите пожалуйста с исходником ! Заранее спасибо.
26 май 09, 18:36    [7230937]     Ответить | Цитировать Сообщить модератору
 Re: Kill Process  [new]
Базофил
Guest
пример из моего процедурного файла

*================================================================================
* 43. Функция DecHex - Converts from base 10 to base 16.
* Функция HexDec - Translates Hex (in a string) to a decimal
*================================================================================
FUNCTION DecHex && Converts from base 10 to base 16.
PARAMETER nDec

IF nDec=0
RETURN '00000000'
ENDIF

DIMENSION aHex[16]
FOR nChar = 1 TO 16
aHex[nChar] = SUBSTR('0123456789ABCDEF', nChar,1)
NEXT

cHex = ''
DO WHILE nDec > 0
cHex = aHex[BITAND(nDec,15) + 1] + cHex
nDec = BITRSHIFT(nDec,4) && Same as INT(nASCII / 16), but perhaps slightly faster.
ENDDO

cHex = PADL(cHex,8,'0') && addition by on the left till 8 characters
RETURN cHex
***********************************************************************************************************
FUNCTION HexDec && Translates Hex (in a string) to a decimal
PARAMETERS cHex

cHex=PADL(cHex,8,'0')

IF cHex='00000000'
RETURN 0
ENDIF

DIMENSION aHex[16]
FOR nChar = 1 TO 16
aHex[nChar] = SUBSTR('0123456789ABCDEF', nChar,1)
NEXT

len_hex = LEN(cHex) && Length of a symbolical line

n_dec = 0
FOR jj=1 TO len_hex
n_dec = n_dec + (ASCAN(aHex, SUBSTR(cHex, jj, 1)) -1) * 16^(len_hex - jj)
ENDFOR

RETURN n_dec
*================================================================================
* конец функций DecHex, HexDec
*================================================================================

*================================================================================
* 44. Функция KillExcel - получение списка процессов в WINDOWS и уничтожение процессов EXCEL
*================================================================================
FUNCTION KillExcel

#define TH32CS_SNAPHEAPLIST 0x00000001
#define TH32CS_SNAPPROCESS 0x00000002
#define TH32CS_SNAPTHREAD 0x00000004
#define TH32CS_SNAPMODULE 0x00000008

DECLARE integer CreateToolhelp32Snapshot IN WIN32API integer, integer
DECLARE integer Process32First IN WIN32API integer, string @
DECLARE integer Process32Next IN WIN32API integer, string @
DECLARE integer TerminateProcess IN WIN32API integer, integer
DECLARE integer OpenProcess IN WIN32API integer, integer, integer
DECLARE integer CloseHandle IN WIN32API integer

* CreateToolhelp32Snapshot - Takes a snapshot of the processes and the heaps, modules, and threads.
HSnapshot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,0)
*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
* структура для Process32First, Process32Next
*typedef struct tagPROCESSENTRY32 {
* DWORD dwSize;
* DWORD cntUsage;
* DWORD th32ProcessID;
* DWORD th32DefaultHeapID;
* DWORD th32ModuleID;
* DWORD cntThreads;
* DWORD th32ParentProcessID;
* LONG pcPriClassBase;
* DWORD dwFlags;
* char szExeFile[MAX_PATH];
*} PROCESSENTRY32;

cBuff=SPACE(400)
Process32First(HSnapshot,@cBuff)
DIMENSION arr[1,3]
arr[1,1] = DWORD_NUM(SUBSTR(cBuff,9,4)) && PID процесса (10-чное число)
arr[1,2] = DecHex(arr[1,1]) && PID процесса (16-чное число)
arr[1,3] = '' && имя EXE-модуля
lpString = SUBSTR(cBuff,37,100)
FOR i=1 TO Len(lpString)
IF ASC(SUBSTR(lpString,i,1))#0
arr[1,3] = arr[1,3] +SUBSTR(lpString,i,1)
ELSE
EXIT
ENDIF
NEXT
*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
flag=1
DO WHILE flag=1
flag = Process32Next(HSnapshot,@cBuff)
j = ALEN(arr,1)+1
DIMENSION arr[j,3]
arr[j,1] = DWORD_NUM(SUBSTR(cBuff,9,4)) && PID процесса (10-чное число)
arr[j,2] = DecHex(arr[1,1]) && PID процесса (16-чное число)
arr[j,3] = '' && имя EXE-модуля
lpString = SUBSTR(cBuff,37,100)
FOR i=1 TO Len(lpString)
IF ASC(SUBSTR(lpString,i,1))#0
arr[j,3] = arr[j,3] +SUBSTR(lpString,i,1)
ELSE
EXIT
ENDIF
NEXT
ENDDO
*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
FOR i=1 TO ALEN(arr,1)
IF AT('excel.exe',LOWER(arr[i,3])) > 0
hProcess=OpenProcess(1,1,arr[i,1])
TerminateProcess(hProcess,0)
CloseHandle(hProcess)
ENDIF
NEXT
*================================================================================
* конец функций KillExcel
*================================================================================
26 май 09, 20:16    [7231236]     Ответить | Цитировать Сообщить модератору
 Re: Kill Process  [new]
ALEXPFR
Member

Откуда:
Сообщений: 72
Базофил, спасибо за исходник, но в нем отсутствует ф-ция DWORD_NUM( ) или она гдето встроена.
Alexpfr.
27 май 09, 08:28    [7232053]     Ответить | Цитировать Сообщить модератору
 Re: Kill Process  [new]
Базофил
Guest
ALEXPFR,

*================================================================================
* 42. Функция Num_Word - "число --> строка WORD (2 байта)"
* Функция Word_Num - "строка WORD (2 байта) --> число"
* Функция Num_Dword - "число --> строка DWORD (4 байта)"
* Функция Dword_Num - "строка DWORD (4 байта) --> число"
*================================================================================
FUNCTION num_word && Функция Num_Word - "число --> строка WORD"
LPARAM Num

LOCAL c0,c1
cresult = chr(0)+chr(0)

IF Num < (2^16 - 1) then
c1 = chr(int(Num/256))
c0 = chr(mod(Num,256))
cresult = c0+c1
ELSE
MESSAGEBOX('Число '+ALLT(STR(Num))+' слишком большое !!!')
cresult = '????'
ENDIF
RETURN cresult
*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
FUNCTION word_num && Функция Word_Num - "строка WORD --> число"
LPARAM cW
nresult = ASC(SUBSTR(cW,2))*256 + ASC(SUBSTR(cW,1))
RETURN nresult
*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
FUNCTION num_dword && Функция Num_Dword - "число --> строка DWORD"
LPARAM Num

LOCAL c0,c1,c2,c3
cresult = chr(0)+chr(0)+chr(0)+chr(0)

IF Num < (2^32 - 1) then
c3 = chr(int(Num/(256^3)))
Num = mod(Num,256^3)
c2 = chr(int(Num/(256^2)))
Num = mod(Num,256^2)
c1 = chr(int(Num/256))
c0 = chr(mod(Num,256))
cresult = c0+c1+c2+c3
ELSE
MESSAGEBOX('Число '+ALLT(STR(Num))+' слишком большое !!!')
cresult = '????'
ENDIF
RETURN cresult
*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
FUNCTION dword_num && Функция Dword_Num - "строка DWORD --> число"
LPARAM cDW
nresult = ASC(SUBSTR(cDW,4))*256*256*256 + ASC(SUBSTR(cDW,3))*256*256 + ;
ASC(SUBSTR(cDW,2))*256 + ASC(SUBSTR(cDW,1))
RETURN nresult
*================================================================================
* конец функций Num_Word, Word_Num, Num_Dword, Dword_Num
*================================================================================
27 май 09, 10:46    [7232733]     Ответить | Цитировать Сообщить модератору
 Re: Kill Process  [new]
ALEXPFR
Member

Откуда:
Сообщений: 72
Базофил, ОГРОМНОЕ СПАСИБО !!!!!
27 май 09, 11:08    [7232910]     Ответить | Цитировать Сообщить модератору
Между сообщениями интервал более 1 года.
 Re: Kill Process  [new]
rajulun
Member

Откуда:
Сообщений: 13
ALEXPFR,

Добрый день. Меня заинтересовала данная тема, прочитал, но не могу понять. Не могли бы Вы объяснить, как использовать эти функции.
4 янв 11, 15:58    [10033282]     Ответить | Цитировать Сообщить модератору
 Re: Kill Process  [new]
Dima T
Member

Откуда:
Сообщений: 15281
rajulun,

Скопируй весь код этого топика в один PRG (например My.prg)
и запускай
do KillExcel in My.prg
Будут найдены все процессы "excel.exe" и убиты.
4 янв 11, 16:17    [10033345]     Ответить | Цитировать Сообщить модератору
 Re: Kill Process  [new]
rajulun
Member

Откуда:
Сообщений: 13
rajulun,

Извиняюсь, уже разобрался.
4 янв 11, 16:46    [10033434]     Ответить | Цитировать Сообщить модератору
 Re: Kill Process  [new]
rajulun
Member

Откуда:
Сообщений: 13
Dima T,

Спасибо за ответ.
Я скопировал две функции (dechex.prg и dword_num.prg) по отдельности, а функцию KillExcel "повесил" на кнопку, закомментировав первую строку. Незнаю правильно или нет :-), но все заработало.
4 янв 11, 16:53    [10033455]     Ответить | Цитировать Сообщить модератору
Между сообщениями интервал более 1 года.
 Re: Kill Process  [new]
johngorn
Member

Откуда: Россия г. Тирасполь
Сообщений: 140
А кто может подсказать как уничтожить или закрыть конкретно открытый не сохраненный Excel файл......
30 май 12, 17:30    [12639338]     Ответить | Цитировать Сообщить модератору
 Re: Kill Process  [new]
alextashk
Member

Откуда:
Сообщений: 431
johngorn,

утилита unlocker
31 май 12, 09:57    [12641490]     Ответить | Цитировать Сообщить модератору
 Re: Kill Process  [new]
johngorn
Member

Откуда: Россия г. Тирасполь
Сообщений: 140
а причем тут эта утилитка?
31 май 12, 11:06    [12641899]     Ответить | Цитировать Сообщить модератору
 Re: Kill Process  [new]
Dima T
Member

Откуда:
Сообщений: 15281
у объекта экселя сделай
.DisplayAlerts = .F.

и тогда от будет нормально закрываться

PS Этот вопрос к данному топику никакого отношения не имеет.
31 май 12, 12:01    [12642447]     Ответить | Цитировать Сообщить модератору
 Re: Kill Process  [new]
johngorn
Member

Откуда: Россия г. Тирасполь
Сообщений: 140
Dima T, да я понимаю что вопрос не имеет отношения никакого, но я вроде так делал, но не через quit или close не получилось закрыть его.......
31 май 12, 13:21    [12643221]     Ответить | Цитировать Сообщить модератору
Все форумы / FoxPro, Visual FoxPro Ответить