【发布时间】:2016-03-25 17:43:00
【问题描述】:
我正在查看导出函数的文档,它指出 __declspec(dllexport) 应该在命令行版本 -EXPORT: 之前使用:如果可能的话。我目前正在使用命令行变体。在尝试进行这些更改时,我试图了解正确的实现,但我遇到了问题。
DLL 的头文件:
#ifdef LIBRARY_EXPORTS
#define LIBRARY_API __declspec(dllexport)
#else
#define LIBRARY_API __declspec(dllimport)
#endif
#define PRINT_TEST(name) LIBRARY_API void name()
typedef PRINT_TEST(print_log);
// ^ What's the C++11 equivalent with the using keyword?
DLL 的源文件:
PRINT_TEST(PrintTest) {
std::cout << "Testing DLL" << std::endl;
}
应用程序的源文件:
print_test* printTest = reinterpret_cast<print_test*>(GetProcAddress(testDLL, "PrintTest"));
问题是因为 __declspec(dllexport) 包含在 typedef 中吗?因此应用程序源文件中的语句实际上是:
__declspec(dllexport) void (*print_test)() printTest = reinterpret_cast<print_test*>(GetProcAddress(testDLL, "PrintTest"));
我没有收到任何编译器错误或警告。
【问题讨论】:
-
我有一个问题,你为什么要从 .dll 动态获取你的函数,而不是包含 .dlls 头文件,并链接到 .dlls lib 文件?
-
很难猜测 LIBRARY_API 可能是什么。使用 /EXPORT 链接器选项是从 DLL 导出标识符的一种方法。这是最痛苦的做法。下一个不那么痛苦的方法是使用 .def 文件。到目前为止,最简单的方法是在源代码中应用 __declspec(dllexport) 属性。任你选,认为最简单的方法是最简单的。
-
你有什么问题?
GetProcAddress返回 NULL? -
@AlgirdasPreidžius 我正在测试运行时编译的 C++。
-
@1201ProgramAlarm 是的,这正是它返回的内容。因此,我不确定我是否以正确的方式使用 _declspec(dllexport)。
标签: c++ windows visual-c++ dll