DLL调用详解:__declspec(dllexport)与extern 'C'的作用

4 下载量 200 浏览量 更新于2024-09-05 1 收藏 59KB PDF 举报
本文主要讨论了如何在不同编程语言之间通过DLL(动态链接库)进行调用,以及涉及到的关键技术。首先,我们了解到`__declspec(dllexport)`是一个编译指令,它告诉编译器将函数导出以便其他程序可以引用。在C++中,由于存在函数重载(Function Overloading),即相同名称但参数列表不同的函数,如果不使用`extern "C"`,编译器会根据函数的参数类型和数量来生成不同的函数名,这可能会导致跨语言调用时出现问题。因此,使用`extern "C"`是为了保持函数名称的一致性,确保在C++和C语言以及其他语言间调用时能正确匹配。 文章举例了两组重载函数:`intMax`和`doubleMin`,以及`intMin`和`doubleMin`,分别处理整型和双精度浮点数的比较。编译命令中,`cl/cdlltest.cpp`用于编译,`link/DLLdlltest.obj`用于链接生成DLL文件。通过`Depends`工具,可以看到DLL中包含多个导出函数的符号,如`?Min@@YANNN@Z`和`?Min@@YGHHH@Z`,这是重载函数的符号表示。 为了支持指针类型的传递,作者引入了一个宏`DLLEXPORT`,它封装了`extern "C" __declspec(dllexport)`的使用,简化了导出函数的定义。例如,`DLLEXPORT int swap(int* x, int& y)`展示了如何导出一个接受指针参数的函数。这个例子还演示了如何使用`__stdcall`调用约定,这是一种Windows标准的函数调用约定,与C++默认的`__cdecl`有所不同。 文章最后提到,虽然C++函数可以被导出供C语言使用,但C语言调用C++ DLL时通常需要通过动态加载(如`LoadLibrary`和`GetProcAddress`)来实现,这是因为C++的特性可能不适合静态链接。通过这种方法,不同语言的程序能够通过DLL共享功能,提高代码的复用性和可维护性。 本文讲解了如何在C++中使用`__declspec(dllexport)`、`extern "C"`和`__stdcall`等技巧来创建可以跨语言调用的DLL,并提供了相关的编译和使用方法,这对于开发需要多语言交互的项目具有实际指导意义。