Set ppt = nothingppt:所创建的PowerPoint对象

解决方案 »

  1.   

    Public powerfile As PowerPoint.Presentation
    Set powerfile = GetObject("c:\Exam\PowerPoint1\Exam.ppt")For i = 1 To powerfile.Slides.Count
    ....
    next iset powerfile=nothing但是进程管理器中仍然留有powerpnt.exe,导致后续程序无法进行
      

  2.   

    Option Explicit
    '察看Win2000的进程列表
    Public Const MAX_PATH = 260Public Declare Function OpenProcess Lib "kernel32" (ByVal dwDesireAccess As Long, ByVal vInheritHandle As Long, ByVal dwProcessId As Long) As Long
    Public Declare Function EnumProcesses Lib "PSAPI.DLL" (idProcess As Long, ByVal cBytes As Long, cbNeeded As Long) As Long
    Public Declare Function EnumProcessModules Lib "PSAPI.DLL" (ByVal hPorcess As Long, hModule As Long, ByVal cb As Long, cbNeeded As Long) As Long
    Public Declare Function GetModuleBaseName Lib "PSAPI.DLL" Alias "GetModuleBaseNameA" (ByVal hProcess As Long, ByVal hModule As Long, ByVal lpBaseName As String, ByVal nSize As Long) As Long
    Public Declare Function GetModuleFileNameEx Lib "PSAPI.DLL" Alias "GetModuleFileNameExA" (ByVal hProcess As Long, ByVal hModule As Long, ByVal lpFilname As String, byvalnSize As Long) As Long
    Public Declare Function TerminateProcess Lib "kernel32" (ByVal hProcess As Long, ByVal uExitCode As Long) As Long
    Public Declare Function CloseHandle Lib "kernel32" (ByVal hObject As Long) As Long
    Public Declare Function GetExitCodeProcess Lib "kernel32" (ByVal hProcess As Long, ByRef lpExitCode As Long) As Long
    'Public Declare Sub ExitProcess Lib "kernel32" (ByVal uExitCode As Long)
    'Public Declare Function GetLastError Lib "kernel32" () As LongPublic Const STANDARD_RIGHTS_REQUITED = &HF0000
    Public Const SYNCHRONIZE = &H100000
    Public Const PROCESS_VM_READ = &H10
    Public Const PROCESS_QUERY_INFORMATION = &H400
    Public Const PROCESS_ALL_ACCESS = STANDARD_RIGHTS_REQUITED Or SYNCHRONIZE Or &HFFF
    Public Function GetWin2KProcessID(sFQEXEName As String, sEXEName As String, ByRef cMatches As Long) As Long
    '从这个EXE名称或从全限定名(路径/名称)得到进程标识符
    'EXE名称
    'If sFQName<>"" 那用它来匹配
    'If sName<>""   仅使用名称来匹配
    '如果进程不存在返回0,否则返回最后匹配的进程标识符
    '返回输出参数cMatches中的匹配数
    '如果sFQName和sName都是空的,值为-1
    '如果得到进程列表错误则为-2Dim i As Integer, j As Integer, l As Integer
    Dim cbNeeded As Long
    Dim hEXE As Long
    Dim hProcess As LongDim lret As Long
    Dim cProcesses As Long
    Dim lProcessIDs() As Long
    Dim sEXENames() As String
    Dim sFQEXENames() As String'----------------------------------
    '获取进程ID数组
    '----------------------------------
    '初始值
    cProcesses = 25Do
        '定数组大小
        ReDim lProcessIDs(1 To cProcesses)
        '枚举
        lret = EnumProcesses(lProcessIDs(1), cProcesses * 4, cbNeeded)
        If lret = 0 Then
            GetWin2KProcessID = -2
            Exit Function
        End If
        '将需要的字节数和数组的字节大小比较
        '如果少,那么我们得到全部字节
        If cbNeeded < cProcesses * 4 Then
            Exit Do
        Else
            cProcesses = cProcesses * 2
        End If
    LoopcProcesses = cbNeeded / 4ReDim Preserve lProcessIDs(1 To cProcesses)
    ReDim sEXENames(1 To cProcesses)
    ReDim sFQEXENames(1 To cProcesses)'----------------------------------
    '获取EXE文件名
    '----------------------------------
    For i = 1 To cProcesses
        '使用OpenProcess得到每一个进程的句柄
        hProcess = OpenProcess(PROCESS_ALL_ACCESS, 0&, lProcessIDs(i))
        
        '注意特殊的句柄
        Select Case lProcessIDs(i)
            Case 0      'System Idle Process
                sEXENames(i) = "Idle Process"
                sFQEXENames(i) = "Idle Process"
            Case 8
                sEXENames(i) = "System"
                sFQEXENames(i) = "System"
            Case 164
                sEXENames(i) = "csrss.exe"
                sFQEXENames(i) = "csrss.exe"
        End Select
        
        'If essor skip this process
        If hProcess = 0 Then
            GoTo hpContinue
        End If
        
        '得到这个进程中第一个模块的句柄
        '因为这是一个EXE
        hEXE = 0
        lret = EnumProcessModules(hProcess, hEXE, 4&, cbNeeded)
        If hEXE = 0 Then GoTo hpContinue
        
        '得到这个模块的名称
        sEXENames(i) = String$(MAX_PATH, Chr$(0))    lret = GetModuleBaseName(hProcess, hEXE, sEXENames(i), Len(sEXENames(i)))
        sEXENames(i) = Left$(sEXENames(i), lret)
        
        '得到完整的路径名
        sFQEXENames(i) = String$(MAX_PATH, Chr$(0))
        lret = GetModuleFileNameEx(hProcess, hEXE, sFQEXENames(i), Len(sFQEXENames(i)))
        sFQEXENames(i) = Left$(sFQEXENames(i), lret)
        
    hpContinue:
        
        '关闭句柄
        lret = CloseHandle(hProcess)
        
    Next'----------------------------------
    '匹配检查
    '----------------------------------cMatches = 0
    If sFQEXEName <> "" Then
        For i = 1 To cProcesses
            If LCase$(sFQEXENames(i)) = LCase$(sFQEXEName) Then
                cMatches = cMatches + 1
                GetWin2KProcessID = lProcessIDs(i)
            End If
        Next
    ElseIf sEXEName <> "" Then
        For i = 1 To cProcesses
        
            If LCase$(sEXENames(i)) = LCase$(sEXEName) Then
                cMatches = cMatches + 1
                GetWin2KProcessID = lProcessIDs(i)
                sFQEXEName = sFQEXENames(i)
            End If
        Next
    Else
        GetWin2KProcessID = -1
    End IfEnd Function