C++ member function pointers and others

创建你自己的PDB符号服务器create your pdb symbol server 使用Windbg或者VS2008根据dump文件(如何创建c++ Minidump)来调试程序的话,需要PDB文件。但是,每天都在build,就有很多版本的PDB,文件,怎么进行管理呢?微软的系统DLL的符号服务器,我想大家都用过,这个很好!如何搭建自己的符号服务器呢?首先下载 Debugging Tools for Windows 里面有一个symstore.exe;用法如下:  阅读详情
最近一直在研究WTL、MFC的消息封装机制,这里面用到了两个核心技术:
1. 成员函数指针;
其实要实现一个类似于WTL的消息封装机制只需要300行代码左右,成员函数指针的调用效率要低于普通的函数指针,原因是要计算this指针,这就涉及到重载,虚函数表等。我在使用中主要发现两个要点,第一个是成员函数指针的大小是可变的,(当然也可以通过设置编译选项来使得总是使用最大值,但是缺省的是优化的选项),当函数有虚函数表的时候指针大小要大一些。(其实在C++里面只有在很少的情况下sizeof(pointer)不等于4的,这个就是其中之一。如果不小心这个指针大小的变化的话,从派生类的非静态成员函数指针转换到基类的成员函数指针的时候可能就crash。另外还需要小心virtual继承和多重继承,所以MFC、WTL中的窗口类也是不支持多重继承的。关于MS如何实现类的编译可以参考 非常古老的文章:http://msdn.microsoft.com/archive/en-us/dnarvc/html/jangrayhood.asp,当然这块的编译技术已经多年没有大的更新过了,所以还是管用的。
2. 动态修改程序栈。
这个是为了传递this指针给WndProc全局函数,这个是C回调函数,为了把this指针传进去好进行面向对象的封装,然而由于Windows的CreateWindow所带的几个userdata(包括RegisterClassWndEx结构的扩展字节)都已经被窗口系统作为特定用途了,所以没有办法,只能通过修改程序栈来实现了,这个其实不是非常好,毕竟依赖于指令集,不过WTL就是这么做的,尽管这么做也是很令人费解的。具体的方法如下:首先把一个StartWindowProc的全局函数指针传递给RegisterWndclassEx,这样当调用CreateWindow的时候,第一次回调将运行到StartWindowProc,而且在CreateWindow过程中是线程保护的,所以可以把ThreadID和this指针绑定在createwindow之前放置到全局队列里面去,到startwindowproc的时候可以通过threadid取出this指针,然后修改程序的栈,把this指针固化到代码里面去,这样下次回调的时候就可以用this指针调用新的回调函数了。所以如果要自己实现这个代码首先要记得在createwindow之前和之后加上线程锁,避免crash;其次是在destroy this指针之前一定要把消息回调函数指向一个空的地址,以免访问了空的this指针。下面是代码示例:

#if defined(_M_IX86)
#pragma pack(push,1)
struct _WndProcThunk
{
 DWORD   m_mov;          // mov dword ptr [esp+0x4], pThis (esp+0x4 is hWnd)
 DWORD   m_this;         //
 BYTE    m_jmp;          // jmp WndProc
 DWORD   m_relproc;      // relative jmp
};
#pragma pack(pop)
#elif defined (_M_ALPHA)
// For ALPHA we will stick the this pointer into a0, which is where
// the HWND is.  However, we don't actually need the HWND so this is OK.
#pragma pack(push,4)
struct _WndProcThunk //this should come out to 20 bytes
{
 DWORD ldah_at;      //  ldah    at, HIWORD(func)
 DWORD ldah_a0;      //  ldah    a0, HIWORD(this)
 DWORD lda_at;       //  lda     at, LOWORD(func)(at)
 DWORD lda_a0;       //  lda     a0, LOWORD(this)(a0)
 DWORD jmp;          //  jmp     zero,(at),0
};
#pragma pack(pop)
#else
#error Only Alpha and X86 supported
#endif
class CWndProcThunk
{
public:
 union
 {
  _AtlCreateWndData cd;
  _WndProcThunk thunk;
 };
 void Init(WNDPROC proc, void* pThis)
 {
#if defined (_M_IX86)
  thunk.m_mov = 0x042444C7;  //C7 44 24 0C
  thunk.m_this = (DWORD)pThis;
  thunk.m_jmp = 0xe9;
  thunk.m_relproc = (int)proc - ((int)this+sizeof(_WndProcThunk));
#elif defined (_M_ALPHA)
  thunk.ldah_at = (0x279f0000 | HIWORD(proc)) + (LOWORD(proc)>>15);
  thunk.ldah_a0 = (0x261f0000 | HIWORD(pThis)) + (LOWORD(pThis)>>15);
  thunk.lda_at = 0x239c0000 | LOWORD(proc);
  thunk.lda_a0 = 0x22100000 | LOWORD(pThis);
  thunk.jmp = 0x6bfc0000;
#endif
  // write block from data cache and
  //  flush from instruction cache
   FlushInstructionCache(GetCurrentProcess(), &thunk, sizeof(thunk));
 }
};
 
要是这里没讲清楚,抱歉啦,实在比较难讲……可以参考boost.function还有C++ delegate
【信息科学与工程学】计算机科学与自动化 第二百三十三篇 凤凰架构01 编号类型领域系统软件/硬件或系统集成方案及系统架构模块子模块函数名称/算法名称算法的数学分析及计算机体系架构及数据结构与算法详细设计及参数列表及数值范围设计关联知识1共识算法分布式基石状态机复制架构:Proposer/Acceptor/Learner 多节点角色模型,基于操作转移(Operation Transfer)分布式共识PaxosPaxos 协议(Prepare/Promise/Accept/Accepted 两阶段)数学基础:多数派(Quorum)投票,基于鸽巢原理保证 W+R>N 时读写集合必有 阅读详情

相关推荐

安防相机宽动态(WDR)技术解析:从原理到实战应用

本文深入解析安防相机宽动态(WDR)技术原理,对比多次曝光与DOL-WDR等实现方式,并区分硬件WDR与数字WDR(DWDR)的本质差异。文章重点阐述了WDR在逆光出入口、夜间道路监控等五大典型场景的实战应用与调参技巧,旨在帮助用户根据实际需求正确选择与配置,确保监控系统在复杂光线下清晰成像。

weixin_29191081的博客 428

vscode 的tab与空格设置 ,vscode使用sftp配置 ,vscode代码补全插件

vscode默认就是一个tab=4个空格,若想要修改请进入seting里面设置。3.也可以选择:将缩进转换为制表符,然后保存即可。目前使用shell-format。目前使用Clang格式化风格。

喜欢打篮球的普通人 1万+

python语言下使用opencv接口cv2.VideoCapture()接口调用海康机器人工业相机

文章目录 目录 文章目录 前言 一、opencv接口介绍 二、调用海康机器人工业相机 1.使用海康机器人工业相机的前提 2.调用海康机器人工业相机进行显示 3.调用海康机器人工业相机进行存图 4.调用海康机器人工业相机存视频 5.调用海康机器人工业相机进行简单图像处理 总结 前言 提示:这里可以添加本文要记录的大概内容: 例如:随着人工智能的不断发展,机器学习这门技术也越来越重要,很多人都开启了学习机器学习,本文就介绍了机器学习的基础内容。 提示:以下是本篇文章正文内容,下.

qq_39570716的博客 1万+

C++ Primer Plus 第六版 编程练习题及详细答案

C++编程练习摘要 本文档包含了一系列C++编程练习的解决方案,涵盖了基础语法、函数、类、模板等核心概念。练习分为多个章节,每章包含若干题目。 主要内容 基础练习:变量声明、输入输出、简单计算等基础语法练习 函数与结构:函数定义、参数传递、结构体使用 面向对象:类定义、继承、多态、运算符重载 模板与STL:模板函数、模板类、标准模板库应用 文件I/O:文件读写操作 异常处理:异常类设计与使用 典型示例 简单I/O:显示姓名地址、单位换算 函数应用:温度转换、字符串处理 类设计:复数类、链表类、银行模拟类 S

misterxize的博客 392

感应加热电源设计避坑指南:半桥LC串联谐振的5个关键问题

本文深入解析半桥LC串联谐振在感应加热电源设计中的5个关键问题,包括均压电阻选型、功率管驱动时序、谐振频率补偿等实战经验。通过真实故障案例和解决方案,帮助工程师避开常见设计陷阱,提升电路稳定性和效率,特别适合从事桥感应加热电源开发的工程师参考。

weixin_27013291的博客 510

BrainVision Recorder 和 BrainVision Analyzer 2.2 安装

本篇为《EEG处理》系列博客的第二篇,该系列博客主要记录EEG信号处理的学习过程中的软件安装和学习过程,方便以后查阅。本篇为BrainVision Recorder 和 BrainVision Analyzer 2.2 的安装过程。 BrainVision Recorder 和 BrainVision Analyzer 2.2 安装安装前奏Brain Vision Analyzer分析软件 安装Brain Vision Recorder记录软件 安装推荐几款个人使用的科研软件 安装前奏 Brain V

梁小憨憨的博客 5063

CPU 缓存 | 原理、映射、一致性

……

u013669912的博客 410

【数据结构】平行四边形数量

平行四边形个数,哈希表,散列

cyy010617的博客 4009

VC ListCtrl中嵌入进度条

VC中在listctrl中嵌入进度条,截图如下:其实要实现这个非常容易,以下是自绘ListCtrl的代码,首先继承CListCtrl,然后增加函数:void CProcessList::OnCustomDraw(NMHDR *pNMHDR, LRESULT *pResult){ //draw each item.set txt color,bkcolor.... NMLVCUSTOMDRAW* p

2874

1. SAP Business Application Studio 里创建一个基于 CAP 模型的最简单的 OData 服务

本文基于 SAP Cloud Application Programming 编程模型的 OData 服务开发教程的第一步,简述了 SAP Business Technology Platform 里 Business Application Studio 开发工具的打开方式,创建 Dev Space 以及 CAP 项目的创建步骤,以及如何通过 schema.cds 和 service.cds 分别创建 OData 模型和 OData 服务,最后通过 ports preview 打开 OData 服务预览页

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 1798

深度学习在移动开发中的应用:实时姿态估计实战

我们将使用TensorFlow Lite框架,结合专为移动端优化的MoveNet模型,实现一个能够在主流Android设备上达到30FPS的多人姿态跟踪解决方案,并深入探讨其优化技巧和实际应用场景。特别是3D姿态估计、多人长期跟踪等前沿技术的发展,将进一步推动移动端姿态估计技术的应用深度和广度。在下一篇文章中,我们将探讨深度学习在移动端的另一个创新应用:实时手势识别,包括如何在资源受限的环境中实现复杂手势的实时识别,以及这项技术在AR/VR交互、智能家居控制等场景中的应用。第四部分:典型应用场景实现。

Programming Talk 325

VC Tray Icon的使用

为CMainFrame增加如下的成员变量: NOTIFYICONDATA m_trayIcon; CMenu m_menuTray;在CMainFrame的OnCreate函数末尾增加: m_trayIcon.cbSize = sizeof(NOTIFYICONDATA); m_trayIcon.hIcon = (HICON)LoadImage(AfxGetApp()->m_hInstance, 

2772

【ITS模型】基于MATLAB的ITS宽带短波信道模型的建模和仿真

1.软件版本 MATLAB2010b 2.本算法理论知识 对短波信道建模具有里程碑意义的是沃特森在1970年发表的一篇文章,文章中提出了一种静态模型,并在大气中进行了实验验证。 此静态模型可以描述为高斯散射增益抽头延迟线模型,即Watterson模型。 Watterson信道模型是经典的窄带短波信道模型,在这个模型中,信道衰落是瑞利幅度分布,而在每种传播模式中多普勒扩展的功率谱满足高斯分布。Watterson模型没有定义延时扩展的形状,认为各个多径传输模式中不存在延时扩展。其...

FPGA/MATLAB学习教程/源码/项目合作开发 2757

使用CFileDialog GetOpenFileName选择文件夹

比较简单也比较传统的方式是使用SHBrowseForFolder,不过说实话这个大概是微软最差的一个控件了,用过的人都知道!完全没有GetOpenFileName那么好用的界面,但是GetOpenFileName不支持文件夹的选择,只能选择文件!本文提供了一个比较好的解决方法:1、自Vista之后的操作系统,提供了IFileDialog接口,事实上GetOpenFileName缺省也使用这

2528

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

VC创建快捷方式

CreateShortCut(LPCSTR lpszPathLink, LPCSTR lpszPathObj, LPCSTR lpszDesc){    HRESULT hres;     IShellLink* psl;      // Get a pointer to the IShellLink interface.     hres = CoCreateInstance(CLSID_She

2364

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

解决VS2008不能加载WPF设计器的问题

无法将属性“Source”的字符串“pack://application:,,,/Microsoft.Windows.Design.Developer;component/Images/Fit_To_Window.png”转换为“System.Windows.Media.ImageSource”类型的对象。 位图颜色上下文无效。  标记文件“Microsoft.Windows.Design.Dev

1791

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

VC实现类似Acrobat竖排TabCtrl

像UltraEdit那样横着排的TabCtrl看到挺多的,应用也很广泛,可是有的时候界面排布需要竖着的TABCTRL,像Acrobat,MSN,QQ等,我最近因为应用需要所以作了一个竖排的TabCtrl,具有和UltraEdit那样横排Ctrl的类似功能,可以动态增加删除Button;选择消息,双击关闭,右键消息等;当前还缺ToolTip的支持;也不支持横排(在设计的时候是希望都能支持的,不过时间

1371

ATL COM控件开发中在RGS文件里面使用变量

最近在做一个Visual Studio的Add-in Toolbar,目的是进行简单的代码静态检查和部分测试自动化代码的生成。在控件注册的时候,ATL控件会使用资源文件里面的一个RGS文件(也就是注册表导入文件进行注册)。我发现在里面有使用%MODULE%这样的变量,这个会在执行DllRegisterServer的时候被解释成DLL的路径。下面是一个实例:HKCU{ NoRemove

1209

C++ Release版崩溃事后调试

我们看到微软从IE6开始当程序崩溃(Crash)的时候弹出一个对话框询问是否发送给微软。对于大规模部署的客户端会碰到各种各样的疑难杂症很难预料,而且解决更加困难,如果你做的程序客户量非常大,建议采纳这个非常cool的设计。在自己的程序里面增加这个支持并不困难,因为微软已经提供了SDK。参考如下工程:http://www.codeproject.com/KB/debug/postmortem

1079

解决Windows 2k Load 32bit Icon的问题

在Win2K下面Load一个32bit的图标会出现黑边,下面给出的这个函数可以取代LoadImage加载32位ICON但是在2K下面不会出现黑边:) #include "StdAfx.h"//  Copied from amvideo.h#define LINE_BYTES( Width, BitCt )     (long)( ((long)Width*BitCt+31)/32 * 

868

由于dll导致的奇异CRASH

之所以讲是奇异的crash,是因为我开发这么长时间还是第一次遇到这样类型的crash,开始的时候怀疑是由于在DLL中分配的内存在其它的dll中释放导致的,或者由于DLL已经卸载导致分配的内存不可用导致的,然后,经过实验,居然不是,这下可让我没了头脑。经过仔细分析发现,是因为在dll中分配了一个对象指针,该对象的内存区域还是可用的,但是dll已经卸载,导致该对象的代码区域已经卸载,从而无法正确的

649

VS2008 Addinl里面 显示自定义图标

在Visual Studio的ADDIN里面,如果想为自己的TOOLBAR上面的图标自己定义的话,需要定制一个资源DLL文件,并将该DLL文件放置在和addin对应的1033目录下面,在注册的时候增加:       val SatelliteDllName = s CppCleanUI.dll       val SatelliteDllPath = s %MODULE_PATH%详细

512

深挖C++:类和对象(中)

(先进后出)

xys_678的博客 240

ThunderKittens 深度解析:一个不基于 MLIR 的 C++ 模板 GPU DSL

Triton 是"让更多人能写 GPU kernel",ThunderKittens 是"让会写的人写得更爽"。前者用 MLIR 换易用性,后者用 C++ 模板换可控性。它们不是替代关系,而是覆盖了 GPU 编程光谱的两端。ThunderKittens 的出现,本质上是对"GPU DSL 必须基于 MLIR"这一默认假设的挑战。编译期类型系统本身就可以是一个强大的 DSL 基础设施,不需要中间 IR,不需要黑盒 pass,也能实现 tile 级抽象和零运行时开销。

Maxwell_Newton的博客 339

C++移动构造函数详解

移动构造函数是C++11引入的一种特殊构造函数,用于从临时对象(右值)"窃取"资源来初始化新对象,而不是进行昂贵的深拷贝。char* data;public:// 移动构造函数:参数是右值引用 &&// 关键:把源对象的资源置空。

拒绝AI文,努力在AI时代写出感动人心的好文章 391
上一篇: PHP 无组件生成BMP验证码源程序
下一篇: C++实现Delegate
oeichenwei
博客等级 码龄23年 8粉丝 42原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值