Visual Basic, .NET, ASP, VBScript
 

   
   
     

Форум - Работа с данными

Страница: 1 |

 

  Вопрос: Не глюк ли? Добавлено: 06.10.05 16:30  

Автор вопроса:  NikolaY | ICQ: 244102788 
Почему ниже приведенный код не удаляет процесс EXCEL.EXE из памяти?
    Dim a As Excel.Application
    Dim b As Excel.Workbook
    Dim s As Excel.Worksheet
    '
    Set a = New Excel.Application
    Set b = a.Workbooks.Add
    Set s = b.Worksheets(1)
    '
    b.Activate
    s.Activate
    '
    ' ...здесь делаем всё, что надо...
    '
    a.Quit
Как это побороть?
Заранее благодарен!

Ответить

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

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


 

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

Вопросов: 236
Ответов: 8362
 Профиль | | #1 Добавлено: 06.10.05 20:50

' <МОДУЛЬ ДЛЯ ОБРАБОТКИ ЗАПУЩЕННЫХ ПРОЦЕССОВ В СИСТЕМЕ>     |
'                                                           |
' = = = = = = = M A D E   B Y   H A C K E R = = = = = =     |
'         icq: 334479038, mail: no_detect@mail.ru              |
'===========================================================|

Public proc As PROCESSENTRY32, Snap As Long

Public Declare Function CreateToolhelpSnapshot Lib "kernel32" Alias "CreateToolhelp32Snapshot" (ByVal lFlags As Long, ByVal lProcessID As Long) As Long
Public Declare Function ProcessFirst Lib "kernel32" Alias "Process32First" (ByVal hSnapshot As Long, uProcess As PROCESSENTRY32) As Long
Public Declare Function ProcessNext Lib "kernel32" Alias "Process32Next" (ByVal hSnapshot As Long, uProcess As PROCESSENTRY32) As Long
Public Declare Function TerminateProcess Lib "kernel32" (ByVal hProcess As Long, ByVal uExitCode As Long) As Long
Public Declare Function OpenProcess Lib "kernel32" (ByVal dwDesiredAccess As Long, ByVal bInheritHandle As Long, ByVal dwProcessId As Long) As Long
Public Declare Function CloseHandle Lib "kernel32" (ByVal hObject As Long) As Long
Public Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)

Public Const TH32CS_SNAPPROCESS = &H2, TH32CS_SNAPheaplist = &H1, TH32CS_SNAPthread = &H4, TH32CS_SNAPmodule = &H8, TH32CS_SNAPall = TH32CS_SNAPPROCESS + TH32CS_SNAPheaplist + TH32CS_SNAPthread + TH32CS_SNAPmodule, MAX_PATH As Integer = 260

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

Dim mass() As Long
Dim NP() As String

Public Sub KillProc(ArryProsess$())
'Убивает все процессы которые даны в массиве
ReDim mass(0)
ReDim NP(0)

On Error Resume Next
    Snap = CreateToolhelpSnapshot(TH32CS_SNAPall, 0)
    proc.dwSize = Len(proc)
    TheLoop = ProcessFirst(Snap, proc)
    Index = 0
    While TheLoop <> 0
        NP$(Index) = Replace(proc.szexeFile, Right(proc.szexeFile, 1), "";)
        mass(Index) = proc.th32ProcessID
        Index = Index + 1
        ReDim Preserve NP(Index)
        ReDim Preserve mass(Index)
        TheLoop = ProcessNext(Snap, proc)
    Wend
    CloseHandle Snap

For i% = 0 To UBound(ArryProsess$)
Kick$ = ArryProsess$(i%)

