C++ aidez-moi avec ces s******* de dll !!!!! -> new pb, new indice

C++ aidez-moi avec ces s******* de dll !!!!! -> new pb, new indice - Programmation

Marsh Posté le 14-05-2001 à 17:09:37    

Donc, maintenant, pas de problem, ça compile ....
 
j'ai maintenant des problem à l'execution, du style opération non conforme et tout qui plante ...
 
j'ai ouvert le dll avec depends.exe livré avec visual C++.
'y me dit que c'est un DLL win32 console ...
Est-ce que le fait que ce soit un win32 console et pas un win32 GUI peut etre à l'origine de ce pb ?

 

[edit]--Message édité par Moustaaki--[/edit]

Reply

Marsh Posté le 14-05-2001 à 17:09:37   

Reply

Marsh Posté le 14-05-2001 à 17:11:06    

Un LoadLibrary, et après choper tes fonctions avec des GetProcAddress.

Reply

Marsh Posté le 14-05-2001 à 17:13:06    

Moustaaki a écrit a écrit :

je ne suis toujours pas parvenu à utiliser correctement mes dlls .
J'obtient en général l'erreur suivante lorsque j'essaye d'utiliser la fonction :
Error:  Error: Unresolved external 'NiffToPlay(char*,char*) __stdcall' referenced from module transcripteur.cpp
 
 
dans l'entête du fichier source, mêt la ligne suivante (que j'ai sagement recopié dans un programme qui utilise cette même fonction) :
extern int _import pascal NiffToPlay(char *pFilePlay, char *pFileNiff);
 
sachant que je programme avec Borland C++, il -y-a t-il autre chose à faire (style un include, un import, ...) ?
Je dois inclure le dll dans mon projet, n'est-ce pas ?
J'ai essayé d'inclure les librairies mais Borland n'arrive pas à les lire...  
Lorsque j'essaye d'ouvrir une des DLL, c'est tout vide...
 
Qu'est ce que je dois faire ?  
 
merci d'avance !   :jap:




 
Pour fair ca il te faut le .lib qui va avec la dll (il a ete genere en meme temps)
utilise le couple LoadLibrary / GetProcAdress() et un pointeur sur la fonction...

Reply

Marsh Posté le 14-05-2001 à 17:13:49    

Pardon z51, j'ai ete un peu plus lente que toi !

Reply

Marsh Posté le 14-05-2001 à 17:17:57    

lis donc le topic " [C++] Utilisation d'une fonction d'une DLL ???" pas tres loin du tiens
y'a un truc sur BC et les .lib ...


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

Marsh Posté le 14-05-2001 à 17:21:18    

Oui mais c'est quoi ce LoadLibrairi ? c'est le premier prog que je fais pour windows et ça ne me dis rien tout ça ....
 
et dans le dit topic, ya rien qui m'aide vraiment
 
Je viens de trouver ce LoadLibrary ...
LoadLibrary("leCheminDeLaLib" ); // c'est bein ça ?
 
 
 
 
(C'est pas un truc du genre Dynamic Loaded Library plutôt ? en réponse au topic plus bas...)

 

[edit]--Message édité par Moustaaki--[/edit]

Reply

Marsh Posté le 14-05-2001 à 17:24:57    

seblamb : "On peut se passer de loadlibrairy sous tous les produits C++ Builder ou Borland C++.
Il suffit de convertir le .lib avec "coff2omf.exe" qui se trouve dans le reprtoire de "bcb.exe""
 
c de ca que je parlais
 
sinon, d'apres ce que je pense avoir compris, à part kernel32.dll, toutes les autres dll ne sont pas forcement chargees en memoire (c le but : si on en a pas besoin on les charge pas)
alors, avant d'utiliser une fonction d'une dll, faut la charger via load library
puis tu la link dynamiquement ("dynamic linked library" ou un truc comme ca) via GetProcAdress() ...


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

Marsh Posté le 14-05-2001 à 17:30:18    

LoadLibrary permet de charger une DLL en mémoire:
HINSTANCE LoadLibrary(nom_fichier_dll);
 
et GetProcAddress récupère le pointeur de la fonction qui se trouve dans la DLL:
FARPROC GetProcAddress(HMODULE hModule, LPCSTR lpProcName);  
hModule : ce qui est retourné par LoadLibrary
lpProcName : nom de la fonction dans une chaine
 
Consulte l'aide


---------------
Configuration
Reply

Marsh Posté le 14-05-2001 à 17:30:23    

donc je n'ai pas besoin de cette connerie :  
extern int _import pascal NiffToPlay(char *pFilePlay, char *pFileNiff);
 
 
??
 
 
je fais un truc de ce genre dans le main par exemple :
         HINSTANCE truc = LoadLibrary("niffplay.lib" ) ;
         GetProcAddress(truc, "NiffToPlay" ) ;

 

[edit]--Message édité par Moustaaki--[/edit]

Reply

Marsh Posté le 14-05-2001 à 17:37:51    

// Déclarer un type de la fonction
typedef void (NIFFTOPLAY)(char *, char *);
 
// Charger la DLL en mémoire
HINSTANCE libInst = LoadLibrary("machin.dll" );
 
// Déclarer la fonction
NIFFTOPLAY *niffToPlay;
 
// Récupérer l'adresse de la fonction
niffToPlay = (NIFFTOPLAY *)GetProcAddress(libInst, "NiffToPLay" );
 
// Appeler la fonction
(*niffToPlay)(parametre_a, parametre_b);
 
Alors, si ca ne marche pas, je veux bien faire moine...


---------------
Configuration
Reply

Marsh Posté le 14-05-2001 à 17:37:51   

Reply

Marsh Posté le 14-05-2001 à 17:43:16    

noregret a écrit a écrit :

// Déclarer un type de la fonction
typedef void (NIFFTOPLAY)(char *, char *);
 
// Charger la DLL en mémoire
HINSTANCE libInst = LoadLibrary("machin.dll" );
 
// Déclarer la fonction
NIFFTOPLAY *niffToPlay;
 
// Récupérer l'adresse de la fonction
niffToPlay = (NIFFTOPLAY *)GetProcAddress(libInst, "NiffToPLay" );
 
// Appeler la fonction
(*niffToPlay)(parametre_a, parametre_b);
 
Alors, si ca ne marche pas, je veux bien faire moine...




 
 
 
COOL !!
Merci !!    :hello:  :hap:

Reply

Marsh Posté le 15-05-2001 à 11:47:14    

Hélas !!!
J'ai un nouveau problem :
Le prog compile niquel mais il "vide" les dll :
ils passent tous à 10Ko alors qu'ils en faisaient à peu près 80...
 
en plus de ça, à l'appel de la fonction, j'obtient l'erreur :
 
Thread 1 stopped
(...)leNomDuProg.exe
fault :access violation at Ox1:  read of adress truc
 
et ya tout qui plante

Reply

Marsh Posté le 15-05-2001 à 12:07:49    

==> passe au JAVA :D

Reply

Marsh Posté le 15-05-2001 à 12:16:02    

gérer les dll, y a pas à dire, c vraiement casse couille...

Reply

Marsh Posté le 15-05-2001 à 12:56:37    

Utiliser une dll c'est très simple : il suffit de lire les documentation.
Déja j'ai jamis vu une dll se vider en compilant un programme qui l'utilise.  :pt1cable:  
 
Sinon
 LoadLibrary
 GetProcAddress
c'est très souple d'utlisation mais il faut regarder les erreurs qu'elle revoient ( voir documentation)
 
Sinon le plus simple c'est d'utiliser un .lib
Si ta dll et ton programme on été créé avec Borland :
  IMPLIB toto.lib toto.dll  
ça crée un  toto.lib que tu inclus dans le projet de ton programme qui utilise la dll.
Et là tu reprend les programme comme il était au début ( sans LoadLibrairy..).  
Si tu as encore le message "Unresolved external 'NiffToPlay..." c'est que ta dll n'est pas bonne.


---------------
[:seblamb] Moi aussi je veux grater dédé!!!
Reply

Marsh Posté le 15-05-2001 à 12:56:42    

Utiliser une dll c'est très simple : il suffit de lire les documentation.
Déja j'ai jamis vu une dll se vider en compilant un programme qui l'utilise.  :pt1cable:  
 
Sinon
 LoadLibrary
 GetProcAddress
c'est très souple d'utlisation mais il faut regarder les erreurs qu'elle revoient ( voir documentation)
 
Sinon le plus simple c'est d'utiliser un .lib
Si ta dll et ton programme on été créé avec Borland :
  IMPLIB toto.lib toto.dll  
ça crée un  toto.lib que tu inclus dans le projet de ton programme qui utilise la dll.
Et là tu reprend les programme comme il était au début ( sans LoadLibrairy..).  
Si tu as encore le message "Unresolved external 'NiffToPlay..." c'est que ta dll n'est pas bonne.


---------------
[:seblamb] Moi aussi je veux grater dédé!!!
Reply

Marsh Posté le 15-05-2001 à 14:23:32    

En fait la dll se vide lorsque je l'inclu dans le projet...
Alors, j'ai essayé sans et la apparement, ça ne le fait plus ...
 
je n'ai plus le message "Unresolved external 'NiffToPlay..."
Mais j'ai toujours l'erreur operation non conforme lorsque je lance mon programme.
 
 :gun:  :gun:  
ça métonnerai que ça vienne des dll parcequ'elles sont censées fonctionner puisqu'un programme de test (livré avec)qui utilise les même fonctions fonctionne parfaitement. Cependant dans leur programme, ils ne font pas du tout  ce que tu m'as dit de faire, enfait ils mettent juste ça :
 
 
extern int _import pascal PlayToNiff(char *pFileNiff, char *pFilePlay);
extern int _import pascal NiffToPlay(char *pFilePlay, char *pFileNiff);
extern int _import pascal ScorToPlay(char *pFilePlay, char *pFileScor);
extern int _import pascal PlayToScor(char *pFileScor, char *pFilePlay);
 
/////////
/// Es-ce que le mot clé pascal veut dire que la dll a été faite en pascal ???????? Si oui, est-ce que ça peut être la source de mes prôblèmes ?
 
int
main()
{
printf( "Je suis dans Testdll.exe.\n" );
 
ScorToPlay("Kalog0.pla", "Kalog0.pmx" );
PlayToScor("Kalog0p.pmx", "Kalog0.pla" );
 
printf( "Je suis a la fin de Testdll.exe.\n" );
 
return 1;
}
 
 
c'est tout !!
et ça marche !!!
si je fais la même chose dans mon programme, he béh, ça marche po !!
c'est tout de même lourd !
 
 
De plus, je n'ai aucune documentation sur ces dll ! ce sont des dll fabriqué par une équipe de recherche

 

[edit]--Message édité par Moustaaki--[/edit]

Reply

Marsh Posté le 15-05-2001 à 14:45:21    

SNIFF !!!
ça marche po !!!
 
ça pourrait m'arranger de générer des .def ?
 
j'ai pas besoin de faire #include truc.lib ???
parceque si je le fais, il me dit qu'il ya des caractéres illegaux dedans et si je ne le mét pasn c'est comme si yavait pas les .lib  (et pourtant, je les ai bien mis dans le projet !)
 
 
ça me broute, le c++, putain !!!!
plus d'une semaine que j'y suis dessus, j'ai dejà eu du mal à trouvr commen tfaire un menu et maintenant, ça veut pas marcher et je ne sais pas quoi faire !!!!  (à part me faire moine peut-être)

 

[edit]--Message édité par Moustaaki--[/edit]

Reply

Marsh Posté le 15-05-2001 à 14:48:19    

Faut pas inclure la dll mais le .lib


---------------
[:seblamb] Moi aussi je veux grater dédé!!!
Reply

Marsh Posté le 15-05-2001 à 14:58:52    

je n'ai pas inclut la dll !!
j'ai inclu la lib, justement !
#include truc.LIB  ou pas ??

Reply

Marsh Posté le 15-05-2001 à 15:40:06    

Non dans le projet pas dans le fichier.
Je sais plus comment on fait sous Borland c++.
Rajoute le .lib dnas la fenetre où il y a les .cpp, .h, .rc ....


---------------
[:seblamb] Moi aussi je veux grater dédé!!!
Reply

Marsh Posté le 15-05-2001 à 15:59:12    

:pt1cable: moi ça marche, moi ça marche ! :pt1cable:

Reply

Marsh Posté le 15-05-2001 à 16:15:36    

eh ben tas bien de la chance, el gringo, parceque moi ça marche po ...
oui, je l'ai bien inclut dans le projet (dans la petite fenetre qui liste tous les fichiers du projet).
 
maintenant, j'ai l'erreur suivante :
call to undefined function ScorToPlay(char*, char*)
 
Si ya pas de ligne de code a rajouter ,bin, ça merde total !
 
je vais essayer avec visual C++ que je viens de récupérer ... on vera bien si ça marche mieux ! ya des différences pour importer les dll ou est ce que c'est le même principe ?

Reply

Marsh Posté le 15-05-2001 à 16:47:36    

Il y a une autre solution qui s'appelle; se documenter.
c'est super bien (si si je vous jure), ça permet de trouver precisement ce que l'on veut.
Et pour ça, t'as aussi bien internet que, allez disons la BU, les magasines voir meme ma grand mere.

Reply

Marsh Posté le 15-05-2001 à 17:46:21    

sa a l'air de la merde Borland apres tout ce ke je vois
vive Visual C++


---------------
haahhahahaha == TheJackal
Reply

Marsh Posté le 15-05-2001 à 18:19:57    

Sous visual ou borland c'est exactement la même chose.
La seule différences c'est que les formats de .lib ne sont pas compatibles.

Reply

Marsh Posté le 16-05-2001 à 10:44:13    

(j'ai trouvé qu'un pauv' bouquin de prog windows à la BU' :  
Programmer Windows avec Borland C++ 4.5  
il est bien pour apprendre à faire une interface mais après pour les dll, ils disent queud (ou alors, c'est que je ne sais pas lire)
 
sinon les autres bouquins, c'est de la prog sous linux ...
apparement, ya pas bp de gars qui apprennent la prog windows
 
 
Mon dll est un win32 console, ça peut poser prôblem ?

 

[edit]--Message édité par Moustaaki--[/edit]

Reply

Marsh Posté le    

Reply

Sujets relatifs:

Leave a Replay

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