完整的.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;
}
原文地址:https://www.cnblogs.com/marklove/p/11081095.html