For q% = 0 To Index
    
    If LCase(Left(Spliting(NP$(q%), "\";), Len(Kick$))) = LCase(Kick$) Then
        openproc = OpenProcess(1, 0, mass(q%))
        term = TerminateProcess(openproc, -9)
    End If
Next q%
Next i%

End Sub

Ответить

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



Вопросов: 0
Ответов: 1876


 Профиль | | #2 Добавлено: 06.10.05 21:10
Ох жуть какая...

Excel любит на выходе вопросы задавать. Если при этом он невидимый, то вопрос будет висеть вечно.
Соответственно, нужно предустмотреть выход с предварительным сохранением или с явным отказом от сохранения...

Ответить

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



Вопросов: 0
Ответов: 1066
 Профиль | | #3 Добавлено: 07.10.05 01:24
В Ворде такая же ерунда: перед закрытием выдаёт запрос на сохранение файла. Пока не ответишь - будет висеть в памяти :( Думаю такая же история и в Excel.
Я его смог победить только явно указав перед выгрузкой : сохранить файл. Неважно куда, лишь бы сохранить :) Чтобы не приставал своими тупыми вопросами.

Ответить

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



Вопросов: 0
Ответов: 1876


 Профиль | | #4 Добавлено: 07.10.05 01:31
Дык Ворде метод quit имеет параметр, обрати на него внимание...
А в экселе у каждой книги есть проперть saved, которая отнюдь не read-only...

Ответить

Номер ответа: 5
Автор ответа:
 Mihalыch



ICQ: 373-509-101 

Вопросов: 56
Ответов: 330
 Профиль | | #5 Добавлено: 07.10.05 03:22
Попробуй сделать так:

Dim a As Excel.Application
    Dim b As Excel.Workbook
    Dim s As Excel.Worksheet
    '
    Set a = New Excel.Application
    Set b = a.Workbooks.Add
    Set s = b.Worksheets(1)
    '
    b.Activate
    s.Activate
    '
    ' ...здесь делаем всё, что надо...
    '
    a.Quit
    Set a = Nothing

Ответить

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



ICQ: 244102788 

Вопросов: 4
Ответов: 4
 Профиль | | #6 Добавлено: 07.10.05 10:39
Огромное СПАСИБО всем кто ответил!!!
Сейчас буду пробовать.

Ответить

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



Вопросов: 0
Ответов: 1876


 Профиль | | #7 Добавлено: 07.10.05 12:06
Mihalыch, этим ты добьёшься того, что excel будет висеть в памяти совсем всегда, потому что он не только не вышел, но ещё и указателей на него не осталось.

Ответить

Номер ответа: 8
Автор ответа:
 Mihalыch



ICQ: 373-509-101 

Вопросов: 56
Ответов: 330
 Профиль | | #8 Добавлено: 07.10.05 13:23
GSerg, ты попробуй...

Ответить

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



Вопросов: 0
Ответов: 1876


 Профиль | | #9 Добавлено: 07.10.05 16:04
А чё тут пробовать...

Private Sub Form_Load()
  Dim xl As Object
  
  Set xl = CreateObject("Excel.Application";)
  xl.workbooks.Add.worksheets(1).cells(1, 1).Value = "Изменяем книгу"
  xl.quit
  Set xl = Nothing
    
  'Теперь смотрим в список процессов.
End Sub

Ответить

Номер ответа: 10
Автор ответа:
 Слегач



Вопросов: 3
Ответов: 6
 Профиль | | #10 Добавлено: 07.10.05 16:24
Ага, какая знакомая проблема... В развитие сюжета:

Private Sub Command1_Click()
    '
    ;Dim a As Excel.Application
    ;Dim b As Excel.Workbook
    ;Dim w As Excel.Worksheet
    '
    Set a = New Excel.Application
    Set b = a.Workbooks.Open (pathname)
    Set w = b.Worksheets(sheetname)
    '
    b.Activate
    w.Activate
    '
    ' ...здесь делаем всё, что надо...
    '
    b.Close
    a.Quit
    Set a = Nothing
    Set b = Nothing
    Set w = Nothing
    '
End Sub



Работает. Но!

Private Sub Command1_Click()
    '
    ;Dim a As Excel.Application
    ;Dim b As Excel.Workbook
    ;Dim w As Excel.Worksheet
    '
    Set a = New Excel.Application
    Set b = a.Workbooks.Add
    Set w = b.Worksheets(sheetname)
    '
    b.Activate
    w.Activate
    '
    ' ...здесь делаем всё, что надо...
    '
    b.SaveAs (PathName)
    b.Close
    a.Quit
    Set a = Nothing
    Set b = Nothing
    Set w = Nothing
    '
End Sub


Excel опять же остается висеть в памяти... Хрень полная...

Ответить

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



Вопросов: 0
Ответов: 1876


 Профиль | | #11 Добавлено: 07.10.05 16:35
А вы самой первой командой сделайте эксель видимым, сразу всё станет ясно...

Ответить

Страница: 1 |

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



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