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

C++ Discussion :

[C++] problème en utilisant un DLL: "the value of ESP was not properly saved"


Sujet :

C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Inscrit en
    Octobre 2007
    Messages
    30
    Détails du profil
    Informations forums :
    Inscription : Octobre 2007
    Messages : 30
    Par défaut [C++] problème en utilisant un DLL: "the value of ESP was not properly saved"
    saluts,

    compilateur: Visual C++ 6.0.
    nous sommes rélativement nouveaux à la programmation en C++. nous essayons d'utiliser un ActiveX DLL créé dans Visual Basic 6.0.
    pour utiliser le DLL, nous utilisons #import, et autres fonctions pour créer l'instance et appeller les fonctions du DLL, comme décrit dans un tutoriel.
    l'initialisation du DLL (COM) fonctionne; le problème surgit quand nous essayons d'appeller une fonction du DLL. le code du programme est dessous. le projet du DLL en VB est appellé mbr et il contient une classe appellée mbrl. quand la fonction t->speak(...) est appellé, l'erreur suivante se passe:

    "File: i386/chkesp.c
    Line: 42

    The value of ESP was not properly saved across a function call. This is usually a result of calling a function declared with one calling convention with a function pointer declared with a different calling convention."
    que voit dire:
    "Le valeur d'ESP n'a pas été sauvé correctement à travers un appel de fonction. C'est habituellement un résultat d'appeler une fonction déclarée avec une convention d'appel avec un pointeur de fonction déclaré avec une convention d'appel différente."

    ici est le code (un petit programme):
    Code C++ : 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
    #import "C:\WINDOWS\system32\mbr.dll"
    #include "iostream"
    #include <windows.h>
    using namespace std;
    using namespace mbr;
     
    int main(int argc, char* argv[])
    {
     
         HRESULT hresult;
         CLSID clsid;
         _mbrl *t;
    			_bstr_t		bstrValue("k 100 100\n");
    			_bstr_t		dbe("ar1");
    			_bstr_t		oute("OUT.WAV");
    			_bstr_t		bstrR("");
    			long		freqe;
    			long		dure;
    			long		vole;
    			long		pite;
    			long		returne;
    			freqe = 1;
    			dure = 1;
    			vole = 1;
    			pite = 1;
         ::CoInitialize(NULL);
          hresult=CLSIDFromProgID(OLESTR("mbr.mbrl"), &clsid);
          hresult= CoCreateInstance(clsid,NULL,CLSCTX_INPROC_SERVER,
                                       __uuidof(_mbrl),(LPVOID*) &t);
          if(hresult == S_OK)
          {
     
    		 returne = t->speak(bstrValue, freqe, dure, vole, pite, dbe, oute); // <- L'ERREUR SE PASSE ICI
             t->Release();
    		 ::CoUninitialize;
           }
         return 0;
    }

  2. #2
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 395
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 395
    Par défaut
    Pour un appel via COM, c'est vraiment bizarre: Les appels via COM sont standardisé, et dans le cas présent, le code pour les appels de fonction est généré automatiquement...

    Ce genre d'erreur, on l'a plutôt quand on utilise mal un pointeur de fonction...

    Peux-tu poster le .tlh généré par #import ?
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  3. #3
    Membre averti
    Inscrit en
    Octobre 2007
    Messages
    30
    Détails du profil
    Informations forums :
    Inscription : Octobre 2007
    Messages : 30
    Par défaut
    saluts,

    merci pour la réponse.
    voici le TLH.
    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
     
    #pragma once
    #pragma pack(push, 8)
     
    #include <comdef.h>
     
    namespace mbr {
     
    //
    // Forward references and typedefs
    //
     
    struct __declspec(uuid("67922a88-3442-47d7-a24b-fcd8269217da"))
    /* dual interface */ _mbrl;
    struct /* coclass */ mbrl;
     
    //
    // Smart pointer typedef declarations
    //
     
    _COM_SMARTPTR_TYPEDEF(_mbrl, __uuidof(_mbrl));
     
    //
    // Type library items
    //
     
    struct __declspec(uuid("67922a88-3442-47d7-a24b-fcd8269217da"))
    _mbrl : IDispatch
    {
        //
        // Wrapper methods for error-handling
        //
     
        long speak (
            _bstr_t textus,
            long freq,
            long dur,
            long vol,
            long pit,
            _bstr_t db,
            _bstr_t out );
     
        //
        // Raw methods provided by interface
        //
     
        virtual HRESULT __stdcall raw_speak (
            BSTR textus,
            long freq,
            long dur,
            long vol,
            long pit,
            BSTR db,
            BSTR out,
            long * _arg8 ) = 0;
    };
     
    struct __declspec(uuid("25eada00-b527-4a7c-b50d-cfb06a76beda"))
    mbrl;
        // [ default ] interface _mbrl
     
    //
    // Wrapper method implementations
    //
     
    #include "c:\myprojects\mbr\debug\mbr.tli"
     
    } // namespace mbr
     
    #pragma pack(pop)

  4. #4
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 395
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 395
    Par défaut
    Eh bien, c'est de plus en plus bizarre, car la fonction est bien déclarée en __stdcall...

    Es-tu sûr que les paramètres sont les bons, et du bon type ?
    Puis-je voir la déclaration VB de la fonction?
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  5. #5
    Membre averti
    Inscrit en
    Octobre 2007
    Messages
    30
    Détails du profil
    Informations forums :
    Inscription : Octobre 2007
    Messages : 30
    Par défaut
    merci pour la réponse.
    oui, c'est bizarre, parce que, auparavant, l'erreur que s'est passé était "Access Violation", mais - ce doit être à cause d'une modification que nous avons fait mais nous ne nous souvenons pas - l'erreur est, maintenant, celui-ci.
    en tout cas, voici la déclaration VB:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Public Function speak(ByVal textus As String, ByVal freq As Long, ByVal dur As Long, ByVal vol As Long, ByVal pit As Long, ByVal db As String, 
    ByVal out As String) As Long

  6. #6
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 395
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 395
    Par défaut
    Que se passe-t-il si tu essaies d'appeler directement raw_speak() plutôt que le wrapper généré par Visual ?
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

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

Discussions similaires

  1. [JDBC]Problème de configuration: "Failed to load the sqljdbc_auth.dll"
    Par adrien.nicolet dans le forum MS SQL Server
    Réponses: 1
    Dernier message: 26/01/2014, 11h14
  2. Réponses: 1
    Dernier message: 21/12/2012, 22h26
  3. The expression prefix 'SPUrl' was not recognized - WSS
    Par lthomas dans le forum SharePoint
    Réponses: 1
    Dernier message: 14/04/2008, 15h58
  4. Problème d'utilisation de Dll faite maison. . .
    Par _SamSoft_ dans le forum Windows
    Réponses: 27
    Dernier message: 20/02/2007, 13h55
  5. Réponses: 1
    Dernier message: 12/01/2007, 21h40

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