IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

VB 6 et antérieur Discussion :

Utiliser les fontions RAPI (CeGetClassName) dans VB6


Sujet :

VB 6 et antérieur

  1. #1
    Futur Membre du Club
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Novembre 2012
    Messages
    17
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués
    Secteur : Service public

    Informations forums :
    Inscription : Novembre 2012
    Messages : 17
    Points : 9
    Points
    9
    Par défaut Utiliser les fontions RAPI (CeGetClassName) dans VB6
    Bonjour à tous

    Je cherche désespéremment à utiliser la fonction RAPI CeGetClasseName qui est une fonction de la dll rapi.dll.
    Cette dll est en réalité un "morceau" de MS-ActiveSync qui me permet d’accéder à un système sous WinCE 4.2

    Le problème que je rencontre est un message du type "....la mémoire ne peut être written..." cette erreur provoque la fermeture de VB6 sans autre forme de proces.

    le prototype de cette fonction est :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Public Declare Function CeGetClassName Lib "rapi.dll" (ByVal hWnd As Long, ByVal lpString As String, nMaxCount As Integer) As Integer
    Rien de bien sorcier donc.

    pour utiliser cette fonction je procède de la manière suivante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
        Dim HdlNext As Long
        Dim lpClassName As String
        Dim nByte As Integer
     
    'recupere le handel de la prochaine window de meme niveau
     HdlNext = CeGetWindow(HdlPrev, GW_HWNDNEXT)
     
    'recupere la classe de l'objet
    nByte = CeGetWindowText(HdlNext, lpClassName, 25)
    J'ai pas mal cherché et essayé de trucs mais rien ne fonctionne. J'ai la très nette impression qu'il y a un conflit d'adressage au niveau des variables.

    Maintenant j'avoue que je sèche complètement.
    C'est bizarre car le fonction CegetWindows fonctionne parfaitement
    et j'arrive même à copier des fichiers sur le système mobile. (fonctions CeCopyFile) sans problème.
    Ceci dit il est vrai qu'à la base les arguments de la fonction cecopyfile sont de type LPCSTR...et non LPTSTR comme dans CeGetClassName...

    Merci de votre aide.

  2. #2
    Rédacteur
    Avatar de DarkVader
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2002
    Messages
    2 130
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2002
    Messages : 2 130
    Points : 3 118
    Points
    3 118
    Par défaut
    Bonjour,
    Tu poses la question de savoir comment utiliser CeGetClassName et ton exemple utilises CeGetWindow !
    On ne sait donc comment tu utilises CeGetClassName ?

    As-tu essayé avec
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    Public Declare Function CeGetClassName Lib "rapi.dll" (ByVal hWnd As Long, ByVal lpString As String, nMaxCount As Long) As Long
    
    Dim HdlNext As Long
    Dim lpClassName As String
    Dim nByte AsLong
     
    nByte=255
    lpClassName=space(nByte)
      
    'recupere la classe de l'objet
    nByte = CeGetclassname(HdlNext, lpClassName, nByte)
    lpClassname=left(lpClassname,nByte)
    ?

  3. #3
    Futur Membre du Club
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Novembre 2012
    Messages
    17
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués
    Secteur : Service public

    Informations forums :
    Inscription : Novembre 2012
    Messages : 17
    Points : 9
    Points
    9
    Par défaut Effectivement !
    Bonjour et merci pour votre réponse.

    Effectivement j'ai fait un copier / coller des plus foireux !

    C'est bien CegetClassName que j'utilise de la façon suivante (j'ai essayé plein de trucs mais rien ne marche, ça plante immanquablement, sûrement une execption)

    .
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    ...
    Public Declare Function CeGetClassName Lib "rapi.dll" (ByVal hWnd As Long, ByVal lpString As String, nMaxCount As Integer) As Integer
    .....
     
    dim Nomclasse as string
    dim ret as long
    dim hdl as long
    ......
    ....recup du handel sans pb....
     
    ret=cegetclassname(hdl, Nomclasse, 25)   '25 car je limite à 25 caracteres unicode le nom de la classe, mais 100 ou 200 plante aussi. donc il n'y est pour rien
    D’après la doc c'est un LPTSTR qui est attendu pour l'argument Nomclasse. C'est donc un pointeur sur un buffer qui contient de l'unicode.
    Si je n’initialise pas la variable Nomclasse j'ai un code erreur 87 en retour (mauvais paramètre)

    J'ai aussi essayé strptr(Nomclasse) à la place de NomClasse dans l'appel de fonction en déclarant la fonction de la sorte :
    Public Declare Function CeGetClassName Lib "rapi.dll" (ByVal hWnd As Long, ByVal lpString As long, nMaxCount As Integer) As Integer
    ça plante !

    Rien ne marche. Ce truc me rend fou !
    Le plus drôle c'est que la fonction GetClasseName de l'API windows fonctionne sans pb !!!!!

    Merci de votre aide.

  4. #4
    Rédacteur
    Avatar de DarkVader
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2002
    Messages
    2 130
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2002
    Messages : 2 130
    Points : 3 118
    Points
    3 118
    Par défaut
    Vous n'avez pas lu avec attention ma réponse notamment la déclaration de la fonction

  5. #5
    Futur Membre du Club
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Novembre 2012
    Messages
    17
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués
    Secteur : Service public

    Informations forums :
    Inscription : Novembre 2012
    Messages : 17
    Points : 9
    Points
    9
    Par défaut
    Citation Envoyé par DarkVader Voir le message
    Vous n'avez pas lu avec attention ma réponse notamment la déclaration de la fonction

    Bonjour,

    Merci de votre réponse.

    Eh oui, j'ai déjà essayé en long sur nbyte et long sur la valeur retournée.

    l'int je l'ai vu dans l'aide en ligne d'Embeded visual C++ 4 qui me détaille cette fonction.
    Ceci dit, c'est vrai que sur MSDN il est en "long".
    ma dll (rapi.dll) est en version 4.5.

    Merci quand même de votre aide.

    LS

  6. #6
    Futur Membre du Club
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Novembre 2012
    Messages
    17
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués
    Secteur : Service public

    Informations forums :
    Inscription : Novembre 2012
    Messages : 17
    Points : 9
    Points
    9
    Par défaut
    Rebonjour Dark.

    Je confirme, cela ne marche pas, ça plante aussi.

    Pour être sûr j'ai réessayé avec le bout de code et la déclaration.

    Cordialement.

    LS

  7. #7
    Futur Membre du Club
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Novembre 2012
    Messages
    17
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués
    Secteur : Service public

    Informations forums :
    Inscription : Novembre 2012
    Messages : 17
    Points : 9
    Points
    9
    Par défaut J'ai trouvé !
    Pour ceux que cela intéresse voici une façon de procéder qui fonctionne 100 fois/100 :

    Il faut déclarer la fonction GetClassName de la façon suivante :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Public Declare Function CeGetClassName Lib "rapi.dll" (ByVal hWnd As Long, ByVal lpString As String, ByVal nMaxCount As Integer) As Integer
    E l'utiliser de la façon suivante :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    Public Function GetClassName(Handel As Long) As String
     
     
        Dim lpclassName As String
        Dim Ncar As Integer
        Dim NcarMax 'ne pas typer cette variable sinon ça marche pas !
     
        On Error GoTo Erreur:
     
        '20 car UNICODE max !
        NcarMax = 20
        'init de la chaîne (pour envoi sur le stack)
        lpclassName = String((NcarMax * 2), "x")    '1 car UNICODE(2bytes) = 2 car ASCII(1byte)
     
        'récupère le nom de la classe de l'objet
        'et le nbr de caractères UNICODE qui composent le nom de la classe
        Ncar = CeGetClassName(Handel, lpclassName, NcarMax)
     
        If Ncar > 0 Then
            'supp des car non significatifs c-à-d les 0 et ceux surnuméraires
            lpclassName = UCase(UcdToAscii(Left(lpclassName, (Ncar * 2))))
            GetClassName = lpclassName
        Else
            GetClassName = "ERR"
        End If
     
        'Debug.Print "Hdl:" & Hex(Handel); " Ncar:" & Ncar & " lpclassname:" & lpclassName
     
        'fin normal
        Exit Function
     
    Erreur:
     
        GetClassName = CStr(CeGetLastError())
     
    End Function

    On peut passer de l'UNICODE à l'ASCII en utilisant cette petite fonction qui n'est pas des plus élégantes :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    Public Function UcdToAscii(UniTxt) As String
        'supprime les caractères 0
     
        Dim i As Integer
        Dim c As String
     
        UcdToAscii = ""
     
        If Len(UniTxt) = 0 Then Exit Function
     
        For i = 1 To Len(UniTxt)
     
            c = Mid(UniTxt, i, 1)
            If c <> Chr(0) Then
                UcdToAscii = UcdToAscii & c
            End If
     
        Next i
     
    End Function

    Bon voila en espérant que cela sera utile à ceux qui vont tomber sur le même pb que moi.
    Ce qui leur évitera bien des tracasseries.

    LS

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Utiliser les class du projet dans le plugin
    Par Shiftane dans le forum Eclipse Platform
    Réponses: 2
    Dernier message: 19/01/2007, 08h36
  2. Réponses: 3
    Dernier message: 09/01/2007, 09h44
  3. Utiliser les sessions de phbBB dans d'autres pages
    Par charliejo dans le forum Langage
    Réponses: 2
    Dernier message: 27/05/2006, 08h55
  4. Utiliser les options qui sont dans ma table
    Par valery17 dans le forum Access
    Réponses: 1
    Dernier message: 21/04/2006, 22h45
  5. Réponses: 8
    Dernier message: 17/12/2004, 15h58

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo