banniere

Le portail francophone de la géomatique


Toujours pas inscrit ? Mot de passe oublié ?
Nom d'utilisateur    Mot de passe              Toujours pas inscrit ?   Mot de passe oublié ?

#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) sad
et donc...

je fait appel à vous big_smile

merci pour vos solutions


Fichier(s) joint(s) :
Pour accéder aux fichiers vous devez vous inscrire.

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

 

Pied de page des forums

Powered by FluxBB