使用API Monitor探测C++程序在调用HtmlHelp接口打开.chm文件时传入了哪些参数

news2024/11/13 14:19:29

目录

1、API Monitor介绍

2、为何要使用API Monitor工具?

2、HtmlHelp函数在API列表函数中找不到,将所在模块作为外部Extern DLL模块添加到API Monitor中

3、开启对Beyond Compare工具软件的实时监测

4、在Beyond Compare软件中打开chm帮助文档,监测到了对HtmlHelp接口的调用

5、监测到HtmlHelp函数调用时为啥没有显示参数具体的类型?

6、最后


C++软件异常排查从入门到精通系列教程(专栏文章列表,欢迎订阅,持续更新...)icon-default.png?t=N7T8https://blog.csdn.net/chenlycly/article/details/125529931C/C++基础入门与实战进阶(专栏文章,持续更新中...)icon-default.png?t=N7T8https://blog.csdn.net/chenlycly/category_11931267.htmlWindows C++ 软件开发从入门到精通(专栏文章,持续更新中...)icon-default.png?t=N7T8https://blog.csdn.net/chenlycly/category_12695902.htmlVC++常用功能开发汇总(专栏文章列表,欢迎订阅,持续更新...)icon-default.png?t=N7T8https://blog.csdn.net/chenlycly/article/details/124272585C++软件分析工具从入门到精通案例集锦(专栏文章,持续更新中...)icon-default.png?t=N7T8https://blog.csdn.net/chenlycly/article/details/131405795开源组件及数据库技术(专栏文章,持续更新中...)icon-default.png?t=N7T8https://blog.csdn.net/chenlycly/category_12458859.html网络编程与网络问题分享(专栏文章,持续更新中...)icon-default.png?t=N7T8https://blog.csdn.net/chenlycly/category_2276111.html       API Monitor工具可以用来探测目标程序对系统API函数或者第三方非系统库API接口的调用,对探测目标软件是如何实现某个功能时很有用。今天就来详细讲述一下如何使用API Monitor去探测Beyond Compare软件在打开chm帮助文件时传入了什么参数,以供大家借鉴或参考。

1、API Monitor介绍

       API Monitor是一个功能强大的工具,主要用于监视和控制应用程序及服务的API调用情况。API Monitor能够让你看到应用程序和服务是如何工作的,或者跟踪在你自己应用程序中遇到的问题。

       该工具可以用来探测目标程序对系统API函数或者第三方非系统库API接口的调用,不仅可以看到接口调用的记录,还可以看到调用接口时传递的参数,还可以看到函数调用时的函数调用堆栈(默认堆栈中显示5条记录,可以在设置中设置显示的堆栈条目个数)。对于探测目标软件是如何实现某个功能很有用。我们在项目中多次使用该工具,模仿相关软件去实现类似的功能。

       API Monitor工具打开后的主界面如下所示:

主界面的大体构成已经在上图中进行标注了,下面在讲实例时会详细讲到,此处就不展开了。

       下面详细讲述一下如何使用API Monitor去探测Beyond Compare软件在打开chm帮助文件时传入了什么参数,给大家演示一下API Monitor是如何使用的。

2、为何要使用API Monitor工具?

       很多软件将帮助文档做成chm格式,方便大家查看使用,特别是方便大家搜索查看函数或命令说明的帮助文档,比如离线版本的MSDN帮助文档,支持直接搜索API函数名,如下所示:

再比如Windbg的帮助文档,支持直接搜索Windbg命令:

       我们的软件也将帮助文档做成了chm文件,要在软件菜单中实现打开chm帮助文档的功能。经搜索得知需要调用系统API函数HtmlHelp去实现,但不知调用该函数时应该传递什么样的参数。HtmlHelp函数的声明如下:

第一个参数是所属owner窗口,应该可以设置为NULL;
第二个参数是要打开的chm帮助文件的完整路径,这个参数没问题;
第三个和第四个参数要传什么样的值没法确定,MSDN上也没有明确的说明。

       之前使用过API Monitor工具,正好想再次使用该该工具,看看其他成熟软件是在调用HtmlHelp函数打开chm帮助文档时传入了什么样的参数。于是查看日常用的软件,看看哪些软件在菜单栏中有打开chm帮助文档的功能,Windbg、Process Explorer、Source Insight和Beyond Compare等老牌软件都有打开chm帮助文档的功能。我们选择监测一下Beyond Compare软件,大家在看完本篇文章之后,也可以去监测一下Windbg、Process Explorer、Source Insight等软件对HtmlHelp函数的调用。

2、HtmlHelp函数在API列表函数中找不到,将所在模块作为外部Extern DLL模块添加到API Monitor中

       打开API Monitor后,用鼠标点击左边的API函数列表,然后按下Ctrl+F快捷键打开API函数搜索窗口,输入HtmlHelp:

点击确定,进行搜索。但在左边的API函数列表中并没有搜索到HtmlHelp函数:

这有点奇怪,明明是系统API函数,为啥搜索不到呢?这个API函数也不是很新的API,不会因为API Monitor工具版本较老而没有这个API函数。

      于是到微软在线的MSDN上搜索HtmlHelp,查看该函数所在的模块,如下所示:

该函数位于hhctrl.ocx模块中,这是一个ocx控件?不是一个像ntdll.dll一样的通用的系统库。

       相对于ntdll.dll这样的系统通用库,hhctrl.ocx是外部库?API Monitor支持添加外部模块,要把hhctrl.ocx作为外部模块添加到API MOnitor中?先用Everything工具在电脑上搜索hhctrl.ocx文件的路径,如下所示:

因为当前的Beyond Compare是32位的,所以选择C:\Windows\SysWoW64系统路径下的hhctrl.ocx。

       于是点击左边的API列表中的External DLL标签页

点击“Add External DLL (Insert)”按钮,弹出文件选择对话框,切换到将C:\Windows\SysWoW64系统路径下,在该路径中寻找hhctrl.ocx文件,但找不到这个文件需要将默认的Dvnamic-link libraries (*.dll)文件类型改成All Files (*.*),就能找到了:

添加进来后,就能看到hhctrl.ocx模块的导出接口了,如下所示:

看到了HtmlHelp函数,其中HtmlHelpA是ANSI版本的,HtmlHelpW是Unicode宽字节版本的。于是将这两个函数都勾选上。


       在这里,给大家重点推荐一下我的几个热门畅销专栏,欢迎订阅:(博客主页还有其他专栏,可以去查看)

专栏1:(该精品技术专栏的订阅量已达到490多个,专栏中包含大量项目实战分析案例,有很强的实战参考价值,广受好评!专栏文章持续更新中,预计更新到200篇以上!欢迎订阅!)

C++软件调试与异常排查从入门到精通系列文章汇总icon-default.png?t=N7T8https://blog.csdn.net/chenlycly/article/details/125529931

本专栏根据多年C++软件异常排查的项目实践,系统地总结了引发C++软件异常的常见原因以及排查C++软件异常的常用思路与方法,详细讲述了C++软件的调试方法与手段,以图文并茂的方式给出具体的项目问题实战分析实例(很有实战参考价值),带领大家逐步掌握C++软件调试与异常排查的相关技术,适合基础进阶和想做技术提升的相关C++开发人员!

考察一个开发人员的水平,一是看其编码及设计能力,二是要看其软件调试能力!所以软件调试能力(排查软件异常的能力)很重要,必须重视起来!能解决一般人解决不了的问题,既能提升个人能力及价值,也能体现对团队及公司的贡献!

专栏中的文章都是通过项目实战总结出来的,包含大量项目问题实战分析案例,有很强的实战参考价值!专栏文章还在持续更新中,预计文章篇数能更新到200篇以上!

专栏2:  

C++常用软件分析工具从入门到精通案例集锦汇总(专栏文章,持续更新中...)icon-default.png?t=N7T8https://blog.csdn.net/chenlycly/article/details/131405795

常用的C++软件辅助分析工具有PE工具、Dependency Walker、Process Explorer、Process Monitor、API Monitor、Clumsy、Windbg、IDA Pro等,本专栏详细介绍如何使用这些工具去巧妙地分析和解决日常工作中遇到的问题,很有实战参考价值!

专栏3: 

C/C++基础与进阶(专栏文章,持续更新中...)icon-default.png?t=N7T8https://blog.csdn.net/chenlycly/category_11931267.html

以多年的开发实战为基础,总结并讲解一些的C/C++基础与进阶内容,以图文并茂的方式对相关知识点进行详细地展开与阐述!专栏涉及了C/C++领域的多个方面的内容,同时给出C/C++及网络方面的常见笔试面试题,并详细讲述Visual Studio常用调试手段与技巧!

专栏4:   

VC++常用功能开发汇总(专栏文章,持续更新中...)icon-default.png?t=N7T8https://blog.csdn.net/chenlycly/article/details/124272585

将10多年C++开发实践中常用的功能,以高质量的代码展现出来。这些常用的高质量规范代码,可以直接拿到项目中使用,能有效地解决软件开发过程中遇到的问题。

专栏5: 

Windows C++ 软件开发从入门到精通(专栏文章,持续更新中...)icon-default.png?t=N7T8https://blog.csdn.net/chenlycly/category_12695902.html

根据多年C++软件开发实践,详细地总结了Windows C++ 应用软件开发相关技术实现细节,分享了大量的实战案例,很有实战参考价值。


3、开启对Beyond Compare工具软件的实时监测

       上面已经将HtmlHelpA和HtmlHelpW函数勾选上了,然后在左下方的进程列表中找到Beyond Compare进程,右键点击该进程,在弹出的右键菜单中点击“Start Monitoring”菜单项:

开启对Beyond Compare工具软件的实时监测。

4、在Beyond Compare软件中打开chm帮助文档,监测到了对HtmlHelp接口的调用

       切换到已经打开的Beyond Compare软件界面,点击菜单栏中的Help->Contents,打开chm帮助文档。然后切换到API Monitor主界面,监测到了对HtmlHelp接口的调用,如下所示:

点击监测到的HtmlHelp调用条目,然后到下方的Parameters窗口中查看传递给HtmlHelp函数的四个参数。其中,第二个参数就是要打开的chm帮助文档的路径,第三个参数对照HtmlHelp函数的声明:

其值为0,即uCommand参数对应的枚举值为HH_DISPLAY_TOPIC:

第四个参数dwData传入的值为0,这样我们就可以参考第三个及第四个参数的值去编写我们的代码了,打开chm帮助文件的实现代码如下所示:

bool OpenChmHelpFile( LPCTSTR lpStrPath )
{
    HWND hHelpWnd = NULL;
    
    __try
    {
        hHelpWnd = HtmlHelp( NULL, lpStrPath, HH_DISPLAY_TOPIC, NULL );
    }
    __except( EXCEPTION_EXECUTE_HANDLER )
    {
        hHelpWnd = NULL;
    }
    
    if ( NULL == hHelpWnd )
    {
        WriteLog( _T("[OpenChmHelpFile] HtmlHelp execute failed, path [%s]!"), lpStrPath );
        return false;
    }

    return true;
}

        注意,实操时可能会遇到监测不到HtmlHelp接口调用记录的情况,我在实操时就遇到过。如果遇到监测不到的情况,可以尝试将API Monitor和Beyond Compare工具都关闭掉,重新启动这两个软件,重新开启监测,应该可以监测到了。

5、监测到HtmlHelp函数调用时为啥没有显示参数具体的类型?

       点击监测到的HtmlHelp调用条目,然后到下方的Parameters窗口中查看传递给HtmlHelp函数的四个参数,如下所示:

并没有显示具体的参数,而是把参数尝试当做不同的几个类型去解析。这是因为HtmlHelp函数所在的模块hhctrl.ocx,属于外部库,在安装路径下的API描述文档(xml文件)中没有对应的函数声明及参数说明。HtmlHelp函数属于hhctrl.ocx模块的导出函数,只能看到函数名,但没法知道函数的参数类型。

       API Monitor中的API描述文档的内容如下所示:

描述文档中首先给出API函数名,然后给出函数参数类型的说明,如果参数中有结构体,还会给出结构体的类型描述。如果在新的Windows系统API函数,在当前版本的API Monitor的xml描述文件中找不到,可以模仿现有API函数的描述,手动将新的API接口描述加进去,这样在API Monitor的API函数列表中就可以看到这个函数了。

       有人可能会问,pdb符号库文件会有函数参数类型等符号类型信息,这个API Monitor工具是否支持加载pdb文件呢?像Process Explorer、Process Monitor这些工具支持加载pdb文件,在显示的线程函数调用堆栈就可以看到详细的函数名和参数了。不幸地告诉大家,API Monitor工具不支持加载pdb文件。

6、最后

       本文通过监测Beyond Compare软件对HtmlHelp函数的调用,详细演示了如何使用API Monitor工具,有一定的实战参考价值,希望本文的内容可以帮到大家。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1952341.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

MiniExcel:.NET中处理Excel的高效方案

在.NET开发环境中,处理Excel文件是一项常见的任务,无论是数据导入、导出还是报表生成。传统的解决方案可能存在性能瓶颈或功能限制。MiniExcel作为一个现代、高效的库,为.NET开发者提供了一个强大的工具来简化Excel操作。本文将介绍MiniExcel…

【数据结构】排序算法——Lesson2

Hi~!这里是奋斗的小羊,很荣幸您能阅读我的文章,诚请评论指点,欢迎欢迎 ~~ 💥💥个人主页:奋斗的小羊 💥💥所属专栏:数据结构 🚀本系列文章为个人学…

Scrapy 爬取旅游景点相关数据(四)

本节内容主要为: (1)创建数据库 (2)创建数据库表 (3)爬取数据进MYSQL库 1 新建数据库 使用MYSQL数据库存储数据,创建一个新的数据库 create database scrapy_demo;2 新建数据表 CR…

2024年【非高危行业生产经营单位主要负责人解析

题库来源:安全生产模拟考试一点通公众号小程序 非高危行业生产经营单位主要负责人及安全管理人员安全生产知识和管理能力考试报名是安全生产模拟考试一点通生成的,非高危行业生产经营单位主要负责人及安全管理人员安全生产知识和管理能力证模拟考试题库…

【Redis宕机啦!】Redis数据恢复策略:RDB vs AOF vs RDB+AOF

文章目录 Redis宕机了,如何恢复数据为什么要做持久化持久化策略RDBredis.conf中配置RDBCopy-On-Write, COW快照的频率如何把握优缺点 AOFAOF日志内容redis.conf中配置AOF写回策略AOF日志重写AOF重写会阻塞吗优缺点 RDB和AOF混合方式总结 Redis宕机了,如何…

C语言图书信息管理系统

题目:图书信息管理系统 内容及主要功能描述: 该系统用于管理图书信息,包括图书的增加、删除、查找、修改、浏览、按出版社统计图书数量等功能。具体功能包括: 增加图书:输入图书信息并添加到系统中。删除图书&#x…

golang设置远程调试

1. 目标机器构建安装dlv https://github.com/go-delve/delve go build之后将编译号的dlv命令路径添加到PATH里 2. 目标机器下载源代码并且运行dlv dlv debug --headless --listen:2345 --api-version2 --accept-multiclient 3.本机添加go remote 4. 设置断点即可

JAVA简介与开发环境配置(基础介绍 一)

目录 Java 简介 主要特性 发展历史 Java开发工具 Java 开发环境配置 window系统安装java 下载JDK 配置环境变量 通过控制台测试JDK是否安装成功 Linux,UNIX,Solaris,FreeBSD环境变量设置 流行JAVA开发工具 使用 Eclipse 运行第一…

C++程序的UI界面闪烁问题的解决办法总结

Windows C++程序复杂的UI界面要使用多种绘图技术(使用GDI、GDI+、ddraw、D3D等绘图),并要贴图去美化,在窗口移动或者改变大小的时候可能会出现闪烁。下面罗列一下UI界面产生闪烁的几种可能的原因,并给出相应的解决办法。 1、原因一 如果熟悉显卡原理的话,调用GDI函数向屏…

Visual Studio2022在屏幕缩放后界面问题的解决方法

Visual Studio2022在屏幕缩放后界面问题的解决方法 最近帮客户修改一个几年前用C#开发的WinForm程序,遇到个奇怪问题,记录一下解决方法。 事情是这样,年初时换了台2K高分屏的开发笔记本,终于淘汰了那台不堪重负的用了五年的Think…

leetcode-98. 验证二叉搜索树

题目描述 给你一个二叉树的根节点 root ,判断其是否是一个有效的二叉搜索树。 有效 二叉搜索树定义如下: 节点的左 子树 只包含 小于 当前节点的数。节点的右子树只包含 大于 当前节点的数。所有左子树和右子树自身必须也是二叉搜索树。 示例 1&…

mysql报错:Unknown collation: ‘utf8mb4_0900_ai_ci‘的原因及解决方法

参考博客:http://t.csdnimg.cn/NRzyk 报错场景描述 使用navicate在查询中运行sql语句时报错:Unknown collation: utf8mb4_0900_ai_ci 报错原因 生成转储文件的数据库版本为8.0,我本地数据库版本为5.6,高版本导入到低版本&…

国科大作业考试资料《人工智能原理与算法》2024新编-第十三次作业整理

1、假设我们从决策树生成了一个训练集,然后将决策树学习应用于该训练集。当训练集的大小趋于无穷时,学习算法将最终返回正确的决策树吗?为什么是或不是? 本次有两个参考: 参考一: 当训练集的大小趋于无穷…

Spring Bean - xml 配置文件创建对象

类型&#xff1a; 1、值类型 2、null &#xff08;标签&#xff09; 3、特殊符号 &#xff08;< -> < &#xff09; 4、CDATA <?xml version"1.0" encoding"UTF-8"?> <beans xmlns"http://www.springframework.org/schema/bea…

**往届快至会后2个月完成检索,刊后1个月完成检索,第四届电子信息工程与计算机科学国际会议(EIECS 2024)火热征稿中!

2024年第四届电子信息工程与计算机科学国际会议(EIECS 2024) 2024 4th International Conference on Electronic Information Engineering and Computer Science 中国延吉 | 2024年9月27-29日 二轮截稿日期&#xff1a;2024年8月9日 收录检索&#xff1a;EI Compendex, Sc…

【C语言】指针的爱恨纠葛:常量指针vs指向常量的指针

目录 常量指针和指向常量的指针有什么区别&#xff1f;1. 指向常量的指针&#xff08;Pointer to Constant&#xff09;声明方式&#xff1a;示例&#xff1a;解释&#xff1a; 2. 常量指针&#xff08;Constant Pointer&#xff09;声明方式&#xff1a;示例&#xff1a;解释&…

AIoTedge边缘物联网平台,开启智能物联新架构

边缘物联网平台是一种将计算能力、数据处理和应用服务部署在网络边缘的解决方案&#xff0c;旨在提高响应速度、降低带宽需求和增强数据安全。根据搜索结果&#xff0c;边缘物联网平台应具备以下功能&#xff1a; 云边协同&#xff1a; 云边一体架构&#xff0c;通过云端管理边…

html 解决tooltip宽度显示和文本任意位置换行文本显示问题

.el-tooltip__popper {max-width: 480px;white-space: break-spaces; /* 尝试不同的white-space属性值 */word-break:break-all; }

医疗大模型落地赛,敢问钱在何方?

“你们能不能帮我们触达到更多顶尖药企&#xff1f;” 一大模型厂商与某服务商沟通需求时率先发问。从混沌时期的争辩模型大小、数据规模&#xff0c;到如今的做应用、抢占医疗各环节场景&#xff0c;中国医疗大模型已经进入落地的第二战场。 中国信通院云计算与大数据研究所…

基于Xejen框架实现的C# winform鼠标点击器、电脑按键自动点击器的软件开发及介绍

功能演示 文章开始之前&#xff0c;仍然是先来个视频&#xff0c;以便用户知道鼠标连点器的基本功能 软件主界面 多功能鼠标连点器 快速点击&#xff1a; 痕即鼠标点击器可以设定每秒点击次数&#xff0c;让您轻松应对高频点击需求。 切换时长&#xff0c;即每次动作之间的间…