Visual Studio C++:我什么时候应该使用__declspec(dllimport)?

Rus*_*sel 7 c++ import dll export visual-studio

我在Visual Studio 2005及更高版本中有关于DLL构建/链接的问题.基本上我的理解和经验是这样的:

要构建DLL,我指定项目属性来构建DLL,然后我在__declspec(dllexport)前面的任何我想从DLL公开暴露的函数或成员.构建项目将生成DLL,Lib和头文件,可以像API或其他东西一样进行部署.

另一方面,要让您的其他已编译的可执行应用程序动态链接到DLL并使用其功能,您只需要让您的可执行项目包含头文件并链接到构建DLL时创建的小型lib文件.只要编译的应用程序可以找到DLL,一切都会工作.

这是我的经验,也是Microsoft DLL构建教程如何描述MSDN上的所有内容.我想知道:这是标准做法吗?你什么时候需要在任何地方使用__declspec(dllimport)?我错过了什么吗?

谢谢!

tro*_*foe 13

是的,您将使用__declspec(dllimport),并且您通常有一个宏来控制源文件是导出(如果它是您的DLL的一部分)还是导入(如果它是使用 - 可执行文件的一部分)符号.

在您的DLL中,您可以将清单常量设置为某种类型的构建设置,比如说"BUILDING_MY_DLL",然后在头文件中创建这样的宏:

#ifdef BUILDING_MY_DLL
#define MY_DLL_EXPORT __declspec(dllexport)
#else
#define MY_DLL_EXPORT __declspec(dllimport)
#endif
Run Code Online (Sandbox Code Playgroud)

然后装饰你导出的函数,如下所示:

MY_DLL_EXPORT int func(int y);
Run Code Online (Sandbox Code Playgroud)

您也可以这样导出整个类:

class MY_DLL_EXPORT InterestingClass
{
...
};
Run Code Online (Sandbox Code Playgroud)

  • @Russel:dllimport不是必需的,但我认为这是最好的做法.请参阅:http://stackoverflow.com/questions/4489441/why-when-is-declspec-dllimport-not-needed (3认同)
  • 很好的答案,谢谢!我查看了一些 DLL 的源代码,它们似乎都是按照您指定的方式设计的。我仍然想知道,为什么这个 MSDN Microsoft 教程代码不使用 __declspec(dllimport) 就可以逃脱?-> http://msdn.microsoft.com/en-us/library/ms235636.aspx (2认同)