完整的.h宏定义

##封装中的要点

  • __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; }

猜你喜欢

转载自www.cnblogs.com/marklove/p/11081095.html