使用__declspec(dllexport)代替-EXPORT:

时间:2015-12-18 23:18:00

标签: c++ windows visual-c++ dll

我正在查看导出函数的文档,并声明__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"));

我没有收到任何编译器错误或警告。

1 个答案:

答案 0 :(得分:2)

问题是因为你正在导出一个C ++函数,它有一个错误的名字。您需要将受损的名称传递给GetProcAddress(从不开心),或者您需要在函数声明中使用__stdcall取消导出

LIBRARY_API __stdcall void PrintTest

extern "C"__stdcall更简单,并将调用约定从C ++样式更改为C样式。 (这可能需要将“_PrintTest”传递给GetProcAddress,因为C函数名称的导出方式。)