[VC++] Problème étrange !

Problème étrange ! [VC++] - C++ - Programmation

Marsh Posté le 26-06-2003 à 09:48:55    

Salut,
 
Je suis victime d'un probleme vraiment bizarre, mon but étant de créer une Dll avec VC++ 6  et ensuite de l'utiliser avec Access. Cette dll se contente de retourner, a travers une fonction, un entier = 5 !
 
Alors, je crée cette dll (MFC dll-> regular Dll). Elle compile tres bien ! Alors, sur le meme ordinateur, j'y fait appel comme ceci :
 

Code :
  1. Private Declare Function getInt Lib "c:\ForVB.dll" Alias "AfficherMessage" () As Integer


 
tout en prenant soin de copier la dll générée sur C:\ !
 
Ensuite, je lance mon programme avec Access (VBA) et tout marche bien , le nombre est bien récupéré à partir de la dll !
 
Alors, l'idée me vient d'essayer cette dll sur un autre ordi, ne contenant pas Visual Studio, mais contenant Access ! Je fais la meme procédure, et la il me dit :
 
"Run-time error '53':
 
File not found : c:\forVB.dll"
 
Vraiment incroyable !  
 
Alors, juste pour le fun, je prends une dll quelconque de Windows (ici en loccurence aclui.dll), et je la copie sur c:\ tout en la renommant ForVB.dll !  
 
Et là, lorsque je lance mon programme Access, ca "marche", enfin, il me dit : "Can't find DLL Entry Point AfficherMessage...." ce qui pouve qu'il voit bien la DLL !
 
Est ce que vous arrivez à comprendre et m'expliquer la cause de tout ca? Est ce que ca vient du fait que je n'ai pas Visual Studio sur mon autre ordi?
 
Merci, Yoyo*

Reply

Marsh Posté le 26-06-2003 à 09:48:55   

Reply

Marsh Posté le 26-06-2003 à 09:50:21    

:heink: :heink: :heink:
 
 
ben tu mets ta dll ForVB.dll dans le c:\ de l'autre PC (et la bonne hein, pas un vieux traficouillage comme tu nous as fait)
 
la vc il est y pour pas grand chose
 

Reply

Marsh Posté le 26-06-2003 à 10:09:30    

chrisbk a écrit :

:heink: :heink: :heink:
 
 
ben tu mets ta dll ForVB.dll dans le c:\ de l'autre PC (et la bonne hein, pas un vieux traficouillage comme tu nous as fait)
 
