Visual Basic, .NET, ASP, VBScript
 

   
   
     

Форум - Общий форум

Страница: 1 |

 

  Вопрос: Убить процесс Добавлено: 06.08.07 12:45  

Автор вопроса:  art
Здравствуйте!
В общем дело-то кажется простым: в процедуре нужно проверить был ли запущен excel моим приложением, если да, то убить всё excel процессы от моего приложения.
Подскажите, где подробнее раскопать про данную проблему.
Спасибо.

Ответить

  Ответы Всего ответов: 13  

Номер ответа: 1
Автор ответа:
 HACKER


 

Разработчик Offline Client

Вопросов: 236
Ответов: 8362
 Профиль | | #1 Добавлено: 06.08.07 17:51
В гугле.

Ответить

Номер ответа: 2
Автор ответа:
 Mesnik



Вопросов: 3
Ответов: 29
 Профиль | | #2 Добавлено: 06.08.07 19:45
Ето или дурацкая защита или вредилка

Ответить

Номер ответа: 3
Автор ответа:
 art



Вопросов: 45
Ответов: 119
 Профиль | | #3 Добавлено: 06.08.07 20:56
Вот уж посоветывали ))))
Я ж не чужие процессы убивать собрался.

Ответить

Номер ответа: 4
Автор ответа:
 art



Вопросов: 45
Ответов: 119
 Профиль | | #4 Добавлено: 06.08.07 21:42
В гугле ничего подходящего найти не могу.
Какой алгоритм?

Ответить

Номер ответа: 5
Автор ответа:
 sne



Разработчик Offline Client

ICQ: 233286456 

Вопросов: 34
Ответов: 5445
 Web-сайт: hw.t-k.ru
 Профиль | | #5
Добавлено: 06.08.07 21:42
ты при запуске PID'ы собирай, потом их убивай.

Ответить

Номер ответа: 6
Автор ответа:
 art



Вопросов: 45
Ответов: 119
 Профиль | | #6 Добавлено: 06.08.07 21:44
при запуске приложения или когда excel вызываю? И как это осуществить?

Ответить

Номер ответа: 7
Автор ответа:
 ZagZag



ICQ: 295002202 

Вопросов: 87
Ответов: 1684
 Профиль | | #7 Добавлено: 06.08.07 22:01
Короче, получаешь 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

На форме будет список дочерних процессов (которые твой процесс запустил)

(с) Api-Guide + я немного постарался

Ответить

Номер ответа: 8
Автор ответа:
 HACKER


 

Разработчик Offline Client

Вопросов: 236
Ответов: 8362
 Профиль | | #8 Добавлено: 06.08.07 23:48
Надо было сразу вопрос точно ставить, ибо на
Подскажите, где подробнее раскопать про данную проблему.
я ответил наиболее точно :)

ты при запуске 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

Ответить

Номер ответа: 9
Автор ответа:
 HACKER


 

Разработчик Offline Client

Вопросов: 236
Ответов: 8362
 Профиль | | #9 Добавлено: 06.08.07 23:51
тьфу, не обновил перед постом, а тут уже ZagZag всё разрулил :)

Ответить

Номер ответа: 10
Автор ответа:
 -АлександР-



Вопросов: 55
Ответов: 1008
 Web-сайт: sham.clan.su
 Профиль | | #10
Добавлено: 07.08.07 00:24
способ кайфный, но сложноватый... легче через GetObject(,Excel.Application), если он что-то возвращает - значит Close :)

Ответить

Номер ответа: 11
Автор ответа:
 art



Вопросов: 45
Ответов: 119
 Профиль | | #11 Добавлено: 07.08.07 14:50
Спасибо!
2 Александр: А подробнее? Хочу оба способа испробывать.

Ответить

Номер ответа: 12
Автор ответа:
 art



Вопросов: 45
Ответов: 119
 Профиль | | #12 Добавлено: 07.08.07 21:34
Всем огромное спасибо! Вроде пошло!

Ответить

Номер ответа: 13
Автор ответа:
 -АлександР-



Вопросов: 55
Ответов: 1008
 Web-сайт: sham.clan.su
 Профиль | | #13
Добавлено: 08.08.07 00:12
А подробнее? Хочу оба способа испробывать.
идея тут:
Option Explicit
  
Private exapp As Excel.Application
  
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.vbnet.ru/subscribe/showsubscribe.asp?id=37

А вообще... 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

Ответить

Страница: 1 |

Поиск по форуму



© Copyright 2002-2011 VBNet.RU | Пишите нам