Skip to content

Instantly share code, notes, and snippets.

@puzzledqs
Last active August 29, 2015 14:13
Show Gist options
  • Save puzzledqs/a97174a4886aaca5177f to your computer and use it in GitHub Desktop.
Save puzzledqs/a97174a4886aaca5177f to your computer and use it in GitHub Desktop.
create dll project in VS

C 和C++ 对应不同的调用约定,产生的修饰符也各不相同,如下:

调用约定 extern "C" 或 .c 文件 .cpp、.cxx 或 /TP
C 命名约定 (__cdecl) _test ?test@@ZAXXZ
Fastcall 命名约定 (__fastcall) @test@0 ?test@@YIXXZ
标准调用命名约定 (__stdcall) _test@0 ?test@@YGXXZ

__declspec(dllexport) __declspec(dllimport)一般也是使用宏的形式:

#ifdef ONEDLL_EXPORTS
#define ONEDLL_API __declspec(dllexport)
#else
#define ONEDLL_API __declspec(dllimport)
#endif

这样在DLL代码本身就是__declspec(dllexport),在使用DLL的程序中就变成了__declspec(dllimport),这两标志分别用来指明当前的函数将被导出,和当前函数是被导入的。

上面的两个宏结合一下就是下面这样的了:

#ifdef ONEDLL_EXPORTS
#define ONEDLL_API __declspec(dllexport)
#else
#define ONEDLL_API __declspec(dllimport)
#endif

// 此类是从 OneDll.dll 导出的
#ifdef __cplusplus
extern "C"
{
#endif
class ONEDLL_API COneDll {
public:
    COneDll(void);
    ~COneDll(void);
    
    // TODO: 在此添加您的方法。
    int m_a;
    int m_b;
    int *m_p;
    int m_n;

    void AddValue();

};

extern ONEDLL_API int nOneDll;

ONEDLL_API int fnOneDll(void);

#ifdef __cplusplus
}
#endif
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment