Я хочу создать простую, простую DLL, которая будет экспортировать одну или две функции, а затем попытаться вызвать ее из другой программы ... Везде, где я до сих пор смотрел, есть сложные вопросы, разные способы связать вещи вместе, странные проблемы, которые я даже не начал осознавать, пока существуют ... Я просто хочу начать, сделав что-то вроде этого:
Создайте DLL, которая экспортирует некоторые функции, например,
int add2(int num){
return num + 2;
}
int mult(int num1, int num2){
int product;
product = num1 * num2;
return product;
}
Я компилирую с MinGW, я хотел бы сделать это в C, но если есть какие-то реальные различия, делающие это в C ++, я хотел бы знать и их. Я хочу знать, как загрузить эту DLL в другую C (и C ++) программу, а затем вызывать эти функции из нее.
Моя цель, немного поиграв с DLL-библиотеками, состоит в том, чтобы сделать VB-интерфейс для C (++) кода, загрузив DLL-файлы в Visual Basic (у меня Visual Studio 6, я просто хочу сделать несколько форм и события для объектов в тех формах, которые вызывают DLL).
Мне нужно знать, как вызывать gcc (/ g ++), чтобы он создавал DLL, а также как писать (/ генерировать) файл экспорта ... и что я могу / не могу делать в DLL (например, я могу взять аргументы указателем / ссылкой из внешнего интерфейса VB? Может ли DLL вызывать теоретическую функцию во внешнем интерфейсе? Или у функции есть «указатель на функцию» (я даже не знаю, возможно ли это) из VB и назовите это?) Я совершенно уверен, что не могу передать вариант в DLL ... но это все, что я знаю на самом деле.
обновить снова
Хорошо, я понял, как скомпилировать его с помощью gcc, чтобы сделать dll, который я запускал
gcc -c -DBUILD_DLL dll.c
gcc -shared -o mydll.dll dll.o -Wl,--out-implib,libmessage.a
а потом у меня была другая программа, загрузившая его и протестировавшая функции, и она отлично работала,
Большое спасибо за совет,
но я попытался загрузить его с VB6, как это
Public Declare Function add2 Lib "C:\c\dll\mydll.dll" (num As Integer) As Integer
тогда я просто вызвал add2 (text1.text) из формы, но он дал мне ошибку во время выполнения:
«Не удается найти точку входа DLL add2 в C: \ c \ dll \ mydll.dll»
это код, который я скомпилировал для 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;
}
вызов из программы на С, как это работает, хотя:
#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.");
}
}
есть идеи?
решил
Чтобы решить предыдущую проблему, мне просто нужно было скомпилировать ее так:
gcc -c -DBUILD_DLL dll.c
gcc -shared -o mydll.dll dll.o -Wl,--add-stdcall-alias
и используйте этот вызов API в VB6
Public Declare Function add2 Lib "C:\c\dll\mydll" _
(ByVal num As Integer) As Integer
Я научился не забывать явно указывать ByVal или ByRef - я просто возвращал адрес аргумента, который я передал, похоже, -3048.