精华区 [关闭][返回]

当前位置:网易精华区>>讨论区精华>>编程开发>>● VFP>>〖外部引用〗>>在VFP中关闭进程

主题:在VFP中关闭进程
发信人: foxzz()
整理人: foxzz(2004-10-12 09:34:53), 站内信件
调用方法:? killprocess("MYPROJ.EXE")

*!***********************************************
FUNC killprocess
PARAMETERS p_KillName

#Define TH32CS_SNAPPROCESS  2 

Declare INTEGER CreateToolhelp32Snapshot IN kernel32 INTEGER lFlags , INTEGER lProcessID
Declare INTEGER Process32First IN kernel32  INTEGER hSnapShot , STRING @uProcess
Declare INTEGER Process32Next  IN kernel32 INTEGER hSnapShot ,STRING @uProcess
Declare INTEGER TerminateProcess IN kernel32 INTEGER ApphProcess, INTEGER uExitCode
Declare INTEGER OpenProcess IN kernel32 INTEGER dwDesiredAccess , INTEGER bInheritHandle, INTEGER dwProcessId 
Declare INTEGER CloseHandle IN kernel32 INTEGER hObject

local rProcessFound,hSnapShot,szExename,exitCode,myProcess ,iFound 

LOCAL KillApp
KillApp = 0
 
LOCAL louProcess, hPrinter, lcSrvName, lcPrnName, lcDrvName, lcStr
louProcess = CREATE("struct_PROCESSENTRY32")

louProcess.fld('dwSize') = 296

lcBuff = louProcess.Structure


hSnapShot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0)
rProcessFound = Process32First(hSnapShot, @lcBuff)

LOCAL M_szExeFile,M_th32ProcessID,m_lnVal
Do While rProcessFound  <> 0
    m_lnVal = SUBSTR(lcBuff,37,260)
    M_szExeFile= fTypeToVal(m_lnVal,"STRING")
    
   iFound = at(Chr(0), M_szExeFile)
   If iFound > 0 
      szExename = upper(Left(M_szExeFile, iFound))
       
      If LEFT(szExename, Len(p_KillName)) = upper(p_KillName) 
             
         m_lnVal = SUBSTR(lcBuff,9,4)
         M_th32ProcessID = fTypeToVal(m_lnVal,"LONG")
         myProcess = OpenProcess(1, 0, M_th32ProcessID)
         KillApp = TerminateProcess(myProcess, exitCode)
         =CloseHandle(myProcess)
      EndIf
    EndIf
    rProcessFound = Process32Next(hSnapShot, @lcBuff)
enddo

=CloseHandle(hSnapShot)
    
return KillApp




*!******************************************************************
DEFINE CLASS struct_PROCESSENTRY32 AS Struct_William
  PROCEDURE Init
    THIS.AddField( 'dwSize', 'LONG', 0 )
    THIS.AddField( 'cntUsage', 'LONG', 0 )
    THIS.AddField( 'th32ProcessID', 'LONG', 0 )
    THIS.AddField( 'th32DefaultHeapID', 'LONG', 0 )
    THIS.AddField( 'th32moduleID', 'LONG', 0 )
    THIS.AddField( 'cntThreads', 'LONG', 0 )
    THIS.AddField( 'th32ParentProcessID', 'LONG', 0 )
    THIS.AddField( 'pcPriClassBase', 'LONG', 0)
    THIS.AddField( 'dwFlags', 'LONG', 0)
    THIS.AddField( 'szExeFile', 'STRING', SPACE(260)  )
  ENDPROC
ENDDEFINE



****************************************************************************
DEFINE CLASS Struct_William AS Session
*DEFINE CLASS Struct_William 

* Author: William GC Steinford
* Purpose: This class simplifies creating structures to pass to Api routines,
* and retrieving values out of structures changed by Api routines.
* Usage: Just subclass this class, and override the Init event, calling
* AddField( 'fieldname', 'type', starting_value )
* once for each field in the structure.
* Notes: PCHAR fields are automatically allocated, destroyed, and de-referenced
* whenever needed.
* Sub-Structures can be handled by defining them as an "@STRING",
* creating a second class/object for the substructure,
* then assigning the sub-structure's ".Structure" property
* to the parent structure's @STRING field
*
  DIMENSION arrFields[1,5]
  DIMENSION Fld[1]
  && Name, Type, Pos, Len, MemAddr
  FieldCount = 0
  Structure = ''
  DataSession = 1 && Default DataSession
  
  FUNCTION AddField( pcField, pcType, pvValue )
    LOCAL lcEnc
    THIS.FieldCount = THIS.FieldCount + 1
    DIMENSION THIS.arrFields[THIS.FieldCount,5]
    THIS.arrFields[THIS.FieldCount,1] = upper(pcField)
    THIS.arrFields[THIS.FieldCount,2] = pcType
    THIS.arrFields[THIS.FieldCount,3] = LEN(THIS.Structure)+1
    THIS.arrFields[THIS.FieldCount,4] = THIS.TypeLen(pcType,pvValue)
    lcEnc = THIS.ValToType(pvValue,pcType,THIS.arrFields[THIS.FieldCount,4])
    THIS.Structure = THIS.Structure + lcEnc
  ENDFUNC

  FUNCTION TypeLen( pcType, pvVal )
    DO CASE
      CASE Inlist(upper(pcType),'INTEGER','WORD')
        RETURN 2
      CASE Inlist(upper(pcType),'LONG','DOUBLE','DWORD')
        RETURN 4
      CASE Inlist(upper(pcType),'@STRING')
        RETURN 4
      CASE Inlist(upper(pcType),'STRING')
        RETURN len(pvVal)
    ENDCASE
  ENDFUNC

  FUNCTION ValToType( pvVal, pcType, pnLen )
    * Convert a value of the given type to the Struct Encoding
    LOCAL lnRet
    DO CASE
      CASE Inlist(upper(pcType),'INTEGER','WORD')
        ASSERT Type('pvVal')='N' MESSAGE "Incorrect Type"
        RETURN Chr(MOD(pvVal,256)) + CHR(INT(pvVal/256))
      CASE Inlist(upper(pcType),'LONG','DOUBLE','DWORD')
        ASSERT Type('pvVal')='N' MESSAGE "Incorrect Type"
        #DEFINE m0 256
        #DEFINE m1 65536
        #DEFINE m2 16777216
        LOCAL b0, b1, b2, b3
        b3 = Int(pvVal/m2)
        b2 = Int((pvVal - b3*m2)/m1)
        b1 = Int((pvVal - b3*m2 - b2*m1)/m0)
        b0 = Mod(pvVal, m0)
        RETURN Chr(b0)+Chr(b1)+Chr(b2)+Chr(b3)
      CASE upper(pcType)='STRING'
        ASSERT Type('pvVal')='C' MESSAGE "Incorrect Type"
        RETURN PadR(pvVal,pnLen,chr(0))
      CASE upper(pcType)='@STRING'
        ASSERT Type('pvVal')='C' MESSAGE "Incorrect Type"
        if len(pvVal)=1 and asc(pvVal)=0 && NULL pointer
          RETURN THIS.ValToType(0,'LONG')
        endif
        Declare LONG GlobalAlloc IN "kernel32" LONG wFlags, LONG dwBytes
        lnRet = GlobalAlloc(0,len(pvVal))
        Declare LONG RtlMoveMemory IN "kernel32" ;
          LONG ptrIntoHere, STRING @ cFromHere, LONG cb
        RtlMoveMemory(lnRet,@pvVal,len(pvVal))
        RETURN THIS.ValToType(lnRet,'LONG')
    ENDCASE
  ENDFUNC

  FUNCTION TypeToVal( pcVal, pcType )
    * Convert a struct encoded Type back to it's original value
    LOCAL lnPtr, lcRet
    DO CASE
      CASE Inlist(upper(pcType),'INTEGER','WORD')
        RETURN Asc(SUBSTR(pcVal, 1,1)) + ;
               Asc(SUBSTR(pcVal, 2,1)) * 256
      CASE Inlist(upper(pcType),'LONG','DOUBLE','DWORD')
        RETURN Asc(SUBSTR(pcVal, 1,1)) + ;
               Asc(SUBSTR(pcVal, 2,1)) * 256 +;
               Asc(SUBSTR(pcVal, 3,1)) * 65536 +;
               Asc(SUBSTR(pcVal, 4,1)) * 16777216
      CASE upper(pcType)='STRING'
        RETURN pcVal
      CASE upper(pcType)='@STRING'
        lnPtr = THIS.TypeToVal( pcVal, 'LONG' )
        Declare LONG GlobalSize IN "Kernel32" LONG HGLOBAL_hMem
        lnLen = GlobalSize(lnPtr)
        ASSERT lnLen>0 MESSAGE "Could not determine length of string."
        lcRet = SPACE(lnLen)
        Declare LONG RtlMoveMemory IN "kernel32" ;
          STRING @ cIntoHere, LONG ptrFromHere, LONG cb
        RtlMoveMemory(@lcRet,lnPtr,lnLen)
        RETURN lcRet
    ENDCASE
  ENDFUNC

  FUNCTION Fld_Access( pncIdx )
    LOCAL lnIdx, lnVal
    if type('pncIdx')='N'
      lnIdx = pncIdx
    else
      ASSERT type('pncIdx')='C' MESSAGE "Must provide numeric or character Index!"
      lnIdx = ASCAN(THIS.arrFields,upper(pncIdx))
      ASSERT lnIdx>0 MESSAGE "Field not found"
      lnIdx = ASUBSCRIPT(THIS.arrFields,lnIdx,1)
    endif
    lnVal = SUBSTR(THIS.Structure,THIS.arrFields[lnIdx,3],THIS.arrFields[lnIdx,4])
    
    RETURN THIS.TypeToVal(lnVal,THIS.arrFields[lnIdx,2])
  ENDFUNC

  FUNCTION Fld_Assign( pvNewVal, pncIdx )
    LOCAL lcBuf, lnIdx, lnVal, lcNewVal, lnPtr
    if type('pvNewVal.Structure')='C' && substructure... take string version
      lcNewVal = pvNewVal.Structure
    else
      lcNewVal = pvNewVal
    endif
    if type('pncIdx')='N'
      lnIdx = pncIdx
    else
      ASSERT type('pncIdx')='C' MESSAGE "Must provide numeric or character Index!"
      lnIdx = ASCAN(THIS.arrFields,upper(pncIdx))
      ASSERT lnIdx>0 MESSAGE "Field not found"
      lnIdx = ASUBSCRIPT(THIS.arrFields,lnIdx,1)
    endif
    if THIS.arrFields[lnIdx,2]='@STRING'
      Declare LONG GlobalFree IN "kernel32" LONG hmem
      THIS.arrFields[lnIdx,2] = 'LONG' && Not going to be a pointer much longer.
      lnPtr = THIS.fld[lnIdx] && get it as a LONG pointer
      THIS.arrFields[lnIdx,2] = '@STRING'
      if lnPtr>0
        GlobalFree(lnPtr)
      endif
    endif
    lcBuf = THIS.ValToType(lcNewVal,THIS.arrFields[lnIdx,2],THIS.arrFields[lnIdx,4])
    THIS.Structure = STUFF( THIS.Structure, THIS.arrFields[lnIdx,3], THIS.arrFields[lnIdx,4], lcBuf )
  ENDFUNC
  
  FUNCTION Destroy
    LOCAL lnI, lnPtr
    Declare LONG GlobalFree IN "kernel32" LONG hmem
    for lnI = 1 to THIS.FieldCount
      if THIS.arrFields[lnI,2]='@STRING'
        THIS.arrFields[lnI,2] = 'LONG' && Not going to be a pointer much longer.
        lnPtr = THIS.fld[lnI] && get it as a LONG pointer
        GlobalFree(lnPtr) && Now, it really is no longer a pointer
      endif
    endfor
  ENDFUNC
ENDDEFINE





----
天行健,君子以自强不息
 

[关闭][返回]