MFC消息映射中:AFX_MSGMAP* (PASCAL* pfnGetBaseMap)()是什么类型?

cy010510630 2010-07-01 03:20:39
struct AFX_MSGMAP
{
#ifdef _AFXDLL
const AFX_MSGMAP* (PASCAL* pfnGetBaseMap)();
#else
const AFX_MSGMAP* pBaseMap;
#endif
const AFX_MSGMAP_ENTRY* lpEntries;
};

请问,红色部分定义的到底是个什么东西?
看来像个函数指针。。。。。
请教了
...全文
235 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
cy010510630 2010-07-15
  • 打赏
  • 举报
回复
谢谢解答,我再理解理解
  • 打赏
  • 举报
回复
用小括号括起来表示强制转换,所以不能像你那样写
cy010510630 2010-07-02
  • 打赏
  • 举报
回复
是不是这样就翻译为:调用函数,而不是获得函数指针了?
谢谢各位解答。
cy010510630 2010-07-02
  • 打赏
  • 举报
回复
还有一个不明白的地方,如果强制转换函数指针的话,第一次我也许会写成这样:
const (AFX_MSGMAP*) (PASCAL* pfnGetBaseMap());

所以我想知道,为什么红色括号不放在紧跟函数名之后?
  • 打赏
  • 举报
回复
[Quote=引用楼主 cy010510630 的回复:]
struct AFX_MSGMAP
{
#ifdef _AFXDLL
const AFX_MSGMAP* (PASCAL* pfnGetBaseMap)();
#else
const AFX_MSGMAP* pBaseMap;
#endif
const AFX_MSGMAP_ENTRY* lpEntries;
};

请问,红色部分定义的到底是个什么东西?
看来像个函数指针。……
[/Quote]
PASCAL* pfnGetBaseMap表示获得基类消息映射函数的地址的PASCAL类型的指针
AFX_MSGMAP*表示再将刚才的指针转换成消息映射类型的指针
const表示将刚才的指针再添加一个常量修饰符
wygss_18 2010-07-01
  • 打赏
  • 举报
回复
就是函数指针,指向DECLARE_MESSAGE_MAP宏的GetMessageMap()函数

BEGIN_MESSAGE_MAP宏展开时GetMessageMap()内容为
const AFX_MSGMAP* theClass::GetMessageMap() const \
{ return &theClass::messageMap; } \

编译后在exe映像的rdata节形成如下结构
.rdata:005D7020 CYourApp__messageMap dd offset CWinApp__messageMap
.rdata:005D7024 dd offset CYourApp___messageEntries
.rdata:005D7028 CYourApp___messageEntries dd WM_COMMAND
.rdata:005D702C dd 0
.rdata:005D7030 dd ID_APP_ABOUT
.rdata:005D7034 dd ID_APP_ABOUT
.rdata:005D7038 dd AfxSig_vv
.rdata:005D703C dd offset CYourApp__OnAppAbout
代码下载链接: https://pan.quark.cn/s/3379ee0243ef 在IAR调试环节,使用者或许会遭遇各式各样的故障,这些故障可能波及编译、链接以及执行时的情形。下面列出了部分常见的IAR调试故障及其应对措施: 1. **头文件全局变量的声明**:IAR链接器不允许在头文件里声明全局变量,但容许多个源文件同时引用同一变量。一旦出现此类状况,应将全局变量声明为`extern`类型。例如,错误信息`Error[e27]: Entry "tagData" redefined`可以通过在头文件附加`extern`关键字来纠正。 2. **隐式指定的函数**:`Error[Pe223]: function "assert_param" declared implicitly`指出函数`assert_param`未被显式地定义。务必确保包含了适宜的头文件,比如`stm32f10x_conf.h`,该文件内含了该函数的原型。倘若已包含,则可能是库文件版本不匹配或项目配置存在疑惑。 3. **无原型指引的函数**:`Error[Pa045]: function "assert_param" has no prototype`与上述情形相似,意指函数缺乏相应的原型声明。仔细核对相关头文件,保证它们在使用前已被适当地引入。 4. **标识符未获定义**:`Error[Pe020]: identifier "RCC_APB2Periph_GPIOC" is undefined`表明某个标识符的定义未能找到,这通常源于未引入必要的头文件。在此情形下,需包含`stm32f10x_rcc.h`。 5. **宏定义与编译文件的矛盾**:若尝试调整设备配置,如从STM...
打开链接下载源码: https://pan.quark.cn/s/a4b39357ea24 MPU6050是由InvenSense公司研发的六轴惯性测量单元(IMU),该设备融合了三轴陀螺仪和三轴加速度计。它能够即时检测设备在三维空间的运动参数,例如角速度和加速度等指标。DMP(Digital Motion Processing)是MPU6050内部集成的一种硬件加速技术,它能够对传感器数据进行处理并实现姿态计算,从而降低主控制器如STM32的计算压力。 STM32是一款基于ARM Cortex-M架构的微控制器,该器件在嵌入式系统领域得到了广泛部署,其特点是处理性能高且能耗低,非常适合用于处理复杂的传感器数据和控制任务。在MPU6050的姿态计算应用场景,STM32通常负责与MPU6050进行通信、获取传感器数据,并基于DMP提供的结果进行后续的数据处理和应用。 在"MPU6050姿态计算STM32源代码(DMP)"这一项目,研究者已经完成了将MPU6050的六轴数据通过DMP进行加工,并利用STM32进行读取和解析这些数据的工作。源代码可能涵盖以下几个核心组成部分: 1. **配置初始化**:初始化STM32的GPIO、I2C接口,目的是为了与MPU6050建立有效的通信连接。此外,还需要对MPU6050的寄存器进行设置,激活DMP功能,并设定采样频率和滤波器参数。 2. **数据交换**:利用STM32的I2C接口周期性地从MPU6050获取DMP的输出结果,这些数据通常涵盖设备的角速度、加速度以及姿态角(包括俯仰角、翻滚角和偏航角等)。 3. **姿态计算**:尽管DMP已经对原始数据进行了基础处理,但在STM32端可能还需要进行二次处理,例如采用卡尔...

16,550

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Creator Browser
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