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 :

Création DLL - Link error


Sujet :

C++

  1. #1
    Membre à l'essai
    Inscrit en
    Février 2007
    Messages
    17
    Détails du profil
    Informations forums :
    Inscription : Février 2007
    Messages : 17
    Points : 14
    Points
    14
    Par défaut Création DLL - Link error
    Bonjour,

    Je tente de créer une DLL en C++ permettant de gérer les authentifications sous Windows. J'utilise l'outil Visual Studio Command Prompt (2010)

    Pour cela, j'ai décidé d'utiliser la fonction LogonUser contenu dans la librarie "Windows.h".

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    #include <windows.h>
     
    extern "C" bool __declspec(dllexport) _stdcall authenticate(LPCSTR logon, LPCSTR domain, LPCSTR password)
      {
    	HANDLE token;
    	return  LogonUser(logon, domain, password, LOGON32_LOGON_NETWORK, LOGON32_PROVIDER_DEFAULT, &token);
      }
    Lors de la compilation, je n'ai pas d'erreur, et je génère un fichier obj. (j'utilise la commande " cl /LD /c authenticate.cpp ")

    Je tente alors de réaliser un link pour créer la dll mais j'ai une erreur à ce moment : LNK 2019 : unresolved external symbol __imp__LogonUserA@24. (j'utilise la commande " link /DLL authenticate.obj ")
    De souvenir, sous C# la fonction était contenu dans la dll adviapi32.dll. J'ai tenté d'ajouter la dll à mon link, mais j'ai le message "LNK1107: invalid or corrupt file: cannot read at 0x288 (" link /DLL "C:\Windows\system32\advapi32.dll" authenticate.obj ")
    En recherchant sur les différents sites, j'aurais oublié d'ajouter la librairie advapi32.lib dans mon link.
    En faisant ceci, j'ai un autre message LNK1136: invalid or corrupt file. (" link /DLL advapi32.lib authenticate.obj ")

    À ce moment là, je n'arrive pas à voir d'où pourrait venir le soucis. De base, je n'ai pas la librairie advapi32.lib. J'ai dû la télécharger, et placé dans le même répertoire que le code et le fichier obj.

    Savez vous si l'erreur viendrait de mon code ou d'une erreur au niveau des commandes de compilation ou de link ou autre ?


    Merci d'avance,

    Cordialement,
    Thybang

  2. #2
    Membre expérimenté
    Homme Profil pro
    Inscrit en
    Décembre 2010
    Messages
    734
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Décembre 2010
    Messages : 734
    Points : 1 475
    Points
    1 475
    Par défaut
    Au hasard, je dirais que si tu as le header, tu as le .lib qu'il faut quelque part dans ton SDK, dans la bonne version, sans aller le télécharger au hasard sur le net en risquant de tomber sur une version 32bits alors que tu travailles en 64 (ou l'inverse), par exemple.
    Ceci dit, pour spécifier le link tu dois ajouter la libririe d'import (.lib) avec l'option suivante: [odeinline]/implib advapi32.lib[/codeinline]. Les fichiers qui sont listés directement doivent être des fichiers objet.

  3. #3
    Membre à l'essai
    Inscrit en
    Février 2007
    Messages
    17
    Détails du profil
    Informations forums :
    Inscription : Février 2007
    Messages : 17
    Points : 14
    Points
    14
    Par défaut
    Bonjour,

    Merci beaucoup pour ta réponse.

    J'ai pu tester l'ajout de la lib advapi32.lib dans le link, mais l'erreur persiste:

    LNK 2019 : unresolved external symbol __imp__LogonUserA@24
    LNK 1120 : 1 unresolved externals

    J'utilise la commande suivante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    link /DLL /implib:"C:\Program Files\Microsoft SDKs\Windows\v7.0A\lib\AdvAPI32.Lib" authenticate.obj

  4. #4
    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
    Ton code recherche clairement la version 32 bits de LogonUserA(). Est-ce bien à la version 32 bits de AdvApi32.lib que tu as lié?
    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 expérimenté
    Homme Profil pro
    Inscrit en
    Décembre 2010
    Messages
    734
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Décembre 2010
    Messages : 734
    Points : 1 475
    Points
    1 475
    Par défaut
    Pour une raison que je ne comprends pas, je ne peux modifier mon post ci-dessus OR IL EST FAUX ET DANGEREUX (@thybang: désolé, cela faisait longtemps que je n'avais pas écrit les options à la main (j'utilise des systèmes de build qui les écrivent automatiquement) et j'ai confondu. L'option /implib sert A SPECIFIER LE NOM DE LIBRAIRIE D'IMPORT DE TA DLL. La ligne de commande que je t'avais proposée a très probablement corrompu AdvAPI32.Lib dans ton SDK... Il faut que tu ailles à l'emplacement de "C:\Program Files\Microsoft SDKs\Windows\v7.0A\lib\AdvAPI32.Lib", tu fais un clic droit, option "propriétés", "Versions précédentes", tu dois en avoir une, tu la sélectionne, tu cliques sur "Copier" et tu fais "coller" dans le dossier C:\Program Files\Microsoft SDKs\Windows\v7.0A\lib\

    La ligne de commande à entrer est:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    link /DLL "C:\Program Files\Microsoft SDKs\Windows\v7.0A\lib\AdvAPI32.Lib" authenticate.obj
    Ça doit marcher si tu compiles en 32 bits.

  6. #6
    Membre expérimenté
    Homme Profil pro
    Inscrit en
    Décembre 2010
    Messages
    734
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Décembre 2010
    Messages : 734
    Points : 1 475
    Points
    1 475
    Par défaut
    Ce qui me surprend c'est que sur un windows 7 64bits, mon VS2010 parvient sans problème à compiler & linker avec la séquence suivante:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    cl /c authentication.cpp
    link /DLL AdvAPI32.Lib authentication.obj
    Autrement dit: il trouve automatiquement la bonne version de AdvAIP32.Lib pour peu qu'on liu indique de la linker. Je suppose que le Lib que tu avais téléchargée et linkée était au mauvais format (64 bits?)

  7. #7
    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 therwald Voir le message
    Pour une raison que je ne comprends pas, je ne peux modifier mon post ci-dessus OR IL EST FAUX ET DANGEREUX.
    Plains-toi à un mod, c'est leur boulot depuis que quelqu'un a eu la brillante idée d'interdire au commun des mortels d'éditer eux-mêmes leurs messages vieux de plus de trois jours.
    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.

  8. #8
    Membre expérimenté
    Homme Profil pro
    Inscrit en
    Décembre 2010
    Messages
    734
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Décembre 2010
    Messages : 734
    Points : 1 475
    Points
    1 475
    Par défaut
    Citation Envoyé par therwald Voir le message
    Au hasard, je dirais que si tu as le header, tu as le .lib qu'il faut quelque part dans ton SDK, dans la bonne version, sans aller le télécharger au hasard sur le net en risquant de tomber sur une version 32bits alors que tu travailles en 64 (ou l'inverse), par exemple.
    Ceci dit, pour spécifier le link tu dois ajouter la libririe d'import (.lib) avec l'option suivante: /implib advapi32.lib. Les fichiers qui sont listés directement doivent être des fichiers objet.
    Faut de pouvoir éditer moi-même ce message: attention, ne pas appliquer l'option proposée /implib à une lib tierce, ça va la corrompre (ce commutateur sert en fait à definir le nom du fichier .lib qu'on va créer pour la DLL produite par le linker.

    Il reste vrai que les DLL système sont fournies dans les SDK, et qu'il vaut mieux utiliser celles-là que des lib téléchargées au hasard Si on prend sur le net sans précautions, on risque:
    • de télécharger une lib porteuse de code malveillant (ce qui aura pour effet d'inclure ce code malveillant dans les exécutables produits, et éventuellement de le distribuer ...)
    • de télécharger la mauvaise version avec pour effet que cela ne marche pas

  9. #9
    Membre à l'essai
    Inscrit en
    Février 2007
    Messages
    17
    Détails du profil
    Informations forums :
    Inscription : Février 2007
    Messages : 17
    Points : 14
    Points
    14
    Par défaut
    Ça marche.

    Merci beaucoup pour votre aide.

    Il semble en effet que mon advapi32 ait eu un soucis, mais le soucis date d'avant le test de link pour créer la dll.
    Je ne sais pas pourquoi, mais ça marche maintenant.

  10. #10
    Membre expérimenté
    Homme Profil pro
    Inscrit en
    Décembre 2010
    Messages
    734
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Décembre 2010
    Messages : 734
    Points : 1 475
    Points
    1 475
    Par défaut
    bonjour,
    si tu avais mis dans tes sources une lib téléchargée du net, elle a pris le pas sur celle du SDK. Si ce n'était pas la bonne (ex: 64 bits au lieu de 32) ça a pu être à l'origine du problème.

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

Discussions similaires

  1. Deux méthodes de création Dll
    Par Hokagge dans le forum MFC
    Réponses: 6
    Dernier message: 12/01/2006, 11h04
  2. Création DLL pour utilisation sur VBA
    Par Fbartolo dans le forum C++Builder
    Réponses: 1
    Dernier message: 21/11/2005, 20h44
  3. Réponses: 2
    Dernier message: 31/10/2005, 13h40
  4. Création dll
    Par Vodkha dans le forum Langage
    Réponses: 6
    Dernier message: 14/10/2005, 09h15
  5. Réponses: 3
    Dernier message: 03/03/2005, 18h45

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