##封装中的要点

  • __declspec(dllexport)

表明函数为导出函数 * `extern "C"`

导出的函数名与声明一致,否则导出函数名无法正常使用

当然,也可以通过定义`.def`文件实现函数名正常 * `_stdcall`

32位不能使用此声明

linux不能使用此声明 * WIN32 & _WINDOWS * WIN32 编译32位C+时使用 * _WINDOWS 编译64位时使用

  1.  
  2. #ifdef _WINDOWS //64位系统没有预定义 WIN32
  3. #ifdef __cplusplus
  4. #define DLL_EXPORT_C_DECL extern "C" __declspec(dllexport)
  5. #else
  6. #define DLL_EXPORT_DECL __declspec(dllexport)
  7. #endif
  8. #else
  9. #ifdef __cplusplus
  10. #define DLL_EXPORT_C_DECL extern "C"
  11. #else
  12. #define DLL_EXPORT_DECL extern
  13. #endif
  14. #endif
  15.  
  16. #ifdef _WINDOWS
  17. #define WINAPI __stdcall
  18. #define WIN32_LEAN_AND_MEAN //从 Windows 头文件中排除极少使用的信息
  19. #include "stddef.h"
  20. #else
  21. #define WINAPI
  22. #endif
x1
>
<
>>
<<
O

##代码

test.h

  1. #pragma once
  2. #define TEST_API extern "C" __declspec(dllexport)
  3.  
  4. #define WINAPI __stdcall //32位不能声明为__stdcall,否则函数名乱码
  5. #define WIN32_LEAN_AND_MEAN // 从 Windows 头文件中排除极少使用的信息
  6. #include "stddef.h"
  7.  
  8. // 此类是从 Test.dll 导出的
  9. class CTest {
  10. public:
  11. CTest(void);
  12. // TODO: 在此添加您的方法。
  13. };

test.cpp

  1. #include "stdafx.h"
  2. #include "Test.h"
  3.  
  4. // 声明回调函数类型
  5. typedef int (WINAPI *FrontConnected)();
  6.  
  7. // 回调函数变量
  8. void *_connect;
  9.  
  10. // 利用set函数将上层的回调函数指针传递到C+层,并赋值给_connect
  11. TEST_API void WINAPI SetConnect(void* conn)
  12. {
  13. _connect = conn;
  14. }
  15.  
  16. // C+层通过_connect调用上层的回调函数
  17. TEST_API int WINAPI fnTest(int a, int b)
  18. {
  19. if (_connect != NULL)
  20. {
  21. ((FrontConnected)_connect)();
  22. }
  23. return a + b;
  24. }
  25.  
  26. // 这是已导出类的构造函数。
  27. // 有关类定义的信息,请参阅 Test.h
  28. CTest::CTest()
  29. {
  30. return;
  31. }

完整的.h宏定义的更多相关文章

  1. 关于 . H 宏定义技巧

    #ifndef   LABEL #define   LABEL //代码部分 #endif LABEL为一个唯一的标号,命名规则跟变量的命名规则一样.常根据它所在的头文件名来命名,例如,如果头文件的文 ...

  2. define预处理以及宏定义

    define的定义方式 无参一般形式:#define 标认符 字符串                     比如:#define COUTD "%d\n" 带参一般形式:#def ...

  3. c 预处理的宏定义

    概念 以“#”号开头的都是预处理命令 例如 #include <stdio.h>宏定义 宏定义无参数的宏名后不带参数# 表示这是一条预处理命令, define 为宏定义命令.“标识符”为所 ...

  4. iOS开发ARC与MRC下单例的完整写法与通用宏定义

    #import "XMGTool.h" /** * 1:ARC下的完整的单例写法:alloc内部会调用+(instancetype)allocWithZone:(struct _N ...

  5. 黑马程序员——C语言基础 枚举 宏定义 自定义 static exterm

    Java培训.Android培训.iOS培训..Net培训.期待与您交流! (以下内容是对黑马苹果入学视频的个人知识点总结) (一)枚举 1)枚举类型的定义 枚举是C语言中的一种基本数据类型,并不是构 ...

  6. 一个C++宏定义与枚举定义重复的编译错误

    C++的开发效率低是众所周知的,原因比如有: 语言复杂度高 编译效率低 工具链不够完整高效(尤其是linux下) 另外一个恐怕是不少编译错误让人摸不着头脑,今天碰到一个,举个例子: #include ...

  7. VC中预处理指令与宏定义详解

    刚接触到MFC编程的人往往会被MFC 向导生成的各种宏定义和预处理指令所吓倒,但是预处理和宏定义又是C语言的一个强大工具.使用它们可以进行简单的源代码控制,版本控制,预警或者完成一些特殊的功能. 一个 ...

  8. C中的预编译宏定义

     可以用宏判断是否为ARC环境 #if _has_feature(objc_arc) #else //MRC #endif C中的预编译宏定义 -- 作者: infobillows 来源:网络 在将一 ...

  9. define宏定义中的#,##,@#及\符号

    define宏定义中的#,##,@#及\符号 在#define中,标准只定义了#和##两种操作.#用来把参数转换成字符串,##则用来连接两个前后两个参数,把它们变成一个字符串. 1.# (string ...

随机推荐

  1. FZU 2218【状压】

    题意: 给出长为n的字符串,含有前k种小写字母,求两个不含重复元素的连续子串,使得他们的长度乘积最大. 思路: 字符种类16 ->(套路) 状压 暴力2000*2000得所有连续子串的长度,得每 ...

  2. uva1331 Minimax Triangulation

    题目大意: 按照顺时针或者逆时针的顺序给出多边的点,要将这个多边形分解成n-2个三角形,要求使得这些三角行中面积最大的三角形面积尽量小,求最小值. /* dp[i][j]表示从第i个点到第j个点,划分 ...

  3. IT兄弟连 Java语法教程 Java语言的其他特性

    Java语言中除了非常重要的跨平台特性外,还有如下几个关键特性: ●  语法简单易学 Java语言的语法简单明了,容易掌握,而且是纯面向对象(OOP)的语言,Java语言的简单性主要体现在以下几个方面 ...

  4. Elasticsearch内存分配设置详解(转)

    Elasticsearch默认安装后设置的内存是1GB,对于任何一个现实业务来说,这个设置都太小了.如果你正在使用这个默认堆内存配置,你的集群配置可能会很快发生问题.这里有两种方式修改Elastics ...

  5. snipaste截图软件

  6. Eclipse中各图标含义

    Eclipse中定义很多小图标,在平时的开发工作中,熟悉这些小图标还是很有意义的.那具体意义大家又知道多少呢? 首先,通过在搜索“eclipse icon meaning”,找到了一个比较有用的链接, ...

  7. CC10:访问单个节点的删除

    题目 实现一个算法,删除单向链表中间的某个结点,假定你只能访问该结点. 给定待删除的节点,请执行删除操作,若该节点为尾节点,返回false,否则返回true 解法 这道题并不难,主要是题目中这句话确定 ...

  8. Ubuntu 最新设置阿里云更新源

    可将 http://cn.archive.ubuntu.com/ubuntu/ 替换为下列任意服务器: Ubuntu 官方(欧洲,国内较慢,无同步延迟) http://archive.ubuntu.c ...

  9. 每天学点Linux命令之grep 和 wc命令 --- !管道命令!

    Linux系统中grep命令是一种强大的文本搜索工具,它能使用正则表达式搜索文本,并把匹 配的行打印出来.grep全称是Global Regular Expr ession Print,表示全局正则表 ...

  10. hadoop集群启动时DataNode节点启动失败

    错误日志如下: ************************************************************/ 2018-03-07 18:57:35,121 INFO o ...