DLL en C utilisée par VB

DLL en C utilisée par VB - C - Programmation

Marsh Posté le 27-08-2003 à 12:34:35    

Bon voila je voudrait faire une dll en C que je souhaiterais utilisée après avec VB.
J'utilise DevC++4 et Vb4.
Voila le code en C :

Code :
  1. #include <string.h>
  2. #include <windows.h>
  3. #include <math.h>
  4. #define EXPORT __declspec (dllexport)
  5. long EXPORT errorMsg(char *buffer){
  6.     MessageBox(NULL,buffer,"Error",0);
  7.     return 0;
  8. }


et le code VB :

Code :
  1. Private Declare Function errorMsg Lib "f:\myLib.dll" (ByVal a As String) As Long
  2. Private Sub Form_Load()
  3. Dim a As Long
  4. a = errorMsg("test" )
  5. End Sub


 
Ca marche, ca m'affiche bien une fenetre mais après ca m'affiche :
 
Erreur d'éxécution 49:
Convention d'appel de dll incorect
 
J'ai essayé de faire une fonction qui renvoi des long, des int, rien du tout, sans code dedans mais j'ai toujours cette erreur.
 
Une idée?


Message édité par yoyo+ le 27-08-2003 à 14:14:48
Reply

Marsh Posté le 27-08-2003 à 12:34:35   

Reply

Marsh Posté le 27-08-2003 à 13:58:27    

Faut que la fonction soit en __stdcall

Reply

Marsh Posté le 27-08-2003 à 14:32:54    

ok, j'ai changé ca sauf que maintenant il n'export plus la fonction automatiquement. Donc j'ai crée un fichier dll.def qui contient :

Code :
  1. EXPORTS
  2. errorMsg


 
Sauf que le compilateur me jette :
gcc: f:\dll.def: linker input file unused since linking not done
 
 :(  

Reply

Marsh Posté le 28-08-2003 à 09:58:09    

Même pas une ptite idée ?  :??:

Reply

Marsh Posté le 28-08-2003 à 10:10:44    

T'as essayé :

Code :
  1. #define EXPORT __declspec (dllexport)
  2. EXPORT long __stdcall errorMsg(char *buffer){
  3.    MessageBox(NULL,buffer,"Error",0);
  4.    return 0;
  5. }


 
PS : il me semble que VB utilise des chaînes UNICODE. Toi tu exportes une fonctio qui accepte uen chaîne ANSI, alors méfiance ...


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

Marsh Posté le 28-08-2003 à 11:16:09    

Change :
 

Code :
  1. #define EXPORT __declspec (dllexport)


 
par  

Code :
  1. #define EXPORT __declspec (dllexport) WINAPI


Reply

Marsh Posté le 28-08-2003 à 12:33:22    

Bon j'ai trouvé :
Quand devc++ compile une dll il lance gcc puis dllwrap
Le probleme c'est quand on fournit un *.def, devc++ l'envoie a gcc au lieu de dllwrap et ca plante, donc j'ai refait un batch qui lance gcc et dllwrap avec mon *.def :

Code :
  1. set path=%path%;c:\dev-C_~1\Bin\
  2. C:\DEV-C_~1\Bin\gcc -c -DBUILDING_DLL=1 -I. "d:\dll.c"  -s  -IC:\DEV-C_~1\Include\ -IC:\DEV-C_~1\Include\G__~1 -IC:\DEV-C_~1\Include\ -LC:\DEV-C_~1\Lib\ -BC:\DEV-C_~1\Bin\
  3. C:\DEV-C_~1\Bin\dllwrap --export-all --def D:\export.def --output-def D:\debug.def --implib "D:\libNumeric.a" -o d:\Numeric.dll "d:\dll.o"
  4. pause


 
Pour l'histoire des chaines c'était juste pour un test, mon vrai programme n'en utilise pas par contre ma fonction en C utilise des "float x[]", comment est ce que je déclare ca en vb ?

Reply

Marsh Posté le 28-08-2003 à 15:26:10    

Ce serait pas plus simple de faire un objet COM que ton programme VB utilisera? (bon évidemment si il y a qu'une fonction a exporter c'est un peu bete)

Reply

Marsh Posté le 28-08-2003 à 15:36:52    

Ashe2 a écrit :

Ce serait pas plus simple de faire un objet COM que ton programme VB utilisera? (bon évidemment si il y a qu'une fonction a exporter c'est un peu bete)
 


 
Oula je connais pas trop ca...
Tu peux m'en dire un peu plus  :jap:

Reply

Marsh Posté le 28-08-2003 à 16:36:02    

En très gros et en résumé, COM (ou ActiveX ou OLE, ce qui est a peu près pareil dans l'idée) permet de créer des interfaces accessibles à partir de la plupart - enfin, les principaux en tout cas - langages.
 
Par exemple, DirectX est fait à partir d'objets COM (enfin, sauf la version Xbox, mais bon on s'en fout). Internet Explorer est un paquet d'objets COM, aussi (IWebBrowser, par exemple). Pareil pour DirectShow. Ces objets peuvent être réutilisés pour afficher par exemple une page HTML dans une fenêtre (il doit y avoir ca de base dans VB). Voila pour le résumé.
 
Sinon pour savoir comment s'en servir, suffit d'aller sur MSDN. Il y a aussi de nombreux tutoriaux sur www.codeguru.com. En C c'est probablement un peu plus compliqué qu'en C++, et moins bien documenté, mais ca reste faisable.
 
Après t'auras plus qu'a faire un CreateObject() dans ton projet VB (ou Delphi ou un script ASP ou ce que tu veux) et ca fonctionnera... si tout se passe bien  ;)
 

Reply

Marsh Posté le 28-08-2003 à 16:36:02   

Reply

Marsh Posté le 28-08-2003 à 21:58:12    

C'est vraiement se compliquer la vie ... un objet COM, juste pour ca. Personnellement, j'ai fait pas mal de DLL (en C/C++/PureBasic) et j'ai toujours défini mon export comme ce que j'ai définie plus haut, j'avais toute sorte d'argument en param (*char, *float, *byte ...), pour les *char j'envoyais le pointeur sur une chaine depuis VB ( StrPtr(la_chaine) ), et je n'ai jamais eu le moindre problème.

Reply

Sujets relatifs:

Leave a Replay

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