Я хочу создать простую, простую DLL, которая экспортирует одну или две функции, а затем попытаться вызвать ее из другой программы... Всюду, где я смотрел до сих пор, это сложные вещи, разные способы соединения вещей, странные проблемы, которые я даже не начал начал, чтобы реализовать существовать еще... Я просто хочу начать, сделав что-то вроде этого:
Создайте DLL, которая экспортирует некоторые функции, например
int add2(int num){
return num + 2;
}
int mult(int num1, int num2){
int product;
product = num1 * num2;
return product;
}
Я компилирую с помощью MinGW, я бы хотел сделать это на C, но если есть какие-то реальные различия в С++, я бы тоже хотел это знать. Я хочу знать, как загрузить эту DLL в другую C (и С++) программу, а затем вызывать эти функции из нее. Моя цель здесь, немного поиграв с DLL, - сделать VB-интерфейс для кода C (++), загрузив библиотеки DLL в visual basic (у меня есть visual studio 6, я просто хочу сделать некоторые формы и события для объектов на тех формах, которые вызывают DLL).
Мне нужно знать, как вызвать gcc (/g++), чтобы он создавал DLL, но также как писать (/generate) файл экспорта... и то, что я могу/не могу сделать в DLL (например, могу ли я принимать аргументы указателем/ссылкой из front-end 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;
}
вызывал его из программы C, как это сработало, хотя:
#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.