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 :

Again ! un topic pour ouvrir une DLL


Sujet :

C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé Avatar de Fortran90
    Homme Profil pro
    Inscrit en
    Septembre 2006
    Messages
    83
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2006
    Messages : 83
    Par défaut Again ! un topic pour ouvrir une DLL
    Salut !

    Voici mon bout de code, qui doit servir à ouvrir une DLL "madll.dll", qui, vous vous en doutez, ne marche pas (compil sous MSV2005)
    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
     
    #include <windows.h>
    #include <string.h>
    #include <stdio.h>
    #include <stdlib.h>
    int main(void)
    {
    	HMODULE ret;
    	static char chaine[255]="madll.dll";
    	FILE *fp = fopen(chaine,"r");
    	if (fp !=NULL)
    	{
    		printf("File %s Exists !\n",chaine);
    		fclose(fp);
    	}
    	else
    		printf("File %s Do Not Exist !\n",chaine);
    	ret = LoadLibrary((LPCWSTR)chaine);
    	printf("LL ret = %d\n",(int)ret);
    	if(!ret) printf("Error code = %d\n",GetLastError());
    	return(0);
    }
    Bien sur avec mon fopen j'arrive à voir le fichier, mais LoadLibrary me retourne toujours 0 avec un code d'erreur 126, cad que le fichier n'existe pas...

    J'ai aussi essayé d'ouvrir pour essayer user32.dll, sans succès...


    Pourquoi?

  2. #2
    Candidat au Club
    Profil pro
    Inscrit en
    Août 2003
    Messages
    3
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2003
    Messages : 3
    Par défaut
    Regarde si l'utilisation de LoadLibrary ne necessite pas un enregistrement de ta dll en base de registre avant de l'utiliser

  3. #3
    Rédacteur
    Avatar de Neitsa
    Homme Profil pro
    Chercheur sécurité informatique
    Inscrit en
    Octobre 2003
    Messages
    1 041
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Chercheur sécurité informatique

    Informations forums :
    Inscription : Octobre 2003
    Messages : 1 041
    Par défaut
    Bonjour,

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    static char chaine[255]="madll.dll";
     
    ...
     
    ret = LoadLibrary((LPCWSTR)chaine);
    Ouch ! Tu convertis explicitement un char* en const wchar_t*...

    Le problème vient du fait que tu compiles avec _UNICODE défini.

    Deux solutions :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    static char chaine[]="madll.dll";
     
    ...
     
    ret = LoadLibraryA(chaine); // note le 'A' à la fin du nom de la fonction.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    static WCHAR chaine[]= L"madll.dll";
     
    ...
     
    ret = LoadLibrary(chaine) // sous entendu LoadLibraryW puisque _UNICODE est défini.

  4. #4
    Membre confirmé Avatar de Fortran90
    Homme Profil pro
    Inscrit en
    Septembre 2006
    Messages
    83
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2006
    Messages : 83
    Par défaut
    Ouf merci, ça fait du bien quand ça marche...
    Sous cygwin je n'avais aucun soucis...alors c'est dans MSV2005 qu'il défini UNICODE de base? Pourquoi?

  5. #5
    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
    Parce que sans-unicode, c'est le passé.

    Et la meilleure façon de marcher aussi bien avec UNICODE que sans, c'est d'utiliser des TCHAR :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    static TCHAR chaine[]= TEXT("madll.dll");
     
    ...
     
    ret = LoadLibrary(chaine)
    PS: Au sujet du cast aveugle en (LPCWSTR), lire ma signature.
    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.

  6. #6
    Membre confirmé Avatar de Fortran90
    Homme Profil pro
    Inscrit en
    Septembre 2006
    Messages
    83
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2006
    Messages : 83
    Par défaut
    Je veux bien que ce soit le passé, mais justement quand on utilise les nouveaux outils sur des codes anciens, on ne peut pas passer son temps à ré-adapter le code. On en finit jamais, surtout quand c'est pas le but final de la manoeuvre...

    Alors je "undefined" UNICODE dans mes variables préprocesseurs...
    (mais c'est mieux en changeant character set, je l'avais loupé lui...)
    C'est si mal que ça?

    Pour la signature...qu'une chose à dire...je suis cast(s)é...

  7. #7
    Rédacteur
    Avatar de Neitsa
    Homme Profil pro
    Chercheur sécurité informatique
    Inscrit en
    Octobre 2003
    Messages
    1 041
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Chercheur sécurité informatique

    Informations forums :
    Inscription : Octobre 2003
    Messages : 1 041
    Par défaut
    Citation Envoyé par Fortran90 Voir le message
    Sous cygwin je n'avais aucun soucis...alors c'est dans MSV2005 qu'il défini UNICODE de base?
    Oui, par défaut les projets sont en "wide char" (UNICODE). On peut régler cela projet par projet en allant dans :

    Project > properties > Configuration properties > general > Character Set.

    Là on peut choisir UNICODE ou ANSI (multi-byte character set).

    Pourquoi?
    Après windows 98, Windows est passé quasiment en tout unicode.

    Les fonctions finissant en 'A' sont dans la grande majorité des cas des wrappers sur les fonctions 'W' (c-a-d qu'elles convertissent les chaînes en unicode et appellent la même fonctions mais en 'W)'.

    On peut toutefois écrire du code "portable" ANSI <-> UNICODE quelque soit le symbole défini en utilisant les macros et définition en '_T'. Exemple :

    _tprintf qui utilise char* si unicode n'est pas défini et wchar_t* dans le cas contraire :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    #ifdef _UNICODE
    #define _tprintf        wprintf
    #else
    #define _tprintf        printf
    #endif
    P.S : pas besoin de le faire soi-même c'est déjà défini dans les fichiers d'en-tête du SDK de Windows.

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

Discussions similaires

  1. code VB pour ouvrir une page d'un formulaire
    Par marion67 dans le forum Access
    Réponses: 10
    Dernier message: 31/12/2005, 22h11
  2. [Batch] Tit prog pour ouvrir une page internet
    Par toniovitch dans le forum Windows
    Réponses: 1
    Dernier message: 17/09/2005, 16h20
  3. [JNI] Difficultés pour utiliser une DLL
    Par etiennegaloup dans le forum Entrée/Sortie
    Réponses: 10
    Dernier message: 15/08/2005, 21h29
  4. API pour ouvrir une BD Access
    Par GofAcid dans le forum Access
    Réponses: 2
    Dernier message: 15/12/2004, 19h25
  5. [VB6]ouvrir une DLL sans en conaitre le nom à la creation
    Par victorracine dans le forum VB 6 et antérieur
    Réponses: 5
    Dernier message: 05/02/2004, 15h16

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