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

  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 397
    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 397
    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.

  7. #7
    Membre averti
    Inscrit en
    Novembre 2006
    Messages
    31
    D�tails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 31
    Par d�faut
    Et �a compile, �a?
    Eh oui ! Ca compile �a ...
    La compilation est m�me la seule chose qui marche dans les deux cas (avec ou sans prise en charge du CLR).
    Par contre, � l'execution du programme, �a marche uniquement sans prise en charge du CLR. C'est ce que je n'arrive pas � comprendre.
    Pourquoi, il y a quelque chose qui te semble louche ?

    Tu as activ� les version Template des fonctions de la Secure CRT, c'est �a?
    L� tu viens de m'enrhumer !!!
    Je ne sais m�me pas ce que sont les fonctions de la Secure CRT. Alors les versions Template ...
    Si c'est en rapport � l'utilisation de la fonction "strcpy_s" plut�t que "strcpy", d'apr�s ce que j'ai lu dans l'aide, il me parraissait mieux d'utiliser cette fonction. Mais c'est peut �tre une erreure ?
    Penses tu que mes ennuis peuvent venir de l� ?

    Au fait: Pourquoi castes-tu tes tableaux de caract�res en char* ? La conversion est implicite, normalement...
    C'�tait juste un essai. La conversion est normalement implicite mais comme le programme plantait, je me suis dit qu'il y avait peut �tre quelque chose � ce niveau. Mais non, le caste n'a rien chang�.

  8. #8
    Expert �minent
    Avatar de M�dinoc
    Homme Profil pro
    D�veloppeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 397
    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 397
    Par d�faut
    Tu peux oublier ma question, elle vient du fait que j'aie mal lu l'aide de strcpy_s() et des Secure Template Overloads. D�sol� de t'avoir embrouill� pour une b�tise.

    Quand aux probl�mes de lien avec la biblioth�que, je dirais qu'il y a peut-�tre tout simplement un probl�me de r�pertoire. V�rifie que le .exe est bien au m�me endroit dans les deux cas...

    Si la DLL est � toi, tu peux aussi v�rifier son code source, notamment les constructeurs de ses variables globales et sa fonction DllMain() s'il y en a une: Il est possible que le code ex�cut� au chargement de la DLL provoque une AccessViolation dedans...
    Edit: Je viens de relire le premier post...
    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
    Membre averti
    Inscrit en
    Novembre 2006
    Messages
    31
    D�tails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 31
    Par d�faut
    J'ai v�rifi� que les .exe �taient bien au m�me endroit et c'est bien le cas.

    J'ai tent� aussi de d�placer les .exe dans les r�pertoires du .lib ou du .dll mais rien n'y fait. Ca marche toujours en compilant sans prise en charge du CLR et ca marche jamais avec prise en charge du (/clr).

    Est-ce que quelqu'un pourrais m'expliquer la diff�rence entre ces deux options dans les propri�t�s du projet ?
    Que font de plus ou de moins le compilateur ou l'�diteur de lien ?

  10. #10
    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
    tu as chang� l'option /clr pour tout le projet ? ou uniquement pour les fichiers cpp o� tu avais besoin d'utiliser le framework.net ?

  11. #11
    Membre averti
    Inscrit en
    Novembre 2006
    Messages
    31
    D�tails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 31
    Par d�faut
    Pour tout le projet !

    Je ne sais pas comment faire pour changer l'option que sur un fichier .cpp et je ne savais m�me pas que c'�tait possible.

    Pourrais-tu me donner la proc�dure ?
    Je pourrais faire un essai ...

  12. #12
    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
    c'est meme recommand�, de le faire uniquement sur les fichiers o� tu en as besoin. Le r�sultat sera tout de meme un exe manag�, mais seuls les fichiers necessaire auront �t� compil�s en manag�.
    Tu d�sactives l'option sur tout le projet
    Puis tu fais un clic droit sur chaque fichier, propri�t�s et tu actives dans le menu C++ l'option de compilation avec prise en charge du CLR (de tete, j'ai pas le vs sous la main, donc c'est pas forc�ment 100% ca )

  13. #13
    Membre averti
    Inscrit en
    Novembre 2006
    Messages
    31
    D�tails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 31
    Par d�faut
    Merci pour l'info !

    Je ne peux pas faire l'essai maintenant mais je te donnerais le r�sultat ce soir ...

  14. #14
    Membre averti
    Inscrit en
    Novembre 2006
    Messages
    31
    D�tails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 31
    Par d�faut
    D�sol� pour la r�ponse tardive ...

    Malgr� une multitude de tests dans diff�rentes configurations, j'obtiens toujours le m�me r�sultat.

    Je crois que je vais abandonner l'utilisation de cette DLL dans une application Windows Forms et essay� autre chose :
    D�velopper une premi�re application Console Win32 qui utilise la DLL, et une seconde application Windows Forms pour l'interface utilisateur.
    Par contre je ne sais pas encore comment passer les commandes de l'une � l'autre.
    Si vous avez des id�es, elles sont les biens venues ...

    Merci pour tout !

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