la vc il est y pour pas grand chose
 
 


 
Bah, justement, c'est ce que je te dis : quand je mets la bonne ForVB.dll sur le C:\ de l'autre PC, il ne la voit pas, alors que quand je prends une dll quelconque de Windows, et que je la renomme en forVB.dll et que la mets sur c:\, il la voit m(ais ne peut l'utiliser of course !!)

Reply

Marsh Posté le 26-06-2003 à 10:11:01    

Yoyo@ a écrit :


 
Bah, justement, c'est ce que je te dis : quand je mets la bonne ForVB.dll sur le C:\ de l'autre PC, il ne la voit pas, alors que quand je prends une dll quelconque de Windows, et que je la renomme en forVB.dll et que la mets sur c:\, il la voit m(ais ne peut l'utiliser of course !!)


C'est exprès les variations au niveau de la 1ere lettre?
Une fois c'est f une fois c'est F...

Reply

Marsh Posté le 26-06-2003 à 10:14:49    

skeye a écrit :


C'est exprès les variations au niveau de la 1ere lettre?
Une fois c'est f une fois c'est F...


 
Non, j'ai vérifié, j'ai bien mis "ForVB.dll" de partout !
 
Ce n'est donc pas un probleme de casse !

Reply

Marsh Posté le 26-06-2003 à 10:23:13    

Le plus simple est de virer le c:\ devant ton nom, et de mettre ta dll soit dans system32, soit dans le répertoire d'Access. C'est un probleme avec Access / VBA, et moi Access ...


---------------
FAQ fclc++ - FAQ C++ - C++ FAQ Lite
Reply

Marsh Posté le 26-06-2003 à 10:28:42    

HelloWorld a écrit :

Le plus simple est de virer le c:\ devant ton nom, et de mettre ta dll soit dans system32, soit dans le répertoire d'Access. C'est un probleme avec Access / VBA, et moi Access ...


 
Voilà, je viens de le faire...
 
J'ai donc remplacé mon code par :  
 

Code :
  1. Private Declare Function getInt Lib "ForVB.dll" Alias "AfficherMessage" () As Integer


 
Et j'ai copié le fichier en question dans c:\windows\System32
 
Résultats :
1er PC : marche très bien
2eme PC : ne marche pas (meme symptome : File not Found !)
 
Vraiment chelou tout ça !

Reply

Marsh Posté le 26-06-2003 à 10:56:23    

Bon, voila, j'ai trouvé une solution à mon probleme...
 
En fait, la dll dont je vous ai parlée, je l'ai crée en faisant New Project => MFC AppWizard (dll) et en regardant les dependencies (utilitaire depends.exe de VS), il me disait : MSVCRTTD.DLL, KERNEL32.DLL, MFC42D.DLL
 
Là, je viens de créer la meme Dll, mais en utilisant New Project => Win32 Dynamic-Link Library, et làdepends.exe me donne comme dépendance seulement KERNEL32.DLL !
 
Donc, comme je le pressentais, ma premiere dll ne maarchait pas sur mon ordi sans Visual Studio, car elle avait besoin de MFC42D.DL pour fonctionner (sans doute installé avec Visual Studio???)
 
Voilà !
 
Si vous avez des commenaires la dessus, n'hésitez pas !
 
Yoyo*

Reply

Marsh Posté le 26-06-2003 à 10:59:36    

T'as peu eu de bol alors, t'es tombé sur un message d'erreur a la con. A priori il a pas pu loader la dll (car les dependances n'ont pas pu etre assuree) et en a conclu que s'il a pas pu loader la dll c t parce qu'elle n'existait pas
 
(sorry pour mon premier post j'avais mal compris ton souc)
 
Neanmoins, MFC42D est comme son D l'indique une DLL de debug, essaye de compiler ta DLL en release et de voir si ca marche comme ca

Reply

Marsh Posté le 26-06-2003 à 11:25:20    

chrisbk a écrit :

T'as peu eu de bol alors, t'es tombé sur un message d'erreur a la con. A priori il a pas pu loader la dll (car les dependances n'ont pas pu etre assuree) et en a conclu que s'il a pas pu loader la dll c t parce qu'elle n'existait pas
 
(sorry pour mon premier post j'avais mal compris ton souc)
 
Neanmoins, MFC42D est comme son D l'indique une DLL de debug, essaye de compiler ta DLL en release et de voir si ca marche comme ca
 


 
Parfait, ca marche :)
 
En fait, j'avais bien compris que tu n'avais pas trop compris ce que je disais( au vu de ta réponse), c'est donc pour ca que je t'avais répondu !
 
Sinon, comme tu dis, c'est "pas de bol", le prog me faisait croire qu'il ne trouvait pas le fihier, mais je me suis déouté que c'était pas vraiment le cas, et c'était d'ailleurs pour ca que j'avais pris un dll quelconque et renommé avec le nom de la dll que j'avais créée, et la, il m'a sorti une autre erreur !
 
En fait, je ne te cache pas que je ne connais aps encore beaucoup Visual C++ (j'ai pas assez d'expérience avec) et que je ne savais meme pas vraiment qu'il était possibl de créer des composants en debug ou en release (et d'ailleurs,q uelle est en gros la différence? La possibilité de debugger lorsque tu lances ton prog sous VS??), et je viens juste de découvrir qu'on pouvait changer ca en changeant "Set Active Configuration"
 
Donc, maintenant, ma Dll utilise MFC42.dll, MSVCRT.dll et Kernel32.dll
 
Est ce que ca veut dire qu'elle devrait normalement pouvoir tourner sous nimporte quel PC ayant Windows > 98?
 
D'autre part, en faisant un Win32 DLL, il n'y a plus toutes ces dépendances, seulement Kernel32.dll ! A quoi peuvent donc me servir les MFC? Ce serait par exemple pour les dialogues, ou les trucs du genre?
 
Merci en tout cas, j'y vois vraiment plus clair la dessus !

Reply

Marsh Posté le 26-06-2003 à 11:25:20   

Reply

Marsh Posté le 26-06-2003 à 11:27:45    

ben debug comme son nom l'indique c du debug : aucune optim et visu insere des infos dans ton prog pour s'y retrouver.
release il optimise, vire l'inutile et tout ca
 
MFC42.dll, MSVCRT.dll sont fournies depuis pas mal de tps avec win, donc pas de soucis. Les MFC un ensemble de classe facilitant la creation d'appli (gestion des fenetres/composant et tout ce barda)

Reply

Marsh Posté le 26-06-2003 à 12:03:18    

chrisbk a écrit :

ben debug comme son nom l'indique c du debug : aucune optim et visu insere des infos dans ton prog pour s'y retrouver.
release il optimise, vire l'inutile et tout ca
 
MFC42.dll, MSVCRT.dll sont fournies depuis pas mal de tps avec win, donc pas de soucis. Les MFC un ensemble de classe facilitant la creation d'appli (gestion des fenetres/composant et tout ce barda)
 


 
D'accord, c'est tres clair !
 
Et est ce que par exemple, les données du type CString font parties aussi du MFC? Et est ce que cette dll a évolué avec les versions de Windows (risques d'incompatbilités??)

Reply

Marsh Posté le 26-06-2003 à 13:31:45    

Oui, tout ce qui est MFC (CString, Cxxx, ...) est dans la dll MFC. msvcrt c'est la runtime C, c'est les fonctions standards du C.
Ces dll évoluent, mais soient restent compatibles, soient possèdent un autre nom (avec la dernière version de VC++ et donc des MFC, c'est MFC70.dll.
MFC42.dll t'es à peu près sûr de la trouver sur tous les postes, la nouvelle non.
Si ta dll est simple, passe toi des MFC et utilise la STL.


---------------
FAQ fclc++ - FAQ C++ - C++ FAQ Lite
Reply

Marsh Posté le 26-06-2003 à 17:57:49    

HelloWorld a écrit :

Oui, tout ce qui est MFC (CString, Cxxx, ...) est dans la dll MFC. msvcrt c'est la runtime C, c'est les fonctions standards du C.
Ces dll évoluent, mais soient restent compatibles, soient possèdent un autre nom (avec la dernière version de VC++ et donc des MFC, c'est MFC70.dll.
MFC42.dll t'es à peu près sûr de la trouver sur tous les postes, la nouvelle non.
Si ta dll est simple, passe toi des MFC et utilise

Code :
  1. la STL

.


 
La STL? Tu veux dire faire une Dll Win32 classique?

Reply

Marsh Posté le 26-06-2003 à 17:59:40    

Yoyo@ a écrit :


 
La STL? Tu veux dire faire une Dll Win32 classique?


nan, que si tu utilises que les CString des MFC alors autant laissé tomber et utiliser std::string

Reply

Marsh Posté le 26-06-2003 à 18:41:54    

J'en déduis  :STL = Standard Library? Pour utiliser je dois faire un include spécial, genre string.h ou c'est inclus?

Reply

Marsh Posté le 26-06-2003 à 21:34:45    

Yoyo@ a écrit :

J'en déduis  :STL = Standard Library? Pour utiliser je dois faire un include spécial, genre string.h ou c'est inclus?


 
Standard Template Library
 
En gros, ca rajoute des nouveaux types utiles, comme par exemple le type chaine de caracteres, ou encore le type liste.
HelloWorld te conseillait simplement une alternative aux MFC
 
edit : pour s'en servir tu fais par exemple :
 include <string> ( sans le .h )
Et tu dois aussi faire :
using namespace std;
Et la tu peux te servir du type string de la maniere suivante :
 
string a = "I love STL";


Message édité par Ace17 le 26-06-2003 à 21:38:59
Reply

Marsh Posté le 26-06-2003 à 22:16:11    

Ace17 a écrit :


 
Standard Template Library
 
En gros, ca rajoute des nouveaux types utiles, comme par exemple le type chaine de caracteres, ou encore le type liste.
HelloWorld te conseillait simplement une alternative aux MFC
 
edit : pour s'en servir tu fais par exemple :
 include <string> ( sans le .h )
Et tu dois aussi faire :
using namespace std;
Et la tu peux te servir du type string de la maniere suivante :
 
string a = "I love STL";


 
<string> en l'occurence, ca fait référence à la template et non pas au header comme d'hab?
 
Et c'est normalisé C++ tout ca?

Reply

Marsh Posté le 27-06-2003 à 09:33:01    

Oui, contrairement aux MFC.


---------------
FAQ fclc++ - FAQ C++ - C++ FAQ Lite
Reply

Marsh Posté le 27-06-2003 à 10:07:34    

Ace17 a écrit :


 
Standard Template Library
 
En gros, ca rajoute des nouveaux types utiles, comme par exemple le type chaine de caracteres, ou encore le type liste.
HelloWorld te conseillait simplement une alternative aux MFC
 
edit : pour s'en servir tu fais par exemple :
 include <string> ( sans le .h )
Et tu dois aussi faire :
using namespace std;
Et la tu peux te servir du type string de la maniere suivante :
 
string a = "I love STL";


 
Concretement, je pourrais accéder à a comme si c'était un tableau?
 
Et en mémoire, il y aura quoi? : "I love STL/0" ?

Reply

Marsh Posté le 27-06-2003 à 11:50:05    

Tu ne t'occupes pas de ce qu'il y a dans la mémoire! On s'en fiche! On cherche pas a savoir! Si tu veux accéder caractere par caractere il y a des fonctions d'acces mais a aucun moment on a besoin de savoir ce qu'il y a en mémoire ni comment c'est organisé.

Reply

Marsh Posté le 27-06-2003 à 11:51:00    

Yoyo@ a écrit :


<string> en l'occurence, ca fait référence à la template et non pas au header comme d'hab?


 
Ben il existe un fichier "string" sans extension qui est en fait un header. Sauf que tout ce qu'il déclare est dans un namespace d'ou le besoin de faire un usign apres.

Reply

Marsh Posté le    

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed