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

Visual C++ Discussion :

Appel d'une fonction de DLL qui ne fonctionne pas dans un Controle Active X


Sujet :

Visual C++

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    159
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2007
    Messages : 159
    Points : 91
    Points
    91
    Par défaut Appel d'une fonction de DLL qui ne fonctionne pas dans un Controle Active X
    Bonjour à tous,

    Je développe actuellement un controle ActiveX qui fait appel à une DLL externe (je n'ai pas les sources de cette DLL).
    Je charge la DLL dynamiquement en utilisant LoadLibrary et GetProcAddress.

    Voila comment je procède :

    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
     
    HINSTANCE handleDLL = NULL;
    TYPEPOINTEURFONCTION maFonction = NULL;
    DWORD error;
     
    if(
        (handleDLL = LoadLibrary("./maDLL")) == NULL
        || 
        (maFonction = (TYPEPOINTEURFONCTION)GetProcAddress("maFonction")) == NULL
    )
        return false;
     
    error = GetLastError();
    if(!maFonction())
    {
        DWORD error = GetLastError();
        return(false);
    }
    Note : maFonction renvoie un booléen, et est censée renvoyer true si tout ce passe correctement. Mon code est fictif, je ne veux pas mettre le code réel, mais c'est exactement ce qui se passe actuellement.

    J'avais essayé ce bout de code dans un main d'un projet vide, et la DLL est bien chargée, la fonction bien linkée et l'appel à la fonction renvoie true.

    Maintenant, si je passe ce bout de code dans une des méthode de mon controle ActiveX, la DLL est toujours bien chargée (tout du moins LoadLibrary ne renvoie pas NULL), la fonction est toujours bien linkée (tout du moins GetProcAddress ne renvoie pas NULL), mais l'appel à la fonction me renvoie false (pourquoi pas) et surtout, GetLastError me renvoie 126 (ERROR_MOD_NOT_FOUND) tout de suite après (quand il valait 0 juste avant l'appel à la fonction).

    La spécification de la méthode que j'appelle stipule, qui plus est, que les code d'erreurs possiblement renvoyés par la fonction dans GetLastError sont compris entre 1 et 60.

    Ce qui m'étonne le plus, c'est ce changement de comportement entre ce bout de code executé dans un projet vide, et le même bout de code exécuté dans une méthode d'un controle ActiveX.

    J'ai également essayé la même chose mais avec la DLL linkée en statique et le résultat est le même.

    Avez-vous des pistes de recherche pour comprendre ce comportement étonnant ?

  2. #2
    Inactif  

    Homme Profil pro
    Ingénieur test de performance
    Inscrit en
    Décembre 2003
    Messages
    1 986
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur test de performance
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Décembre 2003
    Messages : 1 986
    Points : 2 605
    Points
    2 605
    Par défaut
    Bonjour.

    Citation Envoyé par Difré91
    ... mais l'appel à la fonction me renvoie false (pourquoi pas)
    Si l'appel de la fonction renvoie false, c'est que la fonction a bien été appelée.

    Donc tout se passe bien visiblement.

    Pourquoi la fonction renvoie false et GetLastError retourne 126, on a pas notre boule de cristal. Sans code source je dirais que l'erreur est à la ligne 44 de la fonction...

    Bref, je pencherais sur un problème d'ApartmentThread. Un programme normal se trouve dans un "Single Apartment Threaded" et un OCX dans un "multi Apartment Threaded". La dll ne doit pas aimer.

    Mais ce n'est qu'une hypothèse.

    http://msdn.microsoft.com/en-us/libr...(v=vs.85).aspx

    Après ERROR_MOD_NOT_FOUND, ça veut bien dire ce que cela veut dire. Le module n'a pas été trouvé. Peut-être une histoire de dll ou de fichier qui doit se trouver dans le même répertoire que la dll concernée.

  3. #3
    Membre régulier
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    159
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2007
    Messages : 159
    Points : 91
    Points
    91
    Par défaut
    Merci beaucoup pour ta réponse moldavi.

    Je ne m'attendais pas à un diagnostic détaillé du pourquoi du comment la fonction génère une erreur 126.

    Je voulais m'assurer qu'un problème de link avec une DLL ne pouvait pas se révéler trop tard.

    Je vais suivre les pistes que tu me donne.

Discussions similaires

  1. [AC-2010] fonctions Droite et Gauche qui ne fonctionnent pas dans une requête
    Par samy35 dans le forum Requêtes et SQL.
    Réponses: 2
    Dernier message: 05/03/2014, 10h14
  2. Réponses: 6
    Dernier message: 22/05/2007, 09h55
  3. Fonction Quoted printable qui ne fonctionne pas.
    Par leCcsympas dans le forum C
    Réponses: 3
    Dernier message: 13/01/2007, 18h54
  4. Réponses: 10
    Dernier message: 15/12/2006, 07h34
  5. [ODBC] une requete d'insertion qui ne fonctionne pas
    Par boulhous dans le forum PHP & Base de données
    Réponses: 2
    Dernier message: 26/05/2006, 13h56

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