Private Declare Function CloseHandle Lib "kernel32" (ByVal hObject As Long) As Long
Private Declare Function OpenProcess Lib "kernel32" (ByVal dwDesiredAccess As Long, ByVal bInheritHandle As Long, ByVal dwProcessId As Long) As Long
Private Declare Function TerminateProcess Lib "kernel32" (ByVal hProcess As Long, ByVal uExitCode As Long) As Long
Const PROCESS_ALL_ACCESS = 0
Dim exitCode as Long
exitCode =0
' запустили свой дочерний процесс - программу иначе говоря
pID = Shell("c:\windows\notepad.exe", vbNormalFocus)
' зная pID процесса находим pHandle процесса
pHandle = OpenProcess(PROCESS_ALL_ACCESS, False, pID)
TerminateProcess(myProcess, exitCode)
' освобождаем дескриптор
CloseHandle(pHandle)
Как узнать hWnd процесса?
...как я могу получить ее hWnd?
Цитата:
Originally posted by XtreamAll
Моя прога работает как процесс...
...как я могу получить ее hWnd?
Моя прога работает как процесс...
...как я могу получить ее hWnd?
Сначала надо определиться с понятиями...
обычно под hWnd понимают - дескриптор окна.
У процеса есть pID - идентификатор процесса и
pHandle - дескриптор процесса
Соответственно каждое окно имеет hWnd и связано с процессом его запустившим, который характеризуется pID и pHandle
Тебе что надо?
Выходит таки Handle...
Вобщем мне нужно принудительно прекратить процесс...
...как это лучше сделать?
Нашел варианты:
Private Declare Function CloseHandle Lib "kernel32" Alias "CloseHandle" (ByVal hObject As Long) As Long
Private Declare Function CloseServiceHandle Lib "advapi32.dll" Alias "CloseServiceHandle" (ByVal hSCObject As Long) As Long
что эти функции принимают и какая подходит к моему случаю?
Вообще для закрытия программ используют обычно другие функции, например пишут так:
Код:
Только как я недавно узнал, такой принудительный способ (а этим способом можно принудительно закрыть почти любую программу, естественно с потерей всех ее данных, потому как принудитено) оказывается не освобождает память из под используемых этой программой Dll и COM объектов, что не очень хорошо... хотя все пользуются, наверное надеются на win'ский диспетчер памяти, наверное он в состоянии разобраться с таким барахлом, по крайне мере в Xp... но все уже мои догадки
Более умные функции закрытия программы, обычно сначала работают через окно (hWnd), посылая ему команду о закрытии, тогда окно может закончить все свои дела и закрыться, а вот если оно например через 15 сек еще назакрылось (зависло там или очень сильно задумалось), то тогда уже принудительно через Terminate.
Код посылки сообщения окну программы о закрытии могу написать... а тебя есть окно у программы-то?
Окна пока нету...
Начальнику надо, чтобы работало уже сегодня...
...а прога серьезная, успел сделать только "ядро", до окошек руки еще не дошли...
так эта прога иногда отказывается после завершения работы уничтожаться...
...в этом случае надо ее убить принудительно...
...к сожалению баг искать пока некогда:devil:
Что такое myProcess?
Цитата:
Originally posted by XtreamAll
TerminateProcess(myProcess, exitCode)
Что такое myProcess?
TerminateProcess(myProcess, exitCode)
Что такое myProcess?
Извиняй, очепятка, вместо myProcess надо писать pHandle
простой старый кусок переделывал под наши обсуждаемые обозначения...
Так (pHandle = OpenProcess(PROCESS_ALL_ACCESS, False, pID)), pHandle=0
...а вот так:
Public Declare Function GetCurrentProcess Lib "kernel32" Alias "GetCurrentProcess" () As Long
pHandle=GetCurrentProcess()...
все получилось!
:)
пасибо!
Цитата:
Originally posted by XtreamAll
Насчет "очепятки" я догадался, а спросил т.к. не работало...
Так (pHandle = OpenProcess(PROCESS_ALL_ACCESS, False, pID)), pHandle=0
...а вот так:
Public Declare Function GetCurrentProcess Lib "kernel32" Alias "GetCurrentProcess" () As Long
pHandle=GetCurrentProcess()...
все получилось!
:)
пасибо!
Насчет "очепятки" я догадался, а спросил т.к. не работало...
Так (pHandle = OpenProcess(PROCESS_ALL_ACCESS, False, pID)), pHandle=0
...а вот так:
Public Declare Function GetCurrentProcess Lib "kernel32" Alias "GetCurrentProcess" () As Long
pHandle=GetCurrentProcess()...
все получилось!
:)
пасибо!
Ну, с GetCurrentProcess конечно все пойдет, он же возвращает текущий процесс, просто не так часто свой же текущий процесс.
А так, для эксперимента, можешь попробовать место PROCESS_ALL_ACCESS вбить в функцию OpenProcess такое значение &H100000
...конечно OpenProcess было-бы лучше, но к сожалению не работает...
...может есть какой-нибудь GetProcess(pID)?
...но явно не то, что надо:D