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 :

Utilisation d'une dll C++


Sujet :

C++

  1. #1
    Membre régulier
    Inscrit en
    Décembre 2005
    Messages
    8
    Détails du profil
    Informations forums :
    Inscription : Décembre 2005
    Messages : 8
    Par défaut Utilisation d'une dll C++
    Bonjour,

    j'ai externalisé certaines de mes fonctions dans une dll. Cette dll est ensuite utilisée par un programme powerbuilder mais également par un site en .net.

    Voici le prototype d'une des fonctions :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    extern "C" __declspec(dllexport) int fx_decode_activation(const char *cle, char *code)
    Elle permet de décoder la clé d'activation passée en paramètre et sa valeur est placée dans la variable "code".

    Lors de la 1ère compilation pas de souci. Mais j'ai du apporter quelques modifications et depuis ca ne fonctionne plus. J'ai testé ma dll depuis un programme C++ et ca fonctionne correctement avec la déclaration suivante :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    typedef INT (__cdecl *SHDECODE) (const char *, char *);
    m_pDecode = (SHDECODE)GetProcAddress(hRestaurationdll, _T("fx_decode_activation"));
    Donc pas de problème du côté de mon code. Mais ce qui est plus étonnant, c'est que ca ne fonctione plus sous powerbuilder alors que je n'ai rien modifié dans les déclarations de mes fonctions. Lorsque j'exécute mon programme j'ai l'erreur suivante :

    Application terminated.

    Error : Specified argument type differs from required argument type at runtime in DLL function gfx_decode_activation. (invalid stack pointer on return from function call) at line 27 in pfc_preopen event of object w_connection.
    Ca donne l'impression que powerbuilder appelle la fonction en stdcall et que la pile est erronée au retour. Mais je le répète rien n'a été modifié dans les définition et ca fonctionnait très bien avant que je recompile ma dll.

    Alors si quelqu'un a une idée sur la question je suis preneur car ca fait depuis le début d'après-midi que je cherche sans trouver !

    Merci d'avance

  2. #2
    Membre averti
    Inscrit en
    Avril 2007
    Messages
    24
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 24
    Par défaut
    m_pDecode est bien du type SHDECODE ??

  3. #3
    Membre régulier
    Inscrit en
    Décembre 2005
    Messages
    8
    Détails du profil
    Informations forums :
    Inscription : Décembre 2005
    Messages : 8
    Par défaut
    oui elle est bien déclaré en SHDECODE.

    Le problème réside du côté de PB, qui du jour au lendemain, et après recompilation, n'accepte plus ma DLL. Même si je recompile le code d'origine, ca plante, alors qu'avec l'ancienne DLL ca fonctionne !

    Par ailleurs j'ai validé le fonctionnement de la DLL depuis .net et le site accepte bien le decryptage de la clé.

  4. #4
    Membre averti
    Inscrit en
    Avril 2007
    Messages
    24
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 24
    Par défaut
    regarde au niveau des type des argument passer a ta fonction.

    les types sont ils les meme dans lappel de ta fonction au sein du programme et dans le prototype de cette fonction au sein de ta dll ??

    essaye de caster les argument !

  5. #5
    Membre régulier
    Inscrit en
    Décembre 2005
    Messages
    8
    Détails du profil
    Informations forums :
    Inscription : Décembre 2005
    Messages : 8
    Par défaut
    du côté C++ j'ai du char*, du côté PB c'est du string.

  6. #6
    Membre averti
    Inscrit en
    Avril 2007
    Messages
    24
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 24
    Par défaut
    ?????

    et bien si tu a le prototype

    void fct(char , int) ;

    il faut lors de l'appel de la fonction "fct" respecter ces types

    char a;
    int b;

    fct(a,b);

    sinon il faut tenter de caster

    fct( (char)b, (int)a ); par exemple

  7. #7
    Membre régulier
    Inscrit en
    Décembre 2005
    Messages
    8
    Détails du profil
    Informations forums :
    Inscription : Décembre 2005
    Messages : 8
    Par défaut
    le char * n'existe pas en PB. Pour des chaînes de caractères on utilise le string. Mais le problème ne réside pas là puisqu'avec ce même prototype de fonction ca fonctionnait parfaitement avant !

  8. #8
    Membre régulier
    Inscrit en
    Décembre 2005
    Messages
    8
    Détails du profil
    Informations forums :
    Inscription : Décembre 2005
    Messages : 8
    Par défaut
    Bon finalement j'ai trouvé une solution en déclarant mes fonctions en __stdcall. Un peu logique aux vues du message d'erreur PB, mais étonnant car ca fonctionnait bien avec une version compilée il y a 1 mois.

    Sans doute une mise-à-jour de PB, je ne vois que ca !

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

Discussions similaires

  1. Utilisation d'une dll de ClearCase (IBM)
    Par il_a_ri dans le forum Outils
    Réponses: 6
    Dernier message: 28/11/2005, 15h29
  2. Réponses: 6
    Dernier message: 21/06/2005, 21h45
  3. [DLL] Utilisation d'une DLL pour utiliser serveur Firebird
    Par sekiryou dans le forum Bases de données
    Réponses: 2
    Dernier message: 11/08/2004, 14h20
  4. [Info]Utilisation d'une Dll
    Par Assiobal dans le forum Eclipse Java
    Réponses: 1
    Dernier message: 11/06/2004, 21h46
  5. Utilisation d'une dll écrite en delphi 5 dans VB6
    Par Jean-Louis dans le forum Langage
    Réponses: 4
    Dernier message: 05/08/2002, 09h19

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