我想制作一个简单的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尝试后,我的目标是通过将DLL加载到Visual Basic中(我有Visual Studio 6,我只想为这些表单上的对象制作一些表单和事件,这些对象调用DLL),为C(++)代码制作VB前端。
我需要知道如何调用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),但是它给了我一个运行时错误:
"在C:\c\dll\mydll.dll中找不到DLL入口点add2"
这是我编译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
并在VB6中使用此API调用
Public Declare Function add2 Lib "C:\c\dll\mydll" _
(ByVal num As Integer) As Integer
我学会了要明确指定 ByVal 或 ByRef -- 看起来,我只是在获取传递给函数的参数的地址,而已。