Здравствуйте!
В общем дело-то кажется простым: в процедуре нужно проверить был ли запущен excel моим приложением, если да, то убить всё excel процессы от моего приложения.
Подскажите, где подробнее раскопать про данную проблему.
Спасибо.
Короче, получаешь PID (ProcessID своего процесса). В этом коде прописываешь его значение (переменную естественно) заместо 2032:
Const TH32CS_SNAPHEAPLIST = &H1
Const TH32CS_SNAPPROCESS = &H2
Const TH32CS_SNAPTHREAD = &H4
Const TH32CS_SNAPMODULE = &H8
Const TH32CS_SNAPALL = (TH32CS_SNAPHEAPLIST Or TH32CS_SNAPPROCESS Or TH32CS_SNAPTHREAD Or TH32CS_SNAPMODULE)
Const TH32CS_INHERIT = &H80000000
Const MAX_PATH As Integer = 260
Private Type PROCESSENTRY32
dwSize As Long
cntUsage As Long
th32ProcessID As Long
th32DefaultHeapID As Long
th32ModuleID As Long
cntThreads As Long
th32ParentProcessID As Long
pcPriClassBase As Long
dwFlags As Long
szExeFile As String * MAX_PATH
End Type
Private Declare Function CreateToolhelp32Snapshot Lib "Kernel32" (ByVal lFlags As Long, ByVal lProcessID As Long) As Long
Private Declare Function Process32First Lib "Kernel32" (ByVal hSnapShot As Long, uProcess As PROCESSENTRY32) As Long
Private Declare Function Process32Next Lib "Kernel32" (ByVal hSnapShot As Long, uProcess As PROCESSENTRY32) As Long
Private Declare Sub CloseHandle Lib "Kernel32" (ByVal hPass As Long)
Private Sub Form_Load()
'KPD-Team 2000
'URL: http://www.allapi.net/
'E-Mail: KPDTeam@Allapi.net
Dim hSnapShot As Long, uProcess As PROCESSENTRY32
'Takes a snapshot of the processes and the heaps, modules, and threads used by the processes
hSnapShot = CreateToolhelp32Snapshot(TH32CS_SNAPALL, 0&
'set the length of our ProcessEntry-type
uProcess.dwSize = Len(uProcess)
'Retrieve information about the first process encountered in our system snapshot
r = Process32First(hSnapShot, uProcess)
'set graphics mode to persistent
Me.AutoRedraw = True
Do While r
If uProcess.th32ParentProcessID = 2032 Then
Me.Print Left$(uProcess.szExeFile, IIf(InStr(1, uProcess.szExeFile, Chr$(0)) > 0, InStr(1, uProcess.szExeFile, Chr$(0)) - 1, 0))
End If
'Retrieve information about the next process recorded in our system snapshot
r = Process32Next(hSnapShot, uProcess)
Loop
'close our snapshot handle
CloseHandle hSnapShot
End Sub
На форме будет список дочерних процессов (которые твой процесс запустил)
Подскажите, где подробнее раскопать про данную проблему.
я ответил наиболее точно
ты при запуске PID'ы собирай, потом их убивай.
Вариант, если ексель запускается через Shell, но мои телепатический свойства указывают на то, что ексель запускается через new Excel.Application
Соответственно алгоритм нахождения процессов которые были запущены нашим будет примерно такой:
1) CreateToolhelpSnapshot
2) ProcessFirst/ProcessNext
3)
Public Type PROCESSENTRY32
dwSize As Long
cntUsage As Long
th32ProcessID As Long
th32DefaultHeapID As Long
th32ModuleID As Long
cntThreads As Long
th32ParentProcessID As Long
pcPriClassBase As Long
dwFlags As Long
szExeFile As String * MAX_PATH
End Type
Это и будет PID родителя.
4) Сверяем полученный PID со своим. Получить свой пид можно вот так:
Call GetWindowThreadProcessId(Me.hWnd, pid)
5) Если наш пид=th32ParentProcessID то это процесс запустили мы - значит его надо убить.
6) OpenProcess/TerminateProcess/CloseHandle
Private Sub Комманда1_Click()
Dim wBook As Excel.Workbook ' чтобы обращаться к созданной таблице
' здесь я бы сделал не так:
' Set exapp = New Excel.Application
' а добавил бы возможность использовать запущенное приложение
Dim StartedNew As Boolean ' поставим в True, если сами запустим Excel
StartedNew = False
On Error Resume Next
Set exapp = GetObject(, "Excel.Application"
If Err.Number <> 0 Then ' если нет запущенного Excel'я
Set exapp = CreateObject("Excel.Application"
StartedNew = True
End If
On Error GoTo 0
exapp.Visible = True
' создаем новую таблицу
Set wBook = exapp.Workbooks.Add
' издеваемся над созанной таблицей
wBook.Sheets(1).Name = "MyResult"
wBook.Sheets(1).Range("A1".Value = "это ячейка A1"
wBook.Sheets("MyResult".Cell(4, 2).Value = InputBox("Впиши что хочешь", "текст для ячейки B4", "filled from VB"
' сохраняем таблицу
wBook.Save "c:\my_table.xls"
wBook.Close
Set wBook = Nothing
' если Excel запускали мы, то надо бы его закрыть
If StartedNew Then
exapp.Quit
End If
Set exapp = Nothing
End Sub
А вообще... http://www.nigma.ru/index.php?q=if+GetObject%28%2CExcel.Application%29&fs=ps&0=1&1=1&2=1&3=1&4=1&5=1&6=1&7=1&onsite=&custom_logo=http%3A%2F%2Fsham.clan.su%2Fcadnet.bmp&custom_href=http%3A%2F%2Fsham.clan.su