Je veux faire un simple, simple DLL qui exporte une ou deux fonctions, puis essayez de l'appeler à partir d'un autre programme... Partout où j'ai regardé jusqu'à présent, est pour compliqué les choses, les différentes façons de lier les choses ensemble, des problèmes bizarres que je n'ai même pas commencé à réaliser existent encore... je veux juste obtenir commencé, en faisant quelque chose comme ça:
Faire une DLL qui exporte à certaines fonctions, comme,
int add2(int num){
return num + 2;
}
int mult(int num1, int num2){
int product;
product = num1 * num2;
return product;
}
Je compile avec MinGW, j'aimerais le faire en C, mais si il y a de véritables différences de le faire en C++, j'aimerais savoir ceux aussi. Je veux savoir comment charger les DLL dans un autre C (et C++) du programme, et ensuite appeler ces fonctions à partir d'elle. Mon but ici, après avoir joué avec Dll pour un peu, est de faire une VB front-end pour le C(++) du code, par le chargement des Dll en visual basic (j'ai visual studio 6, je veux juste faire certaines formes et manifestations pour les objets sur les formes, où l'appel de la DLL).
J'ai besoin de savoir comment appeler gcc (/g++) de manière à créer une DLL, mais aussi la façon d'écrire (/générer un fichier d'exportation... et ce que je peux/ne peux pas le faire dans une DLL (comme, puis-je prendre des arguments par pointeur/référence de la VB front-end? Peut l'appel de la DLL théorique de la fonction dans le front-end? Ou prendre un "pointeur de fonction" (je ne sais même pas si c'est possible) à partir de VB et de l'appeler?) Je suis assez certain que je ne peux pas passer d'une variante à la DLL...mais c'est tout ce que je sais vraiment.
mise à jour
Ok, j'ai compris comment le compiler avec gcc, pour faire de la dll, j'ai couru
gcc -c -DBUILD_DLL dll.c
gcc -shared -o mydll.dll dll.o -Wl,--out-implib,libmessage.a
et puis j'ai eu un autre programme de la charge et de tester les fonctions, et il a travaillé beaucoup, merci beaucoup pour les conseils, mais j'ai essayé de le charger avec VB6, comme ceci
Public Declare Function add2 Lib "C:\c\dll\mydll.dll" (num As Integer) As Integer
alors je viens d'appeler add2(texte1.texte) à partir d'un formulaire, mais il m'a donné une erreur à l'exécution:
"Impossible de trouver le DLL point d'entrée dans add2 C:\c\dll\mydll.dll"
c'est le code que j'ai compilé pour la DLL:
#ifdef BUILD_DLL
#define EXPORT __declspec(dllexport)
#else
#define EXPORT __declspec(dllimport)
#endif
EXPORT int __stdcall add2(int num){
return num + 2;
}
EXPORT int __stdcall mul(int num1, int num2){
return num1 * num2;
}
l'appelant depuis le programme C comme cela a fonctionné, si:
#include<stdio.h>
#include<windows.h>
int main(){
HANDLE ldll;
int (*add2)(int);
int (*mul)(int,int);
ldll = LoadLibrary("mydll.dll");
if(ldll>(void*)HINSTANCE_ERROR){
add2 = GetProcAddress(ldll, "add2");
mul = GetProcAddress(ldll, "mul");
printf("add2(3): %d\nmul(4,5): %d", add2(3), mul(4,5));
} else {
printf("ERROR.");
}
}
des idées?
résolu
Pour résoudre le problème précédent, j'ai juste eu à le compiler comme suit:
gcc -c -DBUILD_DLL dll.c
gcc -shared -o mydll.dll dll.o -Wl,--add-stdcall-alias
et utiliser cette API appel en VB6
Public Declare Function add2 Lib "C:\c\dll\mydll" _
(ByVal num As Integer) As Integer
J'ai appris à ne pas oublier de préciser ByVal ou ByRef explicitement--je viens de retrouver l'adresse de l'argument je suis passé, il semblait, -3048.