Закрытие открытого процесса

Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут закрыты.
Читайте требования к создаваемым темам.
Lorian
Начинающий
Начинающий
 
Сообщения: 2
Зарегистрирован: 26.05.2007 (Сб) 20:50

Закрытие открытого процесса

Сообщение Lorian » 19.11.2007 (Пн) 9:35

У меня список запущенных процессов в системе выводится в листбокс.
Вопрос в том как закрыть какой нибудь процесс, который пользователь выберет из списка, например там ворд или интернет эксплорер

Saturn.65
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 543
Зарегистрирован: 13.10.2006 (Пт) 18:46

Сообщение Saturn.65 » 19.11.2007 (Пн) 10:17

Может как то так?
Код: Выделить всё
Option Explicit

Private Sub Command1_Click()
'  Запустить калькулятор,чтобы потом его закрыть ;)
  Shell "C:\WINDOWS\System32\calc.exe"

End Sub

Private Sub Command2_Click()
'  Закрыть калькулятор
  CloseExe "C:\WINDOWS\System32\calc.exe"
 
End Sub

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Сообщение alibek » 19.11.2007 (Пн) 10:22

Saturn.65, и какой есть смысл в том тексте, что ты привел?
Lasciate ogni speranza, voi ch'entrate.

Saturn.65
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 543
Зарегистрирован: 13.10.2006 (Пт) 18:46

Сообщение Saturn.65 » 19.11.2007 (Пн) 10:32

alibek писал(а):Saturn.65, и какой есть смысл в том тексте, что ты привел?

Ему же надо закрыть, например IE. Ах да. Не известно ведь в какой строчке листбокса будет этот процесс. Тогда конечно, команду не пропишешь. Виноват. :oops:

Viper
Артефакт VBStreets
Артефакт VBStreets
Аватара пользователя
 
Сообщения: 4394
Зарегистрирован: 12.04.2005 (Вт) 17:50
Откуда: Н.Новгород

Сообщение Viper » 19.11.2007 (Пн) 11:07

Saturn.65, автору надо закрыть выбранный пользователем процесс. Неизвестно правда, сто у него в листбоксе. Ты же предлагаешь использовать некую загадочную CloseExe применяя ее к полному пути файла. Что есть CloseExe? Какое отношение путь к экзешнику имеет к процессу?
Весь мир матрица, а мы в нем потоки байтов!

BV
Thinker
Thinker
Аватара пользователя
 
Сообщения: 3987
Зарегистрирован: 12.09.2004 (Вс) 0:55
Откуда: Молдавия, г. Кишинёв

Сообщение BV » 19.11.2007 (Пн) 12:47

Берешь и запоминаешь PID в ItemData.
const char *out = "|*0>78-,+<|"; size_t cc = char_traits<char>::length(out);
for (size_t i=0;i<cc;i++){cout<<static_cast<char>((out[i]^89));}cout<<endl;

DKbelRoma
Бывалый
Бывалый
Аватара пользователя
 
Сообщения: 282
Зарегистрирован: 13.09.2007 (Чт) 23:32
Откуда: Из Кривого Рога

вопрос по теме!

Сообщение DKbelRoma » 19.11.2007 (Пн) 15:54

Люди... А если у меня похожая проблемма как мне быть?
вот например у меня есть форма - DK и есть форма DK_open Кнопкой command1 я запускаю форму=DK_open
Код: Выделить всё
Private Sub Command1_Click ()
DK_open.Show

после того как я зделал свои дела в форме DK_open я закрываю форму DK ,а форма DK_open остаёться на экране.
Как мне зделать так ,что бы при закрытии формы DK (нажатием "X") закрывалась форма DK_open ???? :roll:
«Не важно, откуда ты. Важно - где ты.»

|( () ( T |/| |(
Бывалый
Бывалый
Аватара пользователя
 
Сообщения: 211
Зарегистрирован: 01.10.2005 (Сб) 15:49

Сообщение |( () ( T |/| |( » 19.11.2007 (Пн) 16:00

Код: Выделить всё
Private Sub Form_Unload(Cancel As Integer)
Unload DK_open
End Sub
С=[::::::::::> ™ e398wallpapers.narod.ru

Viper
Артефакт VBStreets
Артефакт VBStreets
Аватара пользователя
 
Сообщения: 4394
Зарегистрирован: 12.04.2005 (Вт) 17:50
Откуда: Н.Новгород

Сообщение Viper » 19.11.2007 (Пн) 16:29

DKbelRoma
1. Вопрос совершенно не по теме топика.
2. Для получения желаемого форму отображать так:

Код: Выделить всё
DK_open.Show , Me


при этом первая форма (DK в твоем случае) будет владеть формой DK_open, и при закрытии первой формы, закроется также и вторая.

Можно конечно и вариант |( () ( T |/| |( использовать
Последний раз редактировалось Viper 20.11.2007 (Вт) 8:07, всего редактировалось 1 раз.
Весь мир матрица, а мы в нем потоки байтов!

Decimal
Начинающий
Начинающий
 
Сообщения: 20
Зарегистрирован: 12.11.2007 (Пн) 14:39

Сообщение Decimal » 19.11.2007 (Пн) 18:11

1) Если выполняемая задача имеет пользовательский интерфейс, т. е. является окном, то лучше отправить функции окна сообщение WM_CLOSE, но при этом перед выгрузкой программа заорет о необходимости сохранения не сохраненных данных.

2) Можно использовать функцию TerminateProccess, но не рекомендуется. В этом случае, аварийно выгрузившись из памяти, программа может не подтереть за собой, т. е. не освободит ранее принадлежавшие ей системные ресурсы.
If you wanna be OK
Kiss your woman every day.
If you wanna be expert
Write your code in VB.NET

Lorian
Начинающий
Начинающий
 
Сообщения: 2
Зарегистрирован: 26.05.2007 (Сб) 20:50

Сообщение Lorian » 19.11.2007 (Пн) 21:02

Decimal писал(а):1) Если выполняемая задача имеет пользовательский интерфейс, т. е. является окном, то лучше отправить функции окна сообщение WM_CLOSE, но при этом перед выгрузкой программа заорет о необходимости сохранения не сохраненных данных.


Я так и делал, но дело в том, что когда я получаю список окон, он получается слишком большим, поскольку получаю все окна в системе, а также заметил, что у одного процесса есть несколько окон и бывали случаи, что завершить процесс закрытием окна не получалось. Проще получить именно список процессов и завершить нужный.

Decimal писал(а):2) Можно использовать функцию TerminateProccess, но не рекомендуется. В этом случае, аварийно выгрузившись из памяти, программа может не подтереть за собой, т. е. не освободит ранее принадлежавшие ей системные ресурсы.


А вот отсюда поподробней, что за функция и как ею пользоваться. У меня список процессов выводится также как и в диспетчере задач, то есть например winword.exe и его надо завершить.

Viper
Артефакт VBStreets
Артефакт VBStreets
Аватара пользователя
 
Сообщения: 4394
Зарегистрирован: 12.04.2005 (Вт) 17:50
Откуда: Н.Новгород

Сообщение Viper » 20.11.2007 (Вт) 8:13

Функция TerminateProcess изничтожает заданный процесс и все его потоки. Имеет два параметра, первый - дескриптор/описатель/хэндл прибиваемого процесса, второй код выхода. В принципе данный способ грубый и не обеспечивает корректной выгрузки библиотек и освобожения данных, также не будут обрабатываться никакие сообщения (в частности предложений о сохранении данных не будет).
Если которотко, то вот
Весь мир матрица, а мы в нем потоки байтов!

Proxy
Профессор VB наук
Профессор VB наук
Аватара пользователя
 
Сообщения: 2941
Зарегистрирован: 31.08.2007 (Пт) 4:41

Сообщение Proxy » 23.11.2007 (Пт) 8:41

Как например НОРМАЛЬНО выгрузить Explorer у которого тыща и одно окно? После TerminateProcess он как бы выгружается, но в диспечере задач в списке процессов остаётся. И естественно память не освобождает корректно. И вообще замечу, что странная какая-то эта TerminateProcess.

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Сообщение alibek » 23.11.2007 (Пт) 8:52

Proxy, это ты странный, а не функция.
Как ты собираешься работать с компом, если выгрузишь шелл?
Lasciate ogni speranza, voi ch'entrate.

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Сообщение Хакер » 23.11.2007 (Пт) 15:29

alibek
Элементарно. Виндоый шелл для работы с компом совершенно не обязателен.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Сообщение alibek » 23.11.2007 (Пт) 15:34

Хакер, ты часто работаешь без шелла?
Lasciate ogni speranza, voi ch'entrate.

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Сообщение Хакер » 23.11.2007 (Пт) 15:39

Да. Во время хбага мне всегда приходится его выключать.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Сообщение alibek » 23.11.2007 (Пт) 15:50

Ты часто занимаешься дебагом? Чаще работаешь без оболочки, чем с оболочкой?
Lasciate ogni speranza, voi ch'entrate.

keks-n
Доктор VB наук
Доктор VB наук
Аватара пользователя
 
Сообщения: 2509
Зарегистрирован: 19.09.2005 (Пн) 17:17
Откуда: г. Москва

Сообщение keks-n » 23.11.2007 (Пт) 16:52

alibek
Где ты видел слово "дебаг"?
Изображение

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Сообщение alibek » 23.11.2007 (Пт) 16:55

Ну поскольку я не знаю слово "хбаг", то решил, что это опечатка.
Lasciate ogni speranza, voi ch'entrate.

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Сообщение Хакер » 23.11.2007 (Пт) 18:59

А, вот кому я ещё со своими проблемами уши не проел :)

ХБаг, это баг, возникающих во всех моих системах (т.е. на всех машинах, где винда устанавливаетяс с одного дистрибутива), после длительной работы без перезагрузки (7-17 часов).

Проявляется в том что с определеннённого момента перестают создаваться новые хэндлы, выделяться страницы в памяти и т.д.

А дебагом я занимаюсь часто...
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

Twister
Теоретик
Теоретик
Аватара пользователя
 
Сообщения: 2251
Зарегистрирован: 28.06.2005 (Вт) 12:32
Откуда: Алматы

Сообщение Twister » 24.11.2007 (Сб) 8:32

Decimal
Можно использовать функцию TerminateProccess, но не рекомендуется. В этом случае, аварийно выгрузившись из памяти, программа может не подтереть за собой, т. е. не освободит ранее принадлежавшие ей системные ресурсы.
Полный бред. Винда освободит ВСЕ ресурсы, которые занял процесс.
Как например НОРМАЛЬНО выгрузить Explorer у которого тыща и одно окно? После TerminateProcess он как бы выгружается, но в диспечере задач в списке процессов остаётся.
Диспетчер задач просто _медленно_ обновляет инфу. Если все сделано правильно (имеется ввиду вызов TerminateProcess) - то все прекрасно завершится.

Вообще, откуда такая инфа? Я думал, что знающие люди заметят этот бред и отпишутся, но не заметили (Хакер - это в твой огород). Прежде чем что-то постить - залезли бы в IDA и посмотрели, что TerminateProcess, ExitProcess - все ведут к одному и тому же месту в ядре. ;) Тем более - TerminateProcess единственный документированный способ завершить процесс в юзермоде.
А я все практикую лечение травами...

Lunatic
Обычный пользователь
Обычный пользователь
 
Сообщения: 98
Зарегистрирован: 04.03.2008 (Вт) 17:33

Сообщение Lunatic » 13.04.2008 (Вс) 16:18

Код: Выделить всё
FindYouProc = GetProcesses("Explorer.exe")
TerminateProcess FindYouProc, GetExitCodeProcess(FindYouProc, 0)


Пример GetProcesses, взял из ApiGuide, он нормально возвращяет хендл процесса. Но процесс не завершается! :shock: Че не так делаю?

Twister
Теоретик
Теоретик
Аватара пользователя
 
Сообщения: 2251
Зарегистрирован: 28.06.2005 (Вт) 12:32
Откуда: Алматы

Сообщение Twister » 14.04.2008 (Пн) 6:53

Покажи, что за GetProcesses. Влом сливать API-Guide. Да и тебе его юзать не рекомендую.
Последний раз редактировалось Twister 14.04.2008 (Пн) 10:38, всего редактировалось 1 раз.
А я все практикую лечение травами...

ANDLL
Великий гастроном
Великий гастроном
Аватара пользователя
 
Сообщения: 3450
Зарегистрирован: 29.06.2003 (Вс) 18:55

Сообщение ANDLL » 14.04.2008 (Пн) 9:42

TerminateProcess FindYouProc, GetExitCodeProcess(FindYouProc, 0)
Подчеркнутое неискоренимо )
Гастрономия - наука о пище, о ее приготовлении, употреблении, переварении и испражнении.
Блог

Twister
Теоретик
Теоретик
Аватара пользователя
 
Сообщения: 2251
Зарегистрирован: 28.06.2005 (Вт) 12:32
Откуда: Алматы

Сообщение Twister » 14.04.2008 (Пн) 10:44

Неискоренимо до тех пор, пока люди будут юзать глючный API-Guide.

Lunatic
Поясняю.
GetExitCodeProcess используется для получения кода статуса, с которым терминировался процесс. Естественно, что пока процесс работает, функция не выдаст верный результат, а вернет ноль. Так что этот код - чистой воды бредятина. С тем же успехом можно и нужно вызвать
Код: Выделить всё
TerminateProcess hProc, 0
А я все практикую лечение травами...

Lunatic
Обычный пользователь
Обычный пользователь
 
Сообщения: 98
Зарегистрирован: 04.03.2008 (Вт) 17:33

Сообщение Lunatic » 14.04.2008 (Пн) 21:30

Код: Выделить всё
Public Declare Function GetProcessMemoryInfo Lib "PSAPI.DLL" (ByVal hProcess As Long, ppsmemCounters As PROCESS_MEMORY_COUNTERS, ByVal cb As Long) As Long
Public Declare Function Process32First Lib "kernel32" (ByVal hSnapshot As Long, lppe As PROCESSENTRY32) As Long
Public Declare Function Process32Next Lib "kernel32" (ByVal hSnapshot As Long, lppe As PROCESSENTRY32) As Long
Public Declare Function CloseHandle Lib "Kernel32.dll" (ByVal Handle As Long) As Long
Public Declare Function OpenProcess Lib "Kernel32.dll" (ByVal dwDesiredAccessas As Long, ByVal bInheritHandle As Long, ByVal dwProcId As Long) As Long
Public Declare Function EnumProcesses Lib "PSAPI.DLL" (ByRef lpidProcess As Long, ByVal cb As Long, ByRef cbNeeded As Long) As Long
Public Declare Function GetModuleFileNameExA Lib "PSAPI.DLL" (ByVal hProcess As Long, ByVal hModule As Long, ByVal ModuleName As String, ByVal nSize As Long) As Long
Public Declare Function EnumProcessModules Lib "PSAPI.DLL" (ByVal hProcess As Long, ByRef lphModule As Long, ByVal cb As Long, ByRef cbNeeded As Long) As Long
Public Declare Function CreateToolhelp32Snapshot Lib "kernel32" (ByVal dwFlags As Long, ByVal th32ProcessID As Long) As Long
Public Declare Function GetVersionExA Lib "kernel32" (lpVersionInformation As OSVERSIONINFO) As Integer
Public Declare Function SetTimer Lib "user32" (ByVal hwnd As Long, ByVal nIDEvent As Long, ByVal uElapse As Long, ByVal lpTimerFunc As Long) As Long
Public Declare Function KillTimer Lib "user32" (ByVal hwnd As Long, ByVal nIDEvent As Long) As Long
Public Declare Sub GlobalMemoryStatus Lib "kernel32" (lpBuffer As MEMORYSTATUS)



Public Const PROCESS_QUERY_INFORMATION = 1024
Public Const PROCESS_VM_READ = 16
Public Const MAX_PATH = 260
Public Const STANDARD_RIGHTS_REQUIRED = &HF0000
Public Const SYNCHRONIZE = &H100000
Public Const PROCESS_ALL_ACCESS = &H1F0FFF
Public Const TH32CS_SNAPPROCESS = &H2&
Public Const hNull = 0
Public Const WIN95_System_Found = 1
Public Const WINNT_System_Found = 2
Public Const Default_Log_Size = 10000000
Public Const Default_Log_Days = 0
Public Const SPECIFIC_RIGHTS_ALL = &HFFFF
Public Const STANDARD_RIGHTS_ALL = &H1F0000


Type MEMORYSTATUS
    dwLength As Long
    dwMemoryLoad As Long
    dwTotalPhys As Long
    dwAvailPhys As Long
    dwTotalPageFile As Long
    dwAvailPageFile As Long
    dwTotalVirtual As Long
    dwAvailVirtual As Long
End Type


Type PROCESS_MEMORY_COUNTERS
    cb As Long
    PageFaultCount As Long
    PeakWorkingSetSize As Long
    WorkingSetSize As Long
    QuotaPeakPagedPoolUsage As Long
    QuotaPagedPoolUsage As Long
    QuotaPeakNonPagedPoolUsage As Long
    QuotaNonPagedPoolUsage As Long
    PagefileUsage As Long
    PeakPagefileUsage As Long
End Type


Public Type PROCESSENTRY32
    dwSize As Long
    cntUsage As Long
    th32ProcessID As Long ' This process
    th32DefaultHeapID As Long
    th32ModuleID As Long ' Associated exe
    cntThreads As Long
    th32ParentProcessID As Long ' This process's parent process
    pcPriClassBase As Long ' Base priority of process threads
    dwFlags As Long
    szExeFile As String * 260 ' MAX_PATH
    End Type


Public Type OSVERSIONINFO
    dwOSVersionInfoSize As Long
    dwMajorVersion As Long
    dwMinorVersion As Long
    dwBuildNumber As Long
    dwPlatformId As Long '1 = Windows 95.
    '2 = Windows NT
    szCSDVersion As String * 128
End Type


Public Function GetProcesses(ByVal EXEName As String) As Long

    Dim booResult As Boolean
    Dim lngLength As Long
    Dim lngProcessID As Long
    Dim strProcessName As String
    Dim lngSnapHwnd As Long
    Dim udtProcEntry As PROCESSENTRY32
    Dim lngCBSize As Long 'Specifies the size, In bytes, of the lpidProcess array
    Dim lngCBSizeReturned As Long 'Receives the number of bytes returned
    Dim lngNumElements As Long
    Dim lngProcessIDs() As Long
    Dim lngCBSize2 As Long
    Dim lngModules(1 To 200) As Long
    Dim lngReturn As Long
    Dim strModuleName As String
    Dim lngSize As Long
    Dim lngHwndProcess As Long
    Dim lngLoop As Long
    Dim b As Long
    Dim c As Long
    Dim e As Long
    Dim d As Long
    Dim pmc As PROCESS_MEMORY_COUNTERS
    Dim lret As Long
    Dim strProcName2 As String
    Dim strProcName As String

    'Turn on Error handler
    On Error GoTo Error_handler

   booResult = False

    EXEName = UCase$(Trim$(EXEName))
    lngLength = Len(EXEName)

    'ProcessInfo.bolRunning = False

    Select Case getVersion()
        'I'm not bothered about windows 95/98 becasue this class probably wont be used on it anyway.
        Case WIN95_System_Found 'Windows 95/98

        Case WINNT_System_Found 'Windows NT

            lngCBSize = 8 ' Really needs To be 16, but Loop will increment prior to calling API
            lngCBSizeReturned = 96

            Do While lngCBSize <= lngCBSizeReturned
                DoEvents
                'Increment Size
                lngCBSize = lngCBSize * 2
                'Allocate Memory for Array
                ReDim lngProcessIDs(lngCBSize / 4) As Long
                'Get Process ID's
                lngReturn = EnumProcesses(lngProcessIDs(1), lngCBSize, lngCBSizeReturned)
            Loop

            'Count number of processes returned
            lngNumElements = lngCBSizeReturned / 4
            'Loop thru each process

            For lngLoop = 1 To lngNumElements
            DoEvents

            'Get a handle to the Process and Open
            lngHwndProcess = OpenProcess(PROCESS_QUERY_INFORMATION Or PROCESS_VM_READ, 0, lngProcessIDs(lngLoop))

            If lngHwndProcess <> 0 Then
                'Get an array of the module handles for the specified process
                lngReturn = EnumProcessModules(lngHwndProcess, lngModules(1), 200, lngCBSize2)

                'If the Module Array is retrieved, Get the ModuleFileName
                If lngReturn <> 0 Then

                    'Buffer with spaces first to allocate memory for byte array
                    strModuleName = Space(MAX_PATH)

                    'Must be set prior to calling API
                    lngSize = 500

                    'Get Process Name
                    lngReturn = GetModuleFileNameExA(lngHwndProcess, lngModules(1), strModuleName, lngSize)

                    'Remove trailing spaces
                    strProcessName = Left(strModuleName, lngReturn)

                    'Check for Matching Upper case result
                    strProcessName = UCase$(Trim$(strProcessName))

                    strProcName2 = GetElement(Trim(Replace(strProcessName, Chr$(0), "")), "\", 0, 0, GetNumElements(Trim(Replace(strProcessName, Chr$(0), "")), "\") - 1)

                    If strProcName2 = EXEName Then

                        'Get the Site of the Memory Structure
                        pmc.cb = LenB(pmc)

                           lret = GetProcessMemoryInfo(lngHwndProcess, pmc, pmc.cb)
                           GetProcesses = lngHwndProcess
                           Debug.Print EXEName & "::" & CStr(pmc.WorkingSetSize / 1024)

                    End If
                End If
            End If
            'Close the handle to this process
            lngReturn = CloseHandle(lngHwndProcess)
            DoEvents
        Next

    End Select

IsProcessRunning_Exit:

'Exit early to avoid error handler
Exit Function
Error_handler:
    Err.Raise Err, Err.Source, "ProcessInfo", Error
    Resume Next
End Function


Private Function getVersion() As Long

    Dim osinfo As OSVERSIONINFO
    Dim retvalue As Integer

    osinfo.dwOSVersionInfoSize = 148
    osinfo.szCSDVersion = Space$(128)
    retvalue = GetVersionExA(osinfo)
    getVersion = osinfo.dwPlatformId

End Function


Private Function StrZToStr(s As String) As String
    StrZToStr = Left$(s, Len(s) - 1)
End Function



Public Function GetElement(ByVal strList As String, ByVal strDelimiter As String, ByVal lngNumColumns As Long, ByVal lngRow As Long, ByVal lngColumn As Long) As String

    Dim lngCounter As Long

    ' Append delimiter text to the end of the list as a terminator.
    strList = strList & strDelimiter

    ' Calculate the offset for the item required based on the number of columns the list
    ' 'strList' has i.e. 'lngNumColumns' and from which row the element is to be
    ' selected i.e. 'lngRow'.
    lngColumn = IIf(lngRow = 0, lngColumn, (lngRow * lngNumColumns) + lngColumn)

    ' Search for the 'lngColumn' item from the list 'strList'.
    For lngCounter = 0 To lngColumn - 1

        ' Remove each item from the list.
        strList = Mid$(strList, InStr(strList, strDelimiter) + Len(strDelimiter), Len(strList))

        ' If list becomes empty before 'lngColumn' is found then just
        ' return an empty string.
        If Len(strList) = 0 Then
            GetElement = ""
            Exit Function
        End If

    Next lngCounter

    ' Return the sought list element.
    GetElement = Left$(strList, InStr(strList, strDelimiter) - 1)

End Function


''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
'Function GetNumElements (ByVal strList As String,
'                         ByVal strDelimiter As String)
'                         As Integer
'
'  strList      = The element list.
'  strDelimiter = The delimiter by which the elements in
'                 'strList' are seperated.
'
'  The function returns an integer which is the count of the
'  number of elements in 'strList'.
'
'  Author: Roger Taylor
'
'  Date:26/12/1998
'
'  Additional Information:
'
'  Revision History:
'
''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''

Public Function GetNumElements(ByVal strList As String, ByVal strDelimiter As String) As Integer

    Dim intElementCount As Integer

    ' If no elements in the list 'strList' then just return 0.
    If Len(strList) = 0 Then
        GetNumElements = 0
        Exit Function
    End If

    ' Append delimiter text to the end of the list as a terminator.
    strList = strList & strDelimiter

    ' Count the number of elements in 'strlist'
    While InStr(strList, strDelimiter) > 0
        intElementCount = intElementCount + 1
        strList = Mid$(strList, InStr(strList, strDelimiter) + 1, Len(strList))
    Wend

    ' Return the number of elements in 'strList'.
    GetNumElements = intElementCount

End Function


'If you're using VB4 or VB5, uncomment the following function:
'Function Replace(sInput As String, WhatToReplace As String, ReplaceWith As String) As String
    'Dim Ret As Long
    'Replace = sInput
    'Ret = -Len(ReplaceWith) + 1
    'Do
        'Ret = InStr(Ret + Len(ReplaceWith), Replace, WhatToReplace, vbTextCompare)
        'If Ret = 0 Then Exit Do
        'Replace = Left$(Replace, Ret - 1) + ReplaceWith + Right$(Replace, Len(Replace) - Ret - Len(WhatToReplace) + 1)
    'Loop
'End Function


Я тут особо не переделовал, сделал только чтобы функция возвращяла хендл процесса

Lunatic
Обычный пользователь
Обычный пользователь
 
Сообщения: 98
Зарегистрирован: 04.03.2008 (Вт) 17:33

Сообщение Lunatic » 14.04.2008 (Пн) 21:35

Код: Выделить всё
TerminateProcess hProc, 0

Проверил, не работает! Тогда с хендлом что-то. Как еще можно почеловечески получить хендл процесса? :roll:

Twister
Теоретик
Теоретик
Аватара пользователя
 
Сообщения: 2251
Зарегистрирован: 28.06.2005 (Вт) 12:32
Откуда: Алматы

Сообщение Twister » 15.04.2008 (Вт) 6:37

Я в шоке.
Тонны лишнего кода использующегося для того, чтоб открыть процесс по имени.

Ошибка в том коде очевидна - процесс открывается с флагами PROCESS_QUERY_INFORMATION и PROCESS_VM_READ, следовательно прав на завершение этого процесса у тебя нет.

Как еще можно почеловечески получить хендл процесса?
Хэндл можно получить несколькими способами:
1. Воспользоваться OpenProcess()
2. Скопировать уже имеющийся хэндл
3. Силой своей мысли и разума привести в движение ядерные структуры и создать хэндл ручками.

Выбери способ себе по вкусу...
А я все практикую лечение травами...


Вернуться в Visual Basic 1–6

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 40

    TopList