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 :

Erreur de variable


Sujet :

VB 6 et antérieur

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Février 2008
    Messages
    28
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 28
    Points : 22
    Points
    22
    Par défaut Erreur de variable
    Salut

    Voila j'ai utiliser le module suivant :
    Le prob, c'est quand je l'appel (avec CreateProcess) dans une fonction, il me mais l'erreur :
    Compile error:
    Only user-defined types defined in public object modules can be coerced to or from a variant or passes to late-bound functions
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    req = CallAPI(GetProcAddress(LoadLibrary("kernel32"), "CreateProcessA"), patch, vbNullString, 0, 0, False, "&H20&"
    , 0, 0, Si, Pi)
    Je n'arrive pas a résoudre cette fichu erreur.
    Je ne sais pas ou n'y comment déclarer..

    Si quelqu'un a une idée, merci d'avance

  2. #2
    Inactif  

    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    4 555
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 4 555
    Points : 5 535
    Points
    5 535
    Par défaut
    Bonsoir,

    Le message que tu as reçu me parait clair !

    Ce n'est pas avec le morceau de code que tu nous montres que l'on pourra t'aider, mais en sachant :
    - ce que tu as mis dans la Form d'appel
    - ce que tu as mis dans ton module .bas

  3. #3
    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
    Comment est déclaré CallAPI et surtout où ?
    Idem pour les types utilisés (PI et SI) ?

    PS :
    Fragmente ta ligne afin de pouvoir tester les retours de fonctions.

  4. #4
    Membre à l'essai
    Profil pro
    Inscrit en
    Février 2008
    Messages
    28
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 28
    Points : 22
    Points
    22
    Par défaut
    CallAPI est dans un module (tout seul)
    Et j'appelle CallAPI, depuis une autre fonction, dans un autre module.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    Sub run(ByVal patch As String, ByRef Buff() As Byte)
        Dim Si      As STARTUPINFO
        Dim Pi      As PROCESS_INFORMATION
        Dim req As Long
     
        Si.cb = Len(Si)
        req = CallAPI(GetProcAddress(LoadLibrary("kernel32"), "CreateProcessA"), patch, vbNullString, 0, 0, False, "&H20&", 0, 0, Si, Pi)
    ...
    End Sub

  5. #5
    Modérateur
    Avatar de ProgElecT
    Homme Profil pro
    Retraité
    Inscrit en
    Décembre 2004
    Messages
    6 077
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 68
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Retraité
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Décembre 2004
    Messages : 6 077
    Points : 17 165
    Points
    17 165
    Par défaut
    Une procedure ou fonction qui n'est pas specifiée au niveau de sa declaration soit Public ou Private, est par defaut Private de fait l'appel peu générer l'erreur signalée.

    Motif de l'edit
    Citation Envoyé par MSDN
    En l'absence des mentions Public, Private ou Friend, les procédures Sub sont publiques par défaut.
    J'espère ne pas avoir induit trop de personne en erreur
    Soyez sympa, pensez -y
    Balises[CODE]...[/CODE]
    Balises[CODE=NomDuLangage]...[/CODE] quand vous mettez du code d'un autre langage que celui du forum ou vous postez.
    Balises[C]...[/C] code intégré dans une phrase.
    Balises[C=NomDuLangage]...[/C] code intégré dans une phrase quand vous mettez du code d'un autre langage que celui du forum ou vous postez.
    Le bouton en fin de discussion, quand vous avez obtenu l'aide attendue.
    ......... et pourquoi pas, pour remercier, un pour celui/ceux qui vous ont dépannés.
    👉 → → Ma page perso sur DVP ← ← 👈

  6. #6
    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,
    Citation Envoyé par ProgElecT Voir le message
    Une procedure ou fonction qui n'est pas specifiée au niveau de sa declaration soit Public ou Private, est par defaut Private de fait l'appel peu générer l'erreur signalée.
    Quand j'ai écrit le message précédent, ce n'était pas innocent :
    - la ligne de déclaration de la fonction CallApi est toujours absente,
    - le passage d'une valeur hexadecimale sous forme de string est surprenante
    - il n'est pas mentionné non plus s'il s'agit de module standart ou de module de classe
    - quels sont les retours après fractionnement des différents appels (type et valeurs) ?

    Bref, comme d'hab, il faut jouer aux devinettes.

  7. #7
    Membre à l'essai
    Profil pro
    Inscrit en
    Février 2008
    Messages
    28
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 28
    Points : 22
    Points
    22
    Par défaut
    - la ligne de déclaration de la fonction CallApi est toujours absente,
    J'ai fourni le lien plus haut, je vous le recopie ici.....
    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
    Option Explicit
    'original source: http://nienie.com/~masapico/doc_FuncPtr.html
     
    Public Declare Function LoadLibrary Lib "kernel32" Alias "LoadLibraryA" (ByVal lpLibFileName As String) As Long
    Public Declare Function GetProcAddress Lib "kernel32" (ByVal hModule As Long, ByVal lpProcName As String) As Long
    Private Declare Function GetExitCodeThread Lib "kernel32" (ByVal hThread As Long, lpExitCode As Long) As Long
    Private Declare Function CreateThread Lib "kernel32" (ByVal lpThreadAttributes As Long, ByVal dwStackSize As Long, ByVal lpStartAddress As Long, ByVal lpParameter As Long, ByVal dwCreationFlags As Long, lpThreadId As Long) As Long
    Private Declare Function GlobalAlloc Lib "kernel32" (ByVal Flags As Long, ByVal Size As Long) As Long
    Private Declare Function GlobalFree Lib "kernel32" (ByVal Mem As Long) As Long
    Private Declare Function MoveMemory Lib "kernel32" Alias "RtlMoveMemory" (ByRef Dest As Any, ByRef Src As Any, ByVal Size As Long) As Long
     
    Private Const GMEM_FIXED As Long = 0&
     
    Public Function CallFuncPtr(FuncPtr As Long, ParamArray Params() As Variant) As Variant
    Const MAX_CODESIZE As Long = 65536
    Dim I As Long
    Dim pCodeData As Long
    Dim pParamData() As Long
    Dim PC As Long
    Dim Operand As Long
    Dim RetValue As Long
    Dim StrValue As String
    Dim LongValue As Long
    Dim dwThreadID As Long
    Dim hThread As Long
    Dim dwExit As Long
    - le passage d'une valeur hexadecimale sous forme de string est surprenante
    Sur le point la c'est une erreur de copie/colle
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    req = CallAPI(GetProcAddress(LoadLibrary("kernel32"), "CreateProcessA"), patch, vbNullString, 0, 0, False, CREATE_SUSPENDED, 0, 0, Si, Pi)
    - il n'est pas mentionné non plus s'il s'agit de module standart ou de module de classe
    CallAPI est dans un module
    excusez moi je n'ais pas été clair : module standart

    - quels sont les retours après fractionnement des différents appels (type et valeurs) ?
    Je ne peux le faire fonctionner, ou compiler, j'ai cette erreur lors de l'une de ces 2 action(copile/exécution)
    Compile error:
    Only user-defined types defined in public object modules can be coerced to or from a variant or passes to late-bound functions
    En espérant que vous ayez toutes les infos nécessaire

  8. #8
    Modérateur
    Avatar de ProgElecT
    Homme Profil pro
    Retraité
    Inscrit en
    Décembre 2004
    Messages
    6 077
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 68
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Retraité
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Décembre 2004
    Messages : 6 077
    Points : 17 165
    Points
    17 165
    Par défaut
    Citation Envoyé par DarkVader Voir le message
    ...........
    Quand j'ai écrit le message précédent, ce n'était pas innocent :
    - la ligne de déclaration de la fonction CallApi est toujours absente,
    .........
    Bref, comme d'hab, il faut jouer aux devinettes.
    +1

    Je verai mieux sa
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    req = CallFuncPtr(GetProcAddress(LoadLibrary("kernel32"), "CreateProcessA"), patch, vbNullString, 0, 0, False, CREATE_SUSPENDED, 0, 0, Si, Pi)
    non ?
    Soyez sympa, pensez -y
    Balises[CODE]...[/CODE]
    Balises[CODE=NomDuLangage]...[/CODE] quand vous mettez du code d'un autre langage que celui du forum ou vous postez.
    Balises[C]...[/C] code intégré dans une phrase.
    Balises[C=NomDuLangage]...[/C] code intégré dans une phrase quand vous mettez du code d'un autre langage que celui du forum ou vous postez.
    Le bouton en fin de discussion, quand vous avez obtenu l'aide attendue.
    ......... et pourquoi pas, pour remercier, un pour celui/ceux qui vous ont dépannés.
    👉 → → Ma page perso sur DVP ← ← 👈

  9. #9
    Membre à l'essai
    Profil pro
    Inscrit en
    Février 2008
    Messages
    28
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 28
    Points : 22
    Points
    22
    Par défaut
    @ProgElecT
    Oui, c'est moi qui l'avait renommer en CallAPI
    C'est CallAPI qui est declarer et appeler

  10. #10
    Expert éminent sénior


    Profil pro
    Inscrit en
    Juin 2003
    Messages
    14 008
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 14 008
    Points : 20 038
    Points
    20 038
    Par défaut
    ta fonction " Function CallFuncPtr" .. doit se terminer par un end Function ...

    il manque des lignes ..!

  11. #11
    Membre à l'essai
    Profil pro
    Inscrit en
    Février 2008
    Messages
    28
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 28
    Points : 22
    Points
    22
    Par défaut
    Bon je copie la fonction complète ici :
    Source :
    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
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    Attribute VB_Name = "modFncThread"
    Option Explicit
    'original source: http://nienie.com/~masapico/doc_FuncPtr.html
     
    Public Declare Function LoadLibrary Lib "kernel32" Alias "LoadLibraryA" (ByVal lpLibFileName As String) As Long
    Public Declare Function GetProcAddress Lib "kernel32" (ByVal hModule As Long, ByVal lpProcName As String) As Long
    Private Declare Function GetExitCodeThread Lib "kernel32" (ByVal hThread As Long, lpExitCode As Long) As Long
    Private Declare Function CreateThread Lib "kernel32" (ByVal lpThreadAttributes As Long, ByVal dwStackSize As Long, ByVal lpStartAddress As Long, ByVal lpParameter As Long, ByVal dwCreationFlags As Long, lpThreadId As Long) As Long
    Private Declare Function GlobalAlloc Lib "kernel32" (ByVal Flags As Long, ByVal Size As Long) As Long
    Private Declare Function GlobalFree Lib "kernel32" (ByVal Mem As Long) As Long
    Private Declare Function MoveMemory Lib "kernel32" Alias "RtlMoveMemory" (ByRef Dest As Any, ByRef Src As Any, ByVal Size As Long) As Long
     
    Private Const GMEM_FIXED As Long = 0&
     
    Public Function CallFuncPtr(FuncPtr As Long, ParamArray Params() As Variant) As Variant
    Const MAX_CODESIZE  As Long = 65536
    Dim I               As Long
    Dim pCodeData       As Long
    Dim pParamData()    As Long
    Dim PC              As Long
    Dim Operand         As Long
    Dim RetValue        As Long
    Dim StrValue        As String
    Dim LongValue       As Long
    Dim dwThreadID      As Long
    Dim hThread         As Long
    Dim dwExit          As Long
     
    ReDim pParamData(UBound(Params)) As Long
     
    pCodeData = GlobalAlloc(GMEM_FIXED, MAX_CODESIZE)
     
    PC = pCodeData
     
    AddByte PC, &H55
     
    For I = UBound(Params) To 0 Step -1
        If VarType(Params(I)) = vbString Then
            pParamData(I) = GlobalAlloc(GMEM_FIXED, LenB(Params(I)))
            StrValue = Params(I)
            MoveMemory ByVal pParamData(I), ByVal StrValue, LenB(StrValue)
            Operand = pParamData(I)
        Else
            Operand = Params(I)
        End If
     
        AddByte PC, &H68
        AddLong PC, Operand
    Next
     
    AddByte PC, &HB8
    AddLong PC, FuncPtr
    AddInt PC, &HD0FF
     
    AddByte PC, &HBA
    AddLong PC, VarPtr(RetValue)
     
    AddInt PC, &H289
    AddByte PC, &H5D
    AddInt PC, &HC033
    AddByte PC, &HC2
    AddInt PC, &H8
     
    ' run the assembler code in a new thread
    hThread = CreateThread(0, 0, pCodeData, 0, 0, dwThreadID)
     
    Do
    ' if exit code is 256 the thread is
    ' still running
        GetExitCodeThread hThread, dwExit
        If dwExit <> 259 Then Exit Do
        DoEvents
    Loop
     
    GlobalFree pCodeData
    For I = 0 To UBound(Params)
        If pParamData(I) <> 0 Then
            GlobalFree pParamData(I)
        End If
    Next
     
    CallFuncPtr = RetValue
     
    End Function
     
    Private Sub AddByte(ByRef PC As Long, ByVal ByteValue As Byte)
     
    MoveMemory ByVal PC, ByteValue, 1
    PC = PC + 1
    End Sub
     
    Private Sub AddInt(ByRef PC As Long, ByVal IntValue As Integer)
     
    MoveMemory ByVal PC, IntValue, 2
    PC = PC + 2
    End Sub
     
    Private Sub AddLong(ByRef PC As Long, ByVal LongValue As Long)
     
    MoveMemory ByVal PC, LongValue, 4
    PC = PC + 4
    End Sub

  12. #12
    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
    Bon,
    CallApi serait CallFuncPtr, mais alors je dois être demeuré car
    CallApi utilise une dizaine de paramètres alors que CallFuncPtr n'en admet que 2 !!!
    [EDIT] suis demeuré, effectivement Paramarray ...

    d'autre part je ne vois pas en quoi GetProcAddress et LoadLibrary ne pourrait être appelé au préalable
    afin d'en obtenir les valeurs de retour indépendamment.

  13. #13
    Membre à l'essai
    Profil pro
    Inscrit en
    Février 2008
    Messages
    28
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 28
    Points : 22
    Points
    22
    Par défaut
    CallApi serait CallFuncPtr
    Oui dsl pour le mélange..

    mais alors je dois être demeuré car
    CallApi utilise une dizaine de paramètres alors que CallFuncPtr n'en admet que 2 !!!
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    FuncPtr As Long, ParamArray Params() As Variant
    d'autre part je ne vois pas en quoi GetProcAddress et LoadLibrary ne pourrait être appelé au préalable
    Oui, mais ca ne change rien au fait que mon erreur est sur les variable Si et Pi..

    @DarVader
    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
    Private Type IMAGE_NT_HEADERS
        Signature As Long
        FileHeader As IMAGE_FILE_HEADER
        OptionalHeader As IMAGE_OPTIONAL_HEADER
    End Type
     
    Private Type IMAGE_SECTION_HEADER
        SecName As String * 8
        VirtualSize As Long
        VirtualAddress  As Long
        SizeOfRawData As Long
        PointerToRawData As Long
        PointerToRelocations As Long
        PointerToLinenumbers As Long
        NumberOfRelocations As Integer
        NumberOfLinenumbers As Integer
        characteristics  As Long
    End Type
    ...
        Dim Si      As STARTUPINFO
        Dim Pi      As PROCESS_INFORMATION

  14. #14
    Expert éminent sénior


    Profil pro
    Inscrit en
    Juin 2003
    Messages
    14 008
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 14 008
    Points : 20 038
    Points
    20 038
    Par défaut
    et il est défini ou ton type :


  15. #15
    Membre à l'essai
    Profil pro
    Inscrit en
    Février 2008
    Messages
    28
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 28
    Points : 22
    Points
    22
    Par défaut
    - 1 module standard contenant CallFuncPtr (Alias CALLAPI)

    - 1 module standard contenant le reste du code
    - Dans ce module :
    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
    Public Type STARTUPINFO
        cb As Long
        lpReserved As Long
        lpDesktop As Long
        lpTitle As Long
        dwX As Long
        dwY As Long
        dwXSize As Long
        dwYSize As Long
        dwXCountChars As Long
        dwYCountChars As Long
        dwFillAttribute As Long
        dwFlags As Long
        wShowWindow As Integer
        cbReserved2 As Integer
        lpReserved2 As Long
        hStdInput As Long
        hStdOutput As Long
        hStdError As Long
    End Type
     
    Public Type PROCESS_INFORMATION
        hProcess As Long
        hThread As Long
        dwProcessID As Long
        dwThreadID As Long
    End Type
    Ainsi que ma fonction qui appel CallFuncPtr()
    Avec dans celle ci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    Dim Si      As STARTUPINFO
    Dim Pi      As PROCESS_INFORMATION
    Dim z   As Long
    Dim req As Long
     
    Si.cb = Len(Si)
    z = GetProcAddress(LoadLibrary("kernel32"), "CreateProcessA")
    req = CallFuncPtr(z, sHost, vbNullString, 0, 0, False, CREATE_SUSPENDED, 0, 0, Si, Pi)
    C'est bien un problème au niveau des variable Si et Pi.
    J'ai essayer avec un :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
        z = GetProcAddress(LoadLibrary("shell32"), "ShellExecuteA")
        req = CallFuncPtr(z, 0, "open", "c:\notepad.exe", 0, 0, 1)
    Aucun prob...les fonction marche bien..

    @bbil
    Dsl pour le lien

Discussions similaires

  1. [Tableaux] Message erreur: undefined variable
    Par arti2004 dans le forum Langage
    Réponses: 9
    Dernier message: 23/05/2006, 14h31
  2. [VBA-E]erreur 91: variable objet ou variable de bloc With...
    Par cdk dans le forum Macros et VBA Excel
    Réponses: 4
    Dernier message: 07/03/2006, 14h19
  3. erreur de variable
    Par bobic dans le forum ASP
    Réponses: 8
    Dernier message: 15/11/2005, 11h20
  4. erreur déclaration variables
    Par bobic dans le forum ASP
    Réponses: 4
    Dernier message: 13/09/2005, 10h11
  5. Réponses: 1
    Dernier message: 19/08/2005, 12h33

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