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 :

Programmation Windows Mobile, LoadLibrary failed


Sujet :

C++

  1. #1
    Candidat au Club
    Inscrit en
    Mai 2008
    Messages
    5
    Détails du profil
    Informations forums :
    Inscription : Mai 2008
    Messages : 5
    Points : 2
    Points
    2
    Par défaut Programmation Windows Mobile, LoadLibrary failed
    Bonjour,

    Je charge un dll à partir d'une application. La fonction est suivante :

    bool mgf:Library::load( const std::string& libName ){

    #ifdef _WIN32_WCE

    wchar_t* tmp = (wchar_t*) new wchar_t[libName.size()+1];

    mbstowcs( tmp, libName.c_str(), (size_t)(libName.size()+1) );

    _lib = LoadLibrary( (LPCWSTR)tmp);

    delete[] tmp;
    #endif
    }
    LoadLibrary renvoie une référence non nulle mais le descripteur dans le debugger indique {unused = 1021676848}
    GetLastError donne le code error 0 (System was out of memory, executable file was corrupt, or relocations were invalid) mais je ne vois pas d'ou pourrait venir le problème.

    - Je développe pour Windows Mobile 5.0, sous Visual Studio 2005, avec Windows Mobile SDK.
    - Je met le dll à charger dans le répectoire /Windows de l'appareil puisque quand je met dans le même répectoire que l'éxé ça ne se charge pas (code error 126)

  2. #2
    Rédacteur
    Avatar de 3DArchi
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    7 634
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 7 634
    Points : 13 017
    Points
    13 017
    Par défaut
    Bonjour et bienvenu,
    Je vais peut être dire quelque chose de stupide mais si _lib n'est pas NULL, que t'importe que le debugger écrive unused = 1021676848 ? As-tu essayé de récupérer une fonction (GetProcAddress ) ?

  3. #3
    Rédacteur

    Avatar de ram-0000
    Homme Profil pro
    Consultant en sécurité
    Inscrit en
    Mai 2007
    Messages
    11 517
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Consultant en sécurité
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mai 2007
    Messages : 11 517
    Points : 50 367
    Points
    50 367
    Par défaut
    Je compléterai en disant que la valeur retournée par GetLastError() n'est valide que si il y a eu une erreur. Si le LoadLibrary() ne retourne pas en erreur(pointeur non null) ce qui semble être la cas, il ne faut pas regarder GetLastError().
    Raymond
    Vous souhaitez participer à la rubrique Réseaux ? Contactez-moi

    Cafuro Cafuro est un outil SNMP dont le but est d'aider les administrateurs système et réseau à configurer leurs équipements SNMP réseau.
    e-verbe Un logiciel de conjugaison des verbes de la langue française.

    Ma page personnelle sur DVP
    .

  4. #4
    Candidat au Club
    Inscrit en
    Mai 2008
    Messages
    5
    Détails du profil
    Informations forums :
    Inscription : Mai 2008
    Messages : 5
    Points : 2
    Points
    2
    Par défaut
    Ah merci. J'au regardé dans l'onglet Module et Output de Visual, apparament le module est bien chargé, le GetProcAdress renvoie null code error 87 (parametre invalide), peut etre que le point d'entrée de la dll n'est pas trouvé??? (Est ce que c'est pour ca que le descriptor indique une valeur unused??)

    J'ai un fichier .def qui est :

    LIBRARY plgVrmlGL
    EXPORTS
    registerNodeCreators
    registerModules
    Et le .h

    #ifndef _VRGL_PLUGIN_H_
    #define _VRGL_PLUGIN_H_

    #if !defined WIN32 && !defined _WIN32_WCE
    extern "C" {
    #endif
    std::vector<mgf::Module*> registerModules( void );
    #if !defined WIN32 && !defined _WIN32_WCE
    }
    #endif


    #if !defined WIN32 && !defined _WIN32_WCE
    extern "C" {
    #endif
    std::vector<mgf::NodeCreator*> registerNodeCreators( void );
    #if !defined WIN32 && !defined _WIN32_WCE
    }
    #endif

    #endif
    Je ne vois pas qu'est qui peut bloquer l'utilisation du dll. Trop déprimé

  5. #5
    Candidat au Club
    Inscrit en
    Mai 2008
    Messages
    5
    Détails du profil
    Informations forums :
    Inscription : Mai 2008
    Messages : 5
    Points : 2
    Points
    2
    Par défaut
    Pour ajouté, jai un autre fichier .h qui se charge d'exporter la dll

    #if defined(_MSC_VER) && defined(VRGL_DLL)
    # ifdef VRGL_BUILD
    # define VRGL_EXPORT __declspec(dllexport)
    # else
    # define VRGL_EXPORT __declspec(dllimport)
    # endif
    #else
    # define VRGL_EXPORT
    #endif
    Je viens d'essayer de mettre VRGL_EXPORT devant les fonctions, GetProcAdress renvoie toujours NULL. Alors est qu'il y a une config spécial sous Visual pour Windows Mobile pour exporter les dll.....

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

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 518
    Points
    41 518
    Par défaut
    Code ridicule : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    wchar_t* tmp = (wchar_t*) new wchar_t[libName.size()+1];
     
    mbstowcs( tmp, libName.c_str(), (size_t)(libName.size()+1) );
     
    _lib = LoadLibrary( (LPCWSTR)tmp);
    Alors ça, c'est le pompon:
    • Le premier cast est encore plus inutile que le cast du retour de malloc() en C.
    • std::basic_string::size_type est pratiquement tout le temps déjà un size_t, donc cast inutile. De plus, il est incorrect de présumer qu'on aura le même nombre de wchar_t que de char.
    • Les casts entre ANSI et unicode, c'est mal. Et là encore, le cast est inutile de toute façon.
    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.

  7. #7
    Membre émérite
    Avatar de white_tentacle
    Profil pro
    Inscrit en
    Novembre 2008
    Messages
    1 505
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2008
    Messages : 1 505
    Points : 2 799
    Points
    2 799
    Par défaut
    De plus, il est incorrect de présumer qu'on aura le même nombre de wchar_t que de char.
    Tu peux préciser stp ? Pour moi, c'est forcément <=, dans ce sens là. Et comme libName.c_str() est garanti d'être terminé par un zéro terminal, ça me semble correct ça pour le coup. Ou j'ai loupé un truc ?

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

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 518
    Points
    41 518
    Par défaut
    Citation Envoyé par white_tentacle Voir le message
    Tu peux préciser stp ? Pour moi, c'est forcément <=, dans ce sens là. Et comme libName.c_str() est garanti d'être terminé par un zéro terminal, ça me semble correct ça pour le coup. Ou j'ai loupé un truc ?
    Inférieur ou égal, c'est possible, mais j'ignore s'il est garanti qu'aucune page de codes au monde ne comprend un caractère qui soit hors du BMP...
    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.

  9. #9
    Candidat au Club
    Inscrit en
    Mai 2008
    Messages
    5
    Détails du profil
    Informations forums :
    Inscription : Mai 2008
    Messages : 5
    Points : 2
    Points
    2
    Par défaut
    Les casts entre ANSI et unicode, c'est mal
    Peut être, mais c'est la seule solution pour l'instant que l'ai trouvé, car l'environnement Windows Mobile est que UNICODE, et l'entrée du programme utilise ANSI.

    Par contre, mon problème de GetProcAdress renvoie NULL est résolu si je fais le même cast (de ANSI en UNICODE pour le nom de la fonction en entrée de GetProcAdress)

    Si tu as une autre façon plus performente pour caster cela merci de m'indiquer, car là... je ne m'y connais pas beaucoup. Merci d'avance

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

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 518
    Points
    41 518
    Par défaut
    Normalement, ceci suffit:
    Code C++ : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    int cchSizeW = MultiByteToWideChar(CP_ACP, 0, libName.c_str(), -1, NULL, 0);
    wchar_t* tmp = new wchar_t[cchSizeW];
     
    MultiByteToWideChar(CP_ACP, 0, libName.c_str(), -1, tmp, cchSizeW);
     
    _lib = LoadLibrary(tmp);
     
    delete[] tmp;
    Aucun cast explicite nécessaire tant que tu compiles en unicode.
    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.

Discussions similaires

  1. Programmation Windows mobile
    Par lolita4882 dans le forum Windows
    Réponses: 1
    Dernier message: 31/12/2008, 07h51
  2. Réponses: 1
    Dernier message: 01/08/2008, 16h08
  3. Débuter un programme Delphi 2007 pour Windows Mobile 6
    Par arnaudG dans le forum Delphi .NET
    Réponses: 7
    Dernier message: 31/01/2008, 18h29
  4. Programmation Windows Mobile avec GUI en C++
    Par Luke58 dans le forum Visual C++
    Réponses: 1
    Dernier message: 13/03/2007, 17h39
  5. Réponses: 4
    Dernier message: 09/09/2006, 21h48

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