正确编写DLL

时间:2013-06-18 13:44:14

标签: c++ visual-studio dll coding-style

我仍然不完全确定如何在Visual Studio中正确编写DLL。

档案.h

#ifndef UPLOAD_H_
# define UPLOAD_H_

# ifdef UPLOAD_EXPORT
#  define UPLOAD_API __declspec(dllimport)
# else
#  define UPLOAD_API __declspec(dllexport)
# endif // UPLOAD_EXPORT

#include <Windows.h>
#include <WinInet.h>

extern "C" UPLOAD_API int uploadFTP(
    const char *...,
    const char *...,
    const char *...,
    const char *...,
    const char *...,
    const char *...);

#endif // UPLOAD_H_

文件.cpp

#include "upload.h"

extern "C" UPLOAD_API int uploadFTP(
    const char *...,
    const char *...,
    const char *...,
    const char *...,
    const char *...,
    const char *...)
{
  ...
}

这实际上有效,但在MSDN上写入.h文件:

#ifdef MATHFUNCSDLL_EXPORTS
#define MATHFUNCSDLL_API __declspec(dllexport) 
#else
#define MATHFUNCSDLL_API __declspec(dllimport) 
#endif

这实际上与我正在做的相反,并且他们没有在.cpp文件的函数上指定MATHFUNCSDLL_API。

修改

解决方案 - &gt;在Project Properties / C ++ / Preprocessor

下未正确定义UPLOAD_EXPORT

1 个答案:

答案 0 :(得分:2)

MSDN&lt; .h。文件中的#define语句是正确的。在构建DLL时定义UPLOAD_EXPORTS,因此所有UPLOAD_API函数都将声明为dllexport。您无法在其他任何位置定义它,因此所有客户都会将其视为dllimport

PS:如果您希望从C和C ++以外的语言中使用它们,您可能还想声明函数WINAPI(这意味着__stdcall)。但请注意,使用dllexport而不是.def文件导出具有特定于调用约定的装饰的函数名称(前导下划线等)