Гость
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / Kill Process / 14 сообщений из 14, страница 1 из 1
26.05.2009, 18:36
    #36008872
ALEXPFR
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Kill Process
Привет всем.
Задача такая:
1. Запущена программа QWERTY.exe (в Caption окна может быть все что угодно)
2. Из FOXa просмотреть список всех запущенных процессов (с их идентификаторами)
3. Из FOXa по выбранному ID процесса убить этот процесс

Помогите пожалуйста с исходником ! Заранее спасибо.
...
Рейтинг: 0 / 0
26.05.2009, 20:16
    #36009041
Базофил
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Kill Process
пример из моего процедурного файла

*================================================================================
* 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
*================================================================================
...
Рейтинг: 0 / 0
27.05.2009, 08:28
    #36009492
ALEXPFR
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Kill Process
Базофил, спасибо за исходник, но в нем отсутствует ф-ция DWORD_NUM( ) или она гдето встроена.
Alexpfr.
...
Рейтинг: 0 / 0
27.05.2009, 10:46
    #36009836
Базофил
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Kill Process
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
*================================================================================
...
Рейтинг: 0 / 0
27.05.2009, 11:08
    #36009929
ALEXPFR
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Kill Process
Базофил, ОГРОМНОЕ СПАСИБО !!!!!
...
Рейтинг: 0 / 0
Период между сообщениями больше года.
04.01.2011, 15:58
    #37045775
rajulun
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Kill Process
ALEXPFR,

Добрый день. Меня заинтересовала данная тема, прочитал, но не могу понять. Не могли бы Вы объяснить, как использовать эти функции.
...
Рейтинг: 0 / 0
04.01.2011, 16:17
    #37045797
Dima T
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Kill Process
rajulun,

Скопируй весь код этого топика в один PRG (например My.prg)
и запускай
Код: plaintext
do KillExcel in My.prg
Будут найдены все процессы "excel.exe" и убиты.
...
Рейтинг: 0 / 0
04.01.2011, 16:46
    #37045831
rajulun
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Kill Process
rajulun,

Извиняюсь, уже разобрался.
...
Рейтинг: 0 / 0
04.01.2011, 16:53
    #37045837
rajulun
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Kill Process
Dima T,

Спасибо за ответ.
Я скопировал две функции (dechex.prg и dword_num.prg) по отдельности, а функцию KillExcel "повесил" на кнопку, закомментировав первую строку. Незнаю правильно или нет :-), но все заработало.
...
Рейтинг: 0 / 0
Период между сообщениями больше года.
30.05.2012, 17:30
    #37818405
johngorn
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Kill Process
А кто может подсказать как уничтожить или закрыть конкретно открытый не сохраненный Excel файл......
...
Рейтинг: 0 / 0
31.05.2012, 09:57
    #37819031
alextashk
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Kill Process
johngorn,

утилита unlocker
...
Рейтинг: 0 / 0
31.05.2012, 11:06
    #37819151
johngorn
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Kill Process
а причем тут эта утилитка?
...
Рейтинг: 0 / 0
31.05.2012, 12:01
    #37819297
Dima T
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Kill Process
у объекта экселя сделай
Код: sql
1.
.DisplayAlerts = .F.


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

PS Этот вопрос к данному топику никакого отношения не имеет.
...
Рейтинг: 0 / 0
31.05.2012, 13:21
    #37819502
johngorn
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Kill Process
Dima T, да я понимаю что вопрос не имеет отношения никакого, но я вроде так делал, но не через quit или close не получилось закрыть его.......
...
Рейтинг: 0 / 0
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / Kill Process / 14 сообщений из 14, страница 1 из 1
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]