##封装中的要点
__declspec(dllexport)
表明函数为导出函数 * `extern "C"`
导出的函数名与声明一致,否则导出函数名无法正常使用
当然,也可以通过定义`.def`文件实现函数名正常 * `_stdcall`
32位不能使用此声明
linux不能使用此声明 * WIN32 & _WINDOWS * WIN32 编译32位C+时使用 * _WINDOWS 编译64位时使用
#ifdef _WINDOWS //64位系统没有预定义 WIN32 #ifdef __cplusplus #define DLL_EXPORT_C_DECL extern "C" __declspec(dllexport) #else #define DLL_EXPORT_DECL __declspec(dllexport) #endif #else #ifdef __cplusplus #define DLL_EXPORT_C_DECL extern "C" #else #define DLL_EXPORT_DECL extern #endif #endif #ifdef _WINDOWS #define WINAPI __stdcall #define WIN32_LEAN_AND_MEAN //从 Windows 头文件中排除极少使用的信息 #include "stddef.h" #else #define WINAPI #endif
x1
>
<
>>
<<
O
##代码
test.h
#pragma once
#define TEST_API extern "C" __declspec(dllexport)
#define WINAPI __stdcall //32位不能声明为__stdcall,否则函数名乱码
#define WIN32_LEAN_AND_MEAN // 从 Windows 头文件中排除极少使用的信息
#include "stddef.h"
// 此类是从 Test.dll 导出的
class CTest {
public:
CTest(void);
// TODO: 在此添加您的方法。
};
test.cpp
#include "stdafx.h"
#include "Test.h"
// 声明回调函数类型
typedef int (WINAPI *FrontConnected)();
// 回调函数变量
void *_connect;
// 利用set函数将上层的回调函数指针传递到C+层,并赋值给_connect
TEST_API void WINAPI SetConnect(void* conn)
{
_connect = conn;
}
// C+层通过_connect调用上层的回调函数
TEST_API int WINAPI fnTest(int a, int b)
{
if (_connect != NULL)
{
((FrontConnected)_connect)();
}
return a + b;
}
// 这是已导出类的构造函数。
// 有关类定义的信息,请参阅 Test.h
CTest::CTest()
{
return;
}