#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 SubHors 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 Subné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


