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

VC++ .NET Discussion :

[Débutant]Encore un problème de DLL


Sujet :

VC++ .NET

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Inscrit en
    Novembre 2006
    Messages
    31
    Détails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 31
    Par défaut [Débutant]Encore un problème de DLL
    Bonjour à tous,

    Ca fait maintenant plus d'une semaine que je me casse les dents sur un problème d'importation de DLL. La DLL en question est fournie par une société tierce avec toute la documentation nécessaire pour l'utiliser.

    Maintenant, je commence juste à développer avec Visual C++ 2005 Express et je me replonge après plusieurs années de VB dans le langage C++ et j'avoue que j'ai un peu de mal. Mais grâce à developpez.com et ses sources d'informations on s'en sort.

    Jusque là ça va ...

    Après plusieurs tentatives infructueuses d'importation de la DLL dans une application "Windows Forms", j'ai fait des essais avec un projet "Console Win32" et la DLL fonctionne correctement. Mais uniquement avec l'option "sans prise en charge du CLR". Dès que je sélectionne l'option "avec prise en charge du CLR (/clr)" dans les propriétés du projet et en gardant le même code. La DLL n'est plus accessible et lors de l'execution j'ai des violatons d'accès mémoire.

    Et moi je voudrais bien l'importer dans une application "Windows Forms" ! Donc forcément avec l'option "avec prise en charge du CLR (/clr)". Et que ce soit en dynamique ou en statique, rien à faire, à l'execution je n'arrive pas à charger la DLL.

    Voici un exemple de code d'importation que j'ai essayé dans le projet "Windows Forms" :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    [DllImport("D:\\usr\\fox\\system32\\iccapi.dll", EntryPoint = "ICCopen")]
    __declspec(dllimport) int ICCopen(char *, int, char *); 
    [DllImport("D:\\usr\\fox\\system32\\iccapi.dll", EntryPoint = "ICCclose")]
    __declspec(dllimport) int ICCclose();
    Et pour l'appel des fonctions :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    ICCopen("FLY010",5,"01234567890123456789");
    ICCclose();
    A la compilation tout ce passe bien. Mais à l'execution, lors de l'appel des fonctions, voici ce que j'obtiens dans le fichier de sortie :

    'ESSAI_ICCAPI.exe'*: Chargé 'D:\usr\fox\system32\iccapi.dll', Le fichier binaire n'a pas été généré avec les informations de débogage.
    'ESSAI_ICCAPI.exe'*: Chargé 'D:\usr\fox\system32\csaretrv.dll', Le fichier binaire n'a pas été généré avec les informations de débogage.
    'ESSAI_ICCAPI.exe'*: Chargé 'D:\usr\fox\system32\largem.dll', Le fichier binaire n'a pas été généré avec les informations de débogage.
    'ESSAI_ICCAPI.exe'*: Chargé 'D:\usr\fox\system32\xhi.dll', Le fichier binaire n'a pas été généré avec les informations de débogage.
    'ESSAI_ICCAPI.exe'*: Chargé 'D:\usr\fox\system32\fox.dll', Le fichier binaire n'a pas été généré avec les informations de débogage.
    'ESSAI_ICCAPI.exe'*: Chargé 'D:\usr\fox\system32\foxfdr.dll', Le fichier binaire n'a pas été généré avec les informations de débogage.
    LDR: LdrRelocateImageWithBias() failed 0xc0000018
    LDR: OldBase : 00A00000
    LDR: NewBase : 03BE0000
    LDR: Diff : 0x7c91dec20012c8bc
    LDR: NextOffset : 00000000
    LDR: *NextOffset : 0x0
    LDR: SizeOfBlock : 0x3be0000
    'ESSAI_ICCAPI.exe'*: Déchargé 'D:\usr\fox\system32\iccapi.dll'
    'ESSAI_ICCAPI.exe'*: Déchargé 'D:\usr\fox\system32\csaretrv.dll'
    'ESSAI_ICCAPI.exe'*: Déchargé 'D:\usr\fox\system32\largem.dll'
    'ESSAI_ICCAPI.exe'*: Déchargé 'D:\usr\fox\system32\xhi.dll'
    'ESSAI_ICCAPI.exe'*: Déchargé 'D:\usr\fox\system32\fox.dll'
    'ESSAI_ICCAPI.exe'*: Déchargé 'D:\usr\fox\system32\foxfdr.dll'
    Une exception non gérée du type 'System.DllNotFoundException' s'est produite dans ESSAI_ICCAPI.exe

    Informations supplémentaires*: Impossible de charger la DLL 'D:\usr\fox\system32\iccapi.dll': Tentative d'accès à une adresse non valide. (Exception de HRESULT : 0x800701E7)
    Et là ça ne va plus du tout !
    Malgré toutes mes recherches je ne trouve pas d'où vient le problème.

    J'ai donc plusieurs questions :

    1) Pourquoi dans mon projet "Console Win32" le résultat de la compilation est différent entre les deux options de compilation "sans prise en charge du CLR" et "avec prise en charge du CLR (/clr)" alors que cette dernière est censée prendre en charge les deux types de code, managé et non managé ?

    2) A quoi correspondent "LDR" et la fonction "LdrRelocateImageWithBias()" qui me posent apparemment problème ?

    3) Est-ce qu'une âme fort charitable ou un "gourou du CLR" pourrait me venir en aide et m'indiquer des pistes à suivre pour arriver à importer cette DLL dans une application "Windows Forms" ?

    Merci à tous ceux qui ont prit le temps de me lire, et merci d'avance à ceux qui pouront m'apporter de l'aide !

  2. #2
    Rédacteur
    Avatar de nico-pyright(c)
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    6 414
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 6 414
    Par défaut
    pourquoi utiliser dllimport ? tu n'as pas le .lib associé ?

  3. #3
    Membre averti
    Inscrit en
    Novembre 2006
    Messages
    31
    Détails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 31
    Par défaut
    J'ai bien le .lib associé.

    Quand je l'utilise sans prise en charge du CLR dans mon projet "Console Win32" tout se passe bien et la DLL fonctionne.

    Mais quand je l'utilise avec prise en charge du CLR (/clr), au lancement de l'application j'ai un message d'erreur "Access Violation" et l'application se termine sur cette erreure.

    Voici le code que j'utilise dans les deux cas :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    extern "C" int ICCopen(char *cp_name, int security, char *user_id);
    extern "C" int ICCclose(void);
     
    #pragma comment (lib, "iccapi")
    Et voici ce que me donne le fichier de sortie avec prise en charge du CLR :

    'essai.exe'*: Chargé 'D:\usr\fox\system32\iccapi.dll', Le fichier binaire n'a pas été généré avec les informations de débogage.
    'essai.exe'*: Chargé 'D:\usr\fox\system32\csaretrv.dll', Le fichier binaire n'a pas été généré avec les informations de débogage.
    'essai.exe'*: Chargé 'D:\usr\fox\system32\largem.dll', Le fichier binaire n'a pas été généré avec les informations de débogage.
    'essai.exe'*: Chargé 'D:\usr\fox\system32\xhi.dll', Le fichier binaire n'a pas été généré avec les informations de débogage.
    'essai.exe'*: Chargé 'D:\usr\fox\system32\fox.dll', Le fichier binaire n'a pas été généré avec les informations de débogage.
    'essai.exe'*: Chargé 'D:\usr\fox\system32\foxfdr.dll', Le fichier binaire n'a pas été généré avec les informations de débogage.
    'essai.exe'*: Chargé 'D:\usr\fox\system32\nutc.dll', Impossible de trouver ou d'ouvrir un fichier DBG requis.
    'essai.exe'*: Chargé 'D:\usr\fox\system32\socket.dll', Impossible de trouver ou d'ouvrir un fichier DBG requis.
    'essai.exe'*: Chargé 'D:\usr\fox\system32\X11.dll', Impossible de trouver ou d'ouvrir un fichier DBG requis.
    'essai.exe'*: Chargé 'D:\usr\fox\system32\csabuild.dll', Le fichier binaire n'a pas été généré avec les informations de débogage.
    'essai.exe'*: Chargé 'D:\usr\fox\system32\ccsvr.dll', Le fichier binaire n'a pas été généré avec les informations de débogage.
    'essai.exe'*: Chargé 'D:\usr\fox\system32\spif.dll', Le fichier binaire n'a pas été généré avec les informations de débogage.
    'essai.exe'*: Chargé 'D:\usr\fox\system32\sprt.dll', Le fichier binaire n'a pas été généré avec les informations de débogage.

    Exception de première chance à 0x00a20b87 dans essai.exe*: 0xC0000005: Violation d'accès lors de l'écriture à l'emplacement 0x77e78b61.
    Exception de première chance à 0x77fa7412 dans essai.exe*: 0xC0000005: Access violation.
    Exception non gérée à 0x77fa7412 dans essai.exe*: 0xC0000005: Access violation.

    Exception de première chance à 0x77f5171c dans essai.exe*: 0xC0000005: Violation d'accès lors de la lecture de l'emplacement 0x00000010.
    HEAP[essai.exe]: Invalid Address specified to RtlFreeHeap( 007F0000, 7A2AE474 )
    Le thread 'Thread Win32' (0xfd0) s'est arrêté avec le code 0 (0x0).
    Le programme '[3504] essai.exe: Natif' s'est arrêté avec le code 0 (0x0).
    Le programme '[3504] essai.exe: Managé' s'est arrêté avec le code 0 (0x0).
    Comme je le demandais dans le précédent message, je ne vois pas pourquoi sans changer un ligne de code, le programme ne marche pas avec l'option "/clr" alors que sans tout se passe bien ???

    Si tu as une idée, je suis preneur ...

  4. #4
    Rédacteur
    Avatar de nico-pyright(c)
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    6 414
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 6 414
    Par défaut
    on peut voir l'appel à cette fonction ?

  5. #5
    Membre averti
    Inscrit en
    Novembre 2006
    Messages
    31
    Détails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 31
    Par défaut
    Pas de problèmes. Voir ci dessous :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    	int err;	
    	char cpname[7];
    	char userid[41];
     
    	err = 0;
     
    	strcpy_s(cpname, "FLY010");
    	strcpy_s(userid, "01234567890123456789");
     
    	err = ICCopen((char *)cpname, 5, (char *)userid);
    	printf("retour ICCopen : %d \n",err);
     
    	err = ICCclose();
    	printf("retour ICCclose : %d \n",err);

  6. #6
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 392
    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 392
    Par défaut
    Et ça compile, ça?
    Tu as activé les version Template des fonctions de la Secure CRT, c'est ça?
    Au fait: Pourquoi castes-tu tes tableaux de caractères en char* ? La conversion est implicite, normalement...
    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. Encore un problème de DLL
    Par Baghera dans le forum C++
    Réponses: 0
    Dernier message: 28/03/2011, 16h53
  2. Encore des problèmes avec le BDE
    Par Flint dans le forum C++Builder
    Réponses: 19
    Dernier message: 31/12/2007, 23h26
  3. [JNI] Encore un problème de chargement de dll
    Par seiryujay dans le forum Entrée/Sortie
    Réponses: 5
    Dernier message: 10/08/2006, 13h23
  4. [Débutant]Encore problème Makefile
    Par Clark dans le forum Systèmes de compilation
    Réponses: 1
    Dernier message: 31/05/2006, 16h06
  5. Problème de DLL.
    Par Lunedor dans le forum C++Builder
    Réponses: 2
    Dernier message: 29/11/2003, 10h17

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