首页 > 系统相关 >C++中以类的成员函数作为Windows callback函数需要设置成static函数

C++中以类的成员函数作为Windows callback函数需要设置成static函数

时间:2024-05-29 15:45:01浏览次数:35  
标签:中以 函数 CALLBACK Windows CDC C++ callback

在看代码时,发现很多CALLBACK函数,所以仔细研究了一下C++中的CALLBACK函数

首先,我们来理解一下,什么是C++中的CALLBACK函数  => 凡是由你设计,但是由Windows操作系统调用的函数,我们把它统称为CALLBACK函数,这些函数都有一定的类型,以方便配合Windows的调用动作

某些Windows API函数会要求以callback函数作为其参数之一,这些API 比如SetTimer,LineDDA等。这些Windows API会在进行某种行为之后或者满足某种状态之时调用该callback函数。

看代码时发现,基本上CALLBACK函数都是全局函数,而不是类的成员函数。也就是说通常用全局函数(不要用类的成员函数)来作为CALLBACK函数。 =》 那么问题来了,为什么要这样? 可以采用类的成员函数来作为CALLBACK函数么?  =》答案是可以的,但是你要把类的成员函数设置成static类型  => 为什么会这样呢

这是因为C++编译器为类成员函数多准备了一个隐藏参数 (程序代码中看不到), 这使得函数类型与Windows callback函数的预设类型不符.

我们来看一段代码

class CMyclass
{
private :
int nCount;
int CALLBACK _export
EnumObjectProc(LPSTR lpObj, LPSTR lpData);
public:
void enumIt(CDC& dc);
}

void CMyclass::enumIt(CDC& dc)
{
//注册CALLBACK函数
CDC::EnumObjects(OBJ_BRUSH,EnumObjectProc,NULL,(CDC*)&dc);
}

 

标签:中以,函数,CALLBACK,Windows,CDC,C++,callback
From: https://www.cnblogs.com/wphl-27/p/18220417

相关文章

  • c++ 构造函数
     =================1.简介子类为完成基类初始化,在C++11之前,需要在初始化列表调用基类的构造函数,从而完成构造函数的传递。如果基类拥有多个构造函数,那么子类也需要实现多个与基类构造函数对应的构造函数。classBase{public: Base(intv):_value(v),_c(‘0’){} Base(cha......
  • 鸿蒙HarmonyOS实战-Web组件(前端函数和应用侧函数相互调用)
    ......
  • Windows和Linux系统部署Docker(2)
    目录一、Linux系统部署docker前置环境:1.安装需要的软件包,yum-util提供yum-config-manager功能2.添加阿里云docker-ce 仓库3.安装docker软件包4.启动docker并设置开机自启5.查看版本:二、windows系统部署docker1.查看是否拥有bioss虚拟化功能2.开启虚拟化功能3.......
  • 关于Linux中延时函数的分析与实践(转)
    关于Linux中延时函数的分析与实践一、简介  在实际的工程实践中,面对需要程序短暂休眠的情况,我们通常想到的可能是sleep(),usleep(),nanosleep()等函数。但是,在最近阅读代码的过程中,经常会看到使用select()达到延时的目的。本着追根求源(钻牛角尖)的原则,本篇博文,旨在通过具体的实验......
  • windows ollama 指定模型下载路径
    为Ollama指定模型的下载路径在Windows系统中,如果想为Ollama指定模型的下载路径,可以通过设置环境变量来实现。以下是详细的步骤:确定默认下载路径:默认情况下,Ollama的模型可能会下载到C:\Users\<用户名>\.ollama\models目录下。设置新的下载路径:如果想更改这个默认路径,需要设......
  • mysql GROUP_CONCAT()函数
    一、GROUP_CONCAT函数语法函数语法:group_concat([DISTINCT]需要连接的字段[OrderBY排序字段ASC/DESC][Separator'分隔符'])GROUP_CONCAT()函数分隔符GROUP_CONCAT()函数默认是逗号分隔修改GROUP_CONCAT(exprSEPARATOR'分隔符')GROUP_CONCAT()函数去重G......
  • windows添加计划任务异常--问题总结
    首先确定.bat脚本双击可正常运行当使用windows添加计划任务后,运行无报错(看历史记录正常运行成功),但是脚本内容实际未成功可以看下以下内容:1.查看脚本名是否含有中文,改为全英文2.将执行用户改成SYSTEM3.脚本中添加切换到脚本文件夹的命令4.任务重添加脚本时添加脚本所在目录......
  • Windows 应用暂停技术汇总
    背景在特定场景下,一些进程运行单纯的浪费资源,但又不能杀掉进程,所以需要通过挂起的方式,暂停进程运行。以释放资源给关键进程运行。方法对比方法详解1.NtSuspendProcess通过直接调用NtSuspendProcess来对进程进行挂起,通过NtResumeProcess来恢复进程。此API是nt......
  • C语言中的函数
            在C语言中,函数是模块化程序设计的基本单元,允许将代码分解为可重用的部分。以下是我写的一些常见的函数用法以及相关的示例代码:函数声明和定义://函数声明intadd(inta,intb);//函数定义intadd(inta,intb){returna+b;}函数调用:intr......
  • windows下载安装ipopt求解器 可用于pyomo调用
    方案一:采用官方编译的应用程序官方对windows下有已经编译好的应用程序,只需要下载下来,并将ipopt的应用程序所在文件夹路径添加到系统全局环境变量就可以了。这样在利用pyomo或者其他建模工具建模求解的时候就可以正常使用ipopt了。(但要注意防火墙或者杀毒软件可能会拦截需要设定......