【问题标题】:Exporting functions from a DLL using __declspec(dllexport)使用 __declspec(dllexport) 从 DLL 导出函数
【发布时间】:2014-02-24 10:29:06
【问题描述】:

我正在开发一个项目(VS 2012 解决方案),包括joystic.cpp。项目已创建为 DLL,以便能够从另一个项目调用库。应用程序通过对话计时器以独占模式接收即时游戏手柄数据,并在对话框中显示它们。

我用宏编辑了resource.h 文件:

#ifdef LIBRARY_EXPORTS
#    define LIBRARY_API __declspec(dllexport)
#else
#    define LIBRARY_API __declspec(dllimport)
#endif

为了能够通过排序导出函数:

LIBRARY_API function();

但是,我应该导出程序的所有功能吗?

【问题讨论】:

    标签: c++ visual-studio-2012 dll dllexport


    【解决方案1】:

    是否应该导出程序的所有功能?

    通常在设计库接口时,您应该只导出库使用者所需的函数。

    如果您导出了每个函数,那么您需要记录每个函数。但是,图书馆使用者可能不需要许多功能。许多函数对于库的实现是私有的。

    此外,通过导出所有函数,您将使库的未来开发更加困难。如果您想将接口更改为您导出的这些私有函数之一怎么办?您将不得不引入另一个具有不同名称的函数,或者使用现有名称,从而破坏二进制向后兼容性。这些选项都不是特别吸引人。

    本质上,图书馆公共界面的表面积越大,您的维护任务就越大。因此,您通常的目标是提供尽可能小的公共接口,为图书馆消费者提供所需的功能。

    【讨论】:

    • 感谢您的回复。但是,我还是有点困惑。在我的 joystic.cpp 中,每个函数都是从 WinMain 内部调用的,并且似乎需要所有这些函数才能获得打印游戏手柄代码的对话框。我只需要导出 WinMain 吗?我用命令尝试了这个:extern "C" int __declspec(dllexport) __stdcall _tWinMain(HINSTANCE hInst, HINSTANCE h0, LPTSTR lpCmdLine, int nCmdShow); 但失败并出现错误:C2059 syntax error '__declspec(dllexport)' 我该怎么办?
    • 您无法导出WinMain。您只需要导出从库外部调用的任何函数。如果这恰好是您库中的所有功能,那将是不寻常的。我试图更广泛地回答。
    猜你喜欢
    • 2012-04-14
    • 2021-09-17
    • 2011-03-28
    • 2018-08-05
    • 2013-03-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-14
    相关资源
    最近更新 更多