#1 Tue 25 August 2009 16:22
- François063
- Participant occasionnel
- Lieu: aubieres
- Date d'inscription: 20 Nov 2008
- Messages: 11
MapBasic obtenir en bytes la taille d'un type Array
Bonjour,
(MapBasic 7.5)
objectif: lister les processus actifs sur une plateforme windows, vérifier que celui qui m'intéresse est présent ou absent, agir en conséquence==>
sur le web j'ai pu trouver du source qui en traite, et je tente de l'adapter à mon utilisation
et c'est là que cela se corse
dans le cadre de l'utilisation de l'API (fonction Process32First)
j'ai besoin d'extraire le "SizeOf" de la variable Array (ProcessEntry) dans l'exemple
"SizeOf" est une fonction C qui donne (d'après ce que j'ai compris) l'encombrement mémoire de la variable visée
ET je ne trouve pas de fonction MapBasic qui permette cette opération
len (ProcessEntry) me renvoie un code d'erreur (ne s'applique pas à array)
Ubound (ProcessEntry) me donne une valeur qui ne convient pas à Process32First (pointeur de réussite systématiquement faux)
et donc...
je fait appel à vous
merci pour vos solutions
Hors ligne
#2 Tue 25 August 2009 17:51
- Damien BEAUSEIGNEUR
- Participant assidu
- Lieu: meyzieu
- Date d'inscription: 5 Sep 2005
- Messages: 425
Re: MapBasic obtenir en bytes la taille d'un type Array
Bonjour,
je ne vois pas d'autre solution que d'effectuer toi même le calcul...
Il me faut la taille de l'élément de base du tableau et ensuite le nombre d'élément de ce tableau.
Et la donc ta taille sera base* nombre d'élément.
Et une question en entrainant une autre ... c'est quoi la définition de processEntry???
cordialement...
Hors ligne
#3 Tue 25 August 2009 19:33
- François063
- Participant occasionnel
- Lieu: aubieres
- Date d'inscription: 20 Nov 2008
- Messages: 11
Re: MapBasic obtenir en bytes la taille d'un type Array
Bonsoir,
Merci pour votre réponse.
Donc la taille du tableau serait la somme des bytes occupés par chaque variable du type
dans mon cas 9 champs integer soit 9*4= 36 bytes + un champ car à 260 bytes
et donc un type qui augmenterait de 296 bytes par enregistrement ?
il n'y a rien qui encapsule le type ? genre début type / fin type qui viendrait utiliser de la mémoire supplémentaire ?
ci-dessous le code adapté à Mapbasic (je suis déboggué jusqu'à "bret" la suite peut être fausse...)
la definition du type est celle de "PROCESSENTRY32".
je vais de ce pas, tester si en initialisant pe32(1).dwSize à 296, j'ai une réponse valide sur "Process32First(hProcessSnap, pe32(1))"
cordialement
Code:
DEFINE MAX_PATH 260 Define TH32CS_SNAPPROCESS &h2 Type PROCESSENTRY32 dwSize As Integer cntUsage As Integer th32ProcessID As Integer th32DefaultHeapID As Integer th32ModuleID As Integer cntThreads As Integer th32ParentProcessID As Integer pcPriClassBase As Integer dwFlags As Integer szExeFile As String * MAX_PATH End Type Declare Function CreateToolhelp32Snapshot Lib "kernel32.dll" (ByVal dwFlags As Integer,ByVal th32ProcessID As Integer) As Integer Declare Function Process32First Lib "kernel32.dll" (ByVal hSnapshot As Integer, lppe As PROCESSENTRY32) As Logical Declare Function Process32Next Lib "kernel32.dll" (ByVal hSnapshot As Integer, lppe As PROCESSENTRY32) As Logical Declare Function CloseHandle Lib "kernel32" (hObject As Integer) As smallint Declare Sub AfficheProcessus() 'TocRenvois2.mb '****************************************************************************************** ' Sub procedure: AfficheProcessus pour l'instant liste les processus en mémoire (machine) ' Objectif vérifier qu'un processus est présent ou absent (puis agir en conséquence) '****************************************************************************************** Sub AfficheProcessus() Dim hThreadSnap As Integer Dim bRet As Logical Dim hProcessSnap As Integer Dim Clhd As SmallInt dim Pe32(1) As PROCESSENTRY32 hProcessSnap = CreateToolhelp32Snapshot (TH32CS_SNAPPROCESS, 0) print "hProcessSnap=" + hProcessSnap If hProcessSnap = -1 Then Exit Sub End If pe32(1).dwSize = Len(pe32()) bRet = Process32First(hProcessSnap, pe32(1)) print "bRet=" + bRet If bRet = 1 Then While (Process32Next(hProcessSnap, pe32(Ubound(pe32)+1))) Note pe32(Ubound(pe32)).szExeFile pe32(1).dwSize = Ubound(pe32) Wend End If Clhd = CloseHandle (hProcessSnap) End Sub
Hors ligne
#4 Wed 26 August 2009 08:05
- François063
- Participant occasionnel
- Lieu: aubieres
- Date d'inscription: 20 Nov 2008
- Messages: 11
Re: MapBasic obtenir en bytes la taille d'un type Array
Bonjour,
avec pe32(1).dwSize à 296
Process32First donne une réponse
reste à valider les résultats...
merci
à très bientôt (sûrement)
Hors ligne
#5 Wed 26 August 2009 11:06
- philmap
- Participant actif
- Date d'inscription: 27 Nov 2006
- Messages: 59
Re: MapBasic obtenir en bytes la taille d'un type Array
Cela ne suffirait pas ?:
Il est possible de lister les processus actifs sur une machine en utilisant les fonctions de l'API Windows
Mais il existe une astuce beaucoup plus simple à l'aide d'un petit script WMI, utilisant la classe Win32_process (testé sur Windows 2000, XP)
Private Sub Command1_Click()
Dim svc As Object
Dim sQuery As String
Dim oproc
On Error GoTo Command1_Click_Error
Set svc = GetObject("winmgmts:root\cimv2")
sQuery = "select * from win32_process"
For Each oproc In svc.execquery(sQuery)
Debug.Print oproc.Name & " = " & oproc.ExecutablePath
Next
Set svc = Nothing
Exit Sub
Command1_Click_Error:
MsgBox "Error " & Err.Number & " (" & Err.Description & ")"
Err.Clear
End Sub
Hors ligne
#6 Thu 27 August 2009 09:21
- François063
- Participant occasionnel
- Lieu: aubieres
- Date d'inscription: 20 Nov 2008
- Messages: 11
Re: MapBasic obtenir en bytes la taille d'un type Array
Bonjour,
Volontier mais, je ne suis pas familliarisé avec les scripts WMI...
le code ressemble à du VB, (auquel je n'ai pas acces)
la classe "Win32_process " doit-elle être déclarée comme les fonctions des API ? (pour une utilisation à partir de Map s'entend)
il est vrai que la simplicité serait préferable à çà (qui fonctionne maintenant)
Code:
DEFINE MAX_PATH 260 Define TH32CS_SNAPPROCESS &h2 Type PROCESSENTRY32 dwSize As Integer cntUsage As Integer th32ProcessID As Integer th32DefaultHeapID As Integer th32ModuleID As Integer cntThreads As Integer th32ParentProcessID As Integer pcPriClassBase As Integer dwFlags As Integer szExeFile As String * MAX_PATH End Type Declare Function CreateToolhelp32Snapshot Lib "kernel32.dll" (ByVal dwFlags As Integer,ByVal th32ProcessID As Integer) As Integer Declare Function Process32First Lib "kernel32.dll" (ByVal hSnapshot As Integer, lppe As PROCESSENTRY32) As Logical Declare Function Process32Next Lib "kernel32.dll" (ByVal hSnapshot As Integer, lppe As PROCESSENTRY32) As Logical Declare Function CloseHandle Lib "kernel32" (hObject As Integer) As smallint Declare Sub AfficheProcessus() 'TocRenvois2.mb '****************************************************************************************** ' Sub procedure: AfficheProcessus pour l'instant liste les processus en mémoire (machine) ' Objectif vérifier qu'un processus est présent ou absent (puis agir en conséquence) '****************************************************************************************** Sub AfficheProcessus() Dim i as Integer Dim hThreadSnap As Integer Dim bRet As Logical Dim hProcessSnap As Integer Dim Clhd As SmallInt dim Pe32(1) As PROCESSENTRY32 Dim ListProc(1) As PROCESSENTRY32 hProcessSnap = CreateToolhelp32Snapshot (TH32CS_SNAPPROCESS, 0) print "hProcessSnap=" + hProcessSnap If hProcessSnap = -1 Then Exit Sub End If pe32(1).dwSize = 296 bRet = Process32First(hProcessSnap, pe32(1)) print "bRet=" + bRet If bRet = 1 Then ListProc(1).dwSize = pe32(1).dwSize ListProc(1).cntUsage = pe32(1).cntUsage ListProc(1).th32ProcessID = pe32(1).th32ProcessID ListProc(1).th32DefaultHeapID = pe32(1).th32DefaultHeapID ListProc(1).th32ModuleID = pe32(1).th32ModuleID ListProc(1).cntThreads = pe32(1).cntThreads ListProc(1).th32ParentProcessID = pe32(1).th32ParentProcessID ListProc(1).pcPriClassBase = pe32(1).pcPriClassBase ListProc(1).dwFlags = pe32(1).dwFlags ListProc(1).szExeFile = pe32(1).szExeFile While (Process32Next(hProcessSnap, pe32(1))) Redim ListProc(Ubound(ListProc) + 1) ListProc(Ubound(ListProc)).dwSize = pe32(1).dwSize ListProc(Ubound(ListProc)).cntUsage = pe32(1).cntUsage ListProc(Ubound(ListProc)).th32ProcessID = pe32(1).th32ProcessID ListProc(Ubound(ListProc)).th32DefaultHeapID = pe32(1).th32DefaultHeapID ListProc(Ubound(ListProc)).th32ModuleID = pe32(1).th32ModuleID ListProc(Ubound(ListProc)).cntThreads = pe32(1).cntThreads ListProc(Ubound(ListProc)).th32ParentProcessID = pe32(1).th32ParentProcessID ListProc(Ubound(ListProc)).pcPriClassBase = pe32(1).pcPriClassBase ListProc(Ubound(ListProc)).dwFlags = pe32(1).dwFlags ListProc(Ubound(ListProc)).szExeFile = pe32(1).szExeFile Note pe32(Ubound(pe32)).szExeFile Wend End If Clhd = CloseHandle (hProcessSnap) for i = 1 to Ubound (ListProc) print "dwSize = " + ListProc(i).dwSize print "cntUsage = " + ListProc(i).cntUsage print "th32ProcessID = " + ListProc(i).th32ProcessID print "th32DefaultHeapID = " + ListProc(i).th32DefaultHeapID print "th32ModuleID = " + ListProc(i).th32ModuleID print "cntThreads = " + ListProc(i).cntThreads print "th32ParentProcessID = " + ListProc(i).th32ParentProcessID print "pcPriClassBase = " + ListProc(i).pcPriClassBase print "dwFlags = " + ListProc(i).dwFlags print "szExeFile = " + ListProc(i).szExeFile print "----------" Next End Sub
néamoins votre proposition m'attire, si sa mise en oeuvre peut être faite à partir de MapInfo
cordialement
Hors ligne
#7 Tue 01 September 2009 10:06
- philmap
- Participant actif
- Date d'inscription: 27 Nov 2006
- Messages: 59
Re: MapBasic obtenir en bytes la taille d'un type Array
Désolé, je n'ai pas MapInfo installé sur ce Pc, pour tester.
Le code fourni, copié-collé tel quel dans Vb, fonctionne parfaitement sans aucune déclaration particulière.
Dans Mi faut essayer...
Hors ligne