发信人: 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
---- 天行健,君子以自强不息
|
|