Newsgroup: it.comp.lang.visual-basic
Titolo: gravissimo su CreateToolhelp32Snapshot

ho unproblema molto grave con la funzione in oggetto. mi serve per enumerare
i processi attivi.
su win98 funziona alla perfezione. su NT ho fatto la prima prova oggi, e mi
da l'errore "can't find entry point in kernel32.dll".
che puo significare?
MarioH

 ha scritto nel messaggio
news:98brdf$1982e$1...@ID-70152.news.dfncis.de...


 darsi che su win98 il file kernel32.dll abbia tale funzione e winNT no...
oh my god!!!!!!!! e come si fa in NT a enumerare i processi,
allora????????????
MarioH

Non saprei...
So solo che un'API mi ha dato lo stesso problema perchè la dichiaravo male e
VB non la trovava dentro la DLL che gli dicevo...
Mi Dispiace...
CiaoZ
SebaMix
[...]

 ha scritto:

La libreria ToolHelp e' presente solo in Win 9x e 2000, ma non in
WindowsNT.
Per enumerare i processi attivi sotto NT devi utilizzare le PSAPI. Cerca
su MSDN process status helper.
Ciao.


sapessi a me... ::))))))))
ho letto stamattina non ricordo se su VBAPI o AllApi che la funzione
create... nonfunziona su NT... che tragedia...!!!!!!!!!!!!!!
se qualcuno sa come enumerare i processi in NT mi aiuti, please...
MarioH

 NT mi aiuti, please...
Utilizzando le PSAPI.
Questo sistema NON restituisce i nomi dei processi: Idle, System, csrss,
e qualunque altro processo per cui vi siano particolari restrizioni da
fare fallire la chiamata a OpenProcess. Se questo crea problemi bisogna
leggere i nomi dal registro (in questo caso vengono restituiti tutti).
Private Const PROCESS_VM_READ = &H10
Private Const PROCESS_QUERY_INFORMATION = &H400
Private Declare Function EnumProcesses Lib "Psapi.dll" (ByVal idProcess
As Long, ByVal cb As Long, ByRef cbNeeded As Long) As Boolean
Private Declare Function EnumProcessModules Lib "Psapi.dll" (ByVal
hProcess As Long, ByVal hModule As Long, ByVal cb As Long, ByRef
cbNeeded As Long) As Boolean
Private Declare Function OpenProcess Lib "kernel32" (ByVal
dwDesiredAccess As Long, ByVal bInheritHandle As Long, ByVal dwProcessId
As Long) As Long
Private Declare Function CloseHandle Lib "kernel32" (ByVal hObject As
Long) As Long
Private 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 Boolean
Sub EnumProcesses()
    Dim ProcessesID(1023) As Long
    Dim cbNeeded As Long
    Dim NumProcesses As Long
    Dim i As Integer
    Call EnumProcesses(VarPtr(ProcessesID(0)), 1024, cbNeeded)
    NumProcesses = cbNeeded / Len(ProcessesID(0))
    For i = 0 To NumProcesses - 1
        Debug.Print GetProcessName(ProcessesID(i))
    Next
End Sub
Function GetProcessName(ByVal pID As Long) As String
    Dim hProcess As Long
    Dim hModule As Long
    Dim cbNeeded As Long
    Dim ModuleName As String
    hProcess = OpenProcess(PROCESS_QUERY_INFORMATION Or PROCESS_VM_READ,
False, pID)
    If (hProcess = 0) Then Exit Function
    Call EnumProcessModules(hProcess, hModule, Len(hModule), cbNeeded)
    ModuleName = Space(256)
    Call GetModuleBaseName(hProcess, hModule, ModuleName, 256)
    Call CloseHandle(hProcess)
    GetProcessName = Trim(ModuleName)
End Function
Ciao.

ti ringrazio per il codice. farò qualche prova.
solo una cosa. esattamente il ProcessModule che cosa rappresenta?
MarioH

 che cosa rappresenta?
Ogni dll caricata da un'applicazione fa parte del processo
dell'applicazione stessa. Quindi ogni processo puo' essere composto da
piu' moduli. Il primo e' sempre l'applicazione, gli altri sono le dll
(eventualmente) caricate da questa. La funzione EnumProcessModule li
enumera tutti (passandogli un array come ho fatto nella EnumProcesses),
ma per sapere il nome dell'applicazione basta ottenere il primo.
Ciao.


ah ok grazie