В этой статье описывается даже не программа, а всего лишь часть кода. Каждый сможет найти ему применение. В одном из выпусков VR-Online была статья, о создании на Делфи приложения, которое запускает программу, ждет её завершения и каким-либо образом реагирует на это завершение.
Ну что ж, неплохо. Скачали страничку и забыли.Но не надолго. Месяца 3 назад мне понадобилось писать кряк к одной проге, где как раз нужна была эта процедура. Писал я на VB, поэтому я решил конвертнуть тот фрагмент кода с Делфи на ВБ. Облом, у меня ничего не получилось. Пришлось эту затею оставить.
Недавно я копался с API text Viewer'om и что бы вы думали? Я нашел нужные мне процедуры. Пять минут кодинга и готово.
Лепим на форму всего одну кнопку и пишем :
Private Type STARTUPINFO
'Описываем STARTUPINFO
' Всевозможные параметры
cb As Long
lpReserved As String
hStdInput As Long
hStdOutput As Long
hStdError As Long
End Type
Private Type PROCESS_INFORMATION
'Описание процесса
' Его идентификационный номер, имя, класс
hProcess As Long
hThread As Long
dwProcessID As Long
dwThreadID As Long
End Type
Private Declare Function WaitForSingleObject Lib "kernel32" (ByVal _
hHandle As Long, ByVal dwMilliseconds As Long) As Long
'По Horrific'y
'Здесь есть очень интересная функция WaitforSingleObject.
'Эта функция ждёт, пока не произойдёт какое-то событие.
'В качестве первого параметра передаётся указатель на событие,
'а второй - время ожидание.
Private Declare Function CreateProcessA Lib "kernel32" (ByVal _
lpApplicationName As Long, ByVal lpCommandLine As String, ByVal _
lpProcessAttributes As Long, ByVal lpThreadAttributes As Long, _
ByVal bInheritHandles As Long, ByVal dwCreationFlags As Long, _
ByVal lpEnvironment As Long, ByVal lpCurrentDirectory As Long, _
lpStartupInfo As STARTUPINFO, lpProcessInformation As _
PROCESS_INFORMATION) As Long
' Создаем сам процесс
' Как и предыдущая эта функция из WinApi
Private Declare Function CloseHandle Lib "kernel32" (ByVal _
hObject As Long) As Long
'Полная противоположность CloseHandle
Private Const NORMAL_PRIORITY_CLASS = &H20&
Private Const INFINITE = -1&
' INFINITE - ждать бесконечно долго
Public Sub Shl(cmdline$)
' Процедура запуска
Dim pr As PROCESS_INFORMATION
Dim pusk As STARTUPINFO
' Инициализация STARTUPINFO:
pusk.cb = Len(pusk)
' Запускаем приложение:
ret& = CreateProcessA(0&, cmdline$, 0&, 0&, 1&, _
NORMAL_PRIORITY_CLASS, 0&, 0&, pusk, pr)
' Ждем завершения :
ret& = WaitForSingleObject(pr.hProcess, INFINITE)
ret& = CloseHandle(pr.hProcess)
End Sub
Private Sub Command1_Click()
shl ("Chernobyl")
' Конечно не Чернобыль, а что-нибудь попроще.
MsgBox "Hdd Destroyed", vbInformation, "COOL."
End Sub