我想制作一个简单、简单的 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 中来为 C(++) 代码制作一个 VB 前端(我有 Visual Studio 6,我只想制作一些表格和调用 DLL 的窗体上的对象的事件)。
我需要知道如何调用 gcc (/g++) 以使其创建 DLL,还需要知道如何编写 (/generate) 导出文件……以及我可以/不能在 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 ——我只是在取回我传递的参数的地址,它看起来像 -3048。
原文由 Carson Myers 发布,翻译遵循 CC BY-SA 4.0 许可协议
关于使用 MinGW 构建 DLL,这里有一些非常简短的说明。
首先,您需要将函数标记为导出,以便 DLL 的调用者可以使用它们。为此,请修改它们,使它们看起来像(例如)
然后,假设您的函数位于名为 funcs.c 的文件中,您可以编译它们:
-shared 标志告诉 gcc 创建一个 DLL。
要检查 DLL 是否确实导出了函数,请获取免费的 Dependency Walker 工具并使用它来检查 DLL。
对于可以自动执行构建 DLL 所需的所有标志等的免费 IDE,请查看优秀的 Code::Blocks ,它与 MinGW 配合得非常好。
编辑: 有关此主题的更多详细信息,请参阅 MinGW Wiki 上的文章 Creating a MinGW DLL for Use with Visual Basic 。