【IDA】为何 pdg2 v3.8 控件的 CopyToClipBoard 方法存在限制

c#,将pdf文件转换成图片文件。 本文采用Adobe Acrobat9.0的COM组件,将Pdf文件的每一页转换成对应的图片文件。 开发环境:VS2010,.Net Framework4.0,Adobe Acrobat9.0。 工程中添加COM引用:Adobe Acrobat 9.0 Type Library(必须装了Adobe Acrobat9.0才会有)。   思路: 1、需要用到的COM对象: 阅读详情

网上流传着使用 pdg2 控件 IT_Pdg01 接口 CopyToClipBoard 方法将 .pdg 文件转换为图片的方法,不少读者在根据该方法进行实践的时候发现调用 v3.8 及以后版本控件的 CopyToClipBoard 方法是无效的。

笔者通过使用 IDA Pro 对 v3.8 控件反向工程,发现只有调用了 LocateRect 方法后,才能使 CopyToClipBoard 方法有效。由于 LocateRect 方法需读者操作鼠标选择复制范围,完全不能用于大批量转换工作。所以,笔者将要讲解跳过 LocateRect 方法的途径。

先给出 CopyToClipBoard 方法的原型声明:

void CopyToClipBoard([in] unsigned long left, [in] unsigned long top, [in] unsigned long right, [in] unsigned long bottom);

再给出 CopyToClipBoard 方法汇编代码,如下:

.text:1000445F                 push    ebp
.text:
10004460                 mov     ebp, esp
.text:
10004462                 sub     esp, 0FCh
.text:
10004468                 push    ebx
.text:
10004469                 push    esi
.text:1000446A                 push    edi
.text:1000446B                 mov     edi, ecx
.text:1000446D                 mov     [ebp
+t_pdg01], edi
.text:
10004470                 mov     eax, [edi+3DE8h] ; rect.right
.text:
10004476                 mov     esi, [edi+3DE0h] ; rect.left
.text:1000447C                 mov     ecx, [edi
+3DE4h] ; rect.top
.text:
10004482                 mov     edx, [edi+3DECh] ; rect.bottom
.text:
10004488                 mov     [ebp+rect_right], eax
.text:1000448B                 
sub     eax, esi        ; width
.text:1000448D                 mov     [ebp
+rect_top], ecx
.text:
10004490                 mov     [ebp+rect_bottom], edx
.text:
10004493                 jnz     short loc_1000449D
.text:
10004495                 sub     edx, ecx        ; height
.text:
10004497                 jz      return_false
.text:1000449D
.text:1000449D loc_1000449D:                           ; CODE XREF: CopyToClipBoard
+34
.text:1000449D                 cmp     dword ptr [edi
+3D98h], 0 ; bLocateRect ?
.text:100044A4                 jz      return_false

.text:100044AA                 mov     eax, [edi
+60h]
.text:100044AD                 cmp     dword ptr [edi
+2584h], 0
.text:100044B4                 lea     ebx, [edi
+60h]
.text:100044B7                 mov     [ebp
+var_50], eax
.text:100044BA                 jnz     short loc_100044C2
.text:100044BC                 push    
0
.text:100044BE                 push    
0
.text:100044C0                 jmp     short loc_100044D9

地址10004470 - 10004487,可知 CopyToClipBoard 方法并未使用方法参数中的 right 和 bottom,而是将 LocateRect 方法获取到的鼠标选定范围读取了出来。

地址1000449D,可知 CopyToClipBoard 方法还需判断 LocateRect 方法是否在之前被调用过。如果未调用过,则退出 CopyToClipBoard 方法。

通过对 get_PageWidth 和 get_PageHeight 方法反向工程,又知 [edi+2184h] 和 [edi+2188h] 分别存有当前页面的宽度和高度。

为使 CopyToClipBoard 方法不受限,可修改汇编代码为:

.text:1000445F                 push    ebp
.text:
10004460                 mov     ebp, esp
.text:
10004462                 sub     esp, 0FCh
.text:
10004468                 push    ebx
.text:
10004469                 push    esi
.text:1000446A                 push    edi
.text:1000446B                 mov     edi, ecx
.text:1000446D                 mov     [ebp
+t_pdg01], edi
.text:
10004470                 mov     eax, [edi+2184h] ; PageWidth
.text:
10004476                 mov     esi, [edi+3DE0h] ; rect.left
.text:1000447C                 mov     ecx, [edi
+3DE4h] ; rect.top
.text:
10004482                 mov     edx, [edi+2188h] ; PageHeight
.text:
10004488                 mov     [ebp+rect_right], eax
.text:1000448B                 sub     eax, esi        ; width
.text:1000448D                 mov     [ebp
+rect_top], ecx
.text:
10004490                 mov     [ebp+rect_bottom], edx
.text:
10004493                 jnz     short loc_1000449D
.text:
10004495                 sub     edx, ecx        ; height
.text:
10004497                 jz      return_false
.text:1000449D
.text:1000449D loc_1000449D:                           ; CODE XREF: CopyToClipBoard
+34
.text:1000449D                 cmp     dword ptr [edi
+3D98h], 0 ; bLocateRect ?
.text:100044A4                 nop
.text:100044A5                 nop
.text:100044A6                 nop
.text:100044A7                 nop
.text:100044A8                 nop
.text:100044A9                 nop
.text:100044AA                 mov     eax, [edi
+60h]
.text:100044AD                 cmp     dword ptr [edi
+2584h], 0
.text:100044B4                 lea     ebx, [edi
+60h]
.text:100044B7                 mov     [ebp
+var_50], eax
.text:100044BA                 jnz     
short loc_100044C2
.text:100044BC                 push    
0
.text:100044BE                 push    
0
.text:100044C0                 jmp     
short loc_100044D9
【IDA】分析 Windows CE 事件日志服务(一) 笔者在开始使用 Windows CE 事件日志服务时,由于自身条件限制未能获得 Microsoft 的技术支持,故只能使用 IDA Pro 对 eventlog.dll 进行分析。笔者感觉事件日志服务相关的注册表设置可能对嵌入式系统软件工程师比较有用,所以注重分析 StartAllLoggers、InitFormattersAndOutputters、CLogEventLog::Initial 阅读详情

相关推荐

2025华东杯A/B/C题解题思路+可运行代码参考

这些因素包括但不限于:助滑坡的坡度、运动员的质量、滑雪板的接触面与雪地的摩擦力、空气阻力系数、运动员的体型和衣物形态等。助滑坡是运动员滑行至起跳台前的最后一段坡道,这一段坡道的坡度、长度和运动员的姿势会直接影响到起跳时的初始速度。运动员的滑行速度不仅受助滑坡的坡度影响,还受到摩擦力、空气阻力和重力等多方面因素的影响。通过合理的姿势调整,运动员能够有效减少空气阻力,增加身体的重力加速度,进而提升滑行速度。助滑坡的角度通常介于10°到12°之间,而运动员的滑行速度将受到重力、摩擦力和空气阻力的共同作用。

qq_52590045的博客 1797

C#编写的类库,实现将pdf转换成图片(jpg)

最近在网上查了很多资料,刚开始的做的不是太好,感觉实现起来很困难。那个pdf转换成图片用C++相对来说很麻烦,因为它要调用一起其他的库文件,使用起来不太好办,最近有点忙也没整理这个。但C#和Java的现成的程序都有,用C++的有,是调用Acrobat中的文件自己编写的,但不是生成图片,只是用VC显示,网址是:http://www.evget.com/zh-CN/Info/catalog/6594.html有个用C#实现的网址是:http://www.codeproject.com/KB/cs/GhostSc

一口吃不了胖子 7790

RAID 0/1/5/10 性能实测:4块 SATA SSD 组阵列,顺序读写速度对比

本文通过实测对比了RAID 0/1/5/10在4块SATA SSD上的顺序读写性能,详细展示了不同RAID级别的配置方法、理论性能与实际测试数据。测试结果显示,RAID 0在顺序读写速度上表现最佳,而RAID 10则在性能与数据安全之间取得了平衡,适合数据库服务器等关键应用场景。

weixin_33462167的博客 424

C#将PDF文件转换成JPG文件

C#和Java的现成的程序都有,用C++的有,是调用Acrobat中的文件自己编写的,但不是生成图片,只是用VC显示,网址是: http://www.evget.com/zh-CN/Info/catalog/6594.html 有个用C#实现的网址是: http://www

Lassewang的成长历程 8141

RS485差分信号A下拉B上拉导致的乱码问题:一个硬件工程师的踩坑实录

本文通过一个工业网关项目中的RS485通信乱码故障,深入剖析了差分信号偏置电路设计的核心要点。文章详细记录了从波形抓取、原理图分析到多节点冲突排查的全过程,重点揭示了A下拉、B上拉这一反常规配置如何导致总线空闲状态不稳定,进而引发数据包末尾多出0x00字节及前导乱码的问题,并最终给出了硬件与软件协同的系统级解决方案与设计准则。

weixin_29159441的博客 236

DevExpress中使用BandGridView实现复合(多行)表头、设置多行表头背景颜色、表格边框颜色

一、实现效果 二、 实现方法 2.1、创建复合表头 ①将创建的GridControl下的GirdView1转化为BandGridView类型; ②创建需要展示的列(指定列的名称【Name】、描述【caption】、数据字段名称【FieldName】) ③绑定列实现复合表头。 注意:如果复合表头有多行,则需要设置新增Band的Row Count,然后设置【Band properties下的AutoFillDown=false】 详细操作如下: 注意:如果要隐藏表格的设计字段内容,则需.

提供C#相关开发 、云计算、运维测试、网络安全相关技术分享与服务,有意向可联系。 2893

PDF文档转为图片的方法

PDT文档转换为图片的方法: 需要PDFBox-0.7.3.dll,Interop.Acrobat.dll,Microsoft.Office.Interop.Word.dll   ///将PDF文档转换为图片的方法         ///因为大多数的参数都有默认值startPageNum默认值为1,endPageNum默认值为总页数         /// imageFormat默认值为

zhangxue_bjmps的专栏 1246

外向交货单批次赋值的标准姿势:用 BAPI_OUTB_DELIVERY_CHANGE 把 LIPS-CHARG 改得稳、改得干净

摘要: 外向交货单批次赋值涉及严格的业务约束,包括批次管理状态、单据状态、拆分规则等,直接更新表 LIPS 不可取。推荐使用 BAPI_OUTB_DELIVERY_CHANGE 接口,通过标准业务逻辑实现批次修改。关键点包括:区分单批次分配与批次拆分场景,正确设置 ITEM_CONTROL 控制结构,并确保单位/数量数据完整。附可直接执行的ABAP代码示例,实现安全可靠的批次更新流程。 (字数:149字)

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

Pdf转图片

由于项目需要将Pdf转化为jpg,所以花了一点时间研究了一下,主要采用一下两种

nncrystal的专栏 2188

CodeBuddy Code CLI 常用工作流:17个实战场景全解析

CodeBuddy Code CLI 17个实战场景解析 本文详细介绍了CodeBuddy Code CLI在17个开发场景中的高效应用,包括: 快速理解新代码库 高效修复Bug 安全重构代码 使用子代理系统处理专业任务 Plan Mode安全分析 自动化测试处理 创建合并请求 文档生成与维护 图片内容分析 文件目录快速引用 每个场景都配有具体命令示例和最佳实践,帮助开发者提升工作效率。

简简单单Onlinezuozuo 1079

基于STM32的智能宠物喂食系统设计与实现(代码+PCB )

STM32;DHT11;本系统的软件程序基于Keil MDK-ARM V5集成开发环境进行编写和编译。Keil MDK是ARM公司官方推荐的嵌入式开发工具,支持ARM Cortex-M系列微控制器的程序开发,内置ARM C/C++编译器、调试器和仿真器,具有代码编辑、语法高亮、工程管理和在线调试等功能,是STM32开发领域应用最为广泛的IDE之一。

3254968421的博客 72

Dev使用

1、gridView.OptionsSelection.MultiSelectMode = DevExpress.XtraGrid.Views.Grid.GridMultiSelectMode.CellSelect;             gridView.OptionsSelection.MultiSelect = true;             gridView.OptionsBeh

Sharon_Hwang的博客 1208

【OD统一考试(B卷)】比赛的冠亚季军,Python 解答

比赛的规则是 0 号和 1 号比赛,2 号和 3 号比赛,以此类推,每一轮,相邻的运动员进行比赛,获胜的进入下一轮,实力值大的获胜,实力值相等的情况,id 小的情况下获胜,轮空的直接进入下一轮。第一轮比赛,id 为 0 实力值为 2 的运动员和 id 为 1 实力值为 3 的运动员比赛, 1 号胜出进入下一轮争夺冠亚军,id 为 2 的运动员和 id 为 3 的运动员比赛,3 号胜出进入下一轮争夺冠亚军;2 号与 0 号,比赛进行季军的争夺,2 号实力值为 4,0 号实力值 2,故 2 号胜出,得季军。

梦想橡皮擦,专栏100例写作模式先行者,现象级专栏 《Python 爬虫 100 例》作者、《滚雪球学 Python 专栏》原创者 1万+

ida pro 7.0 新变化

ida 7.0 新变化(作为tester, 有幸获得额外3个月的技术支持): 自身二进制架构变化 (同时发布x86, x64; 在OS中, 可同时安装) x64 主打新变化 (跟着OS趋势走(64位), 所有之前的32位插件, 都要重新 适配, 编译) x86 延续了6.95的功能做了部分增强, 修复bug. (过渡兼容阶段) 大量的c/c++ API做了重构 参见 https://www.

冯建华的专栏 1万+

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

copy-to-clipboard API用法

1.安装API npm install --save copy-to-clipboard 2.使用API; import copy from 'copy-to-clipboard'; 在react中使用案例 handleCopy = () => { const text = this.refs.test.innerHTML; copy(text); Toast.info(...

马娟的博客 6265

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

PDF文件怎么复制页面,复制页面工具使用方法

  我们在编辑页面的使用怕有失误这样一切就都要从来,一般我们编辑的时候都会复制之后再编辑,那么PDF文件的页面要怎么复制呢,应该有很多的小伙伴都挺好奇该怎么做的吧,今天就来为大家分享一下,小伙伴们一起来看看哦!  操作软件:PDF编辑器  1.PDF文件的编辑是需要编辑器的,在百度中搜索下载一款编辑器安装在电脑上。这样以后再需要编辑PDF文件的时间就可以直接的打开使用了。  ...

weixin_33712987的博客 1412

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

复制工具copy-to-clipboard

1、安装插件 : //npm npm i --save copy-to-clipboard //yarn yarn add copy-to-clipboard 2、页面使用: #引入插件 import copy from 'copy-to-clipboard'; copy('需要被复制的内容'); 3、参数设置: //复制操作时,可以设置的参数对象 copy('需要被复制的内容', { debug: true, //是否控制台打印,布尔值 message: 'Press #{key} to

m0_46649866的博客 2237

【WM】谈Phone Canvas函数为何不会返回错误值RPC_E_WRONG_THREAD

微软向OEM厂商提供Phone Canvas机制,让我们可以修改cprog.exe的数个界面布局和UI交互行为。我们发现多数Phone Canvas API函数的返回值列表中都存在错误值RPC_E_WRONG_THREAD,下表就是PHGetBlobPtr的返回值列表: S_OKIndicates success. E_INVALID

keyssoft的乌托邦 1736

【WM】如何获取Exe文件的进程ID

我们在编程时,或许想知道给定Exe文件是否正在运行?如果正在运行,那么他的进程ID是多少?Win32 API函数GetExeProcessId()就能帮你实现这个目的。 该函数的原型声明位于miscsvsc.h内:HRESULT GetExeProcessId(LPTSTR pszExeFile, DWORD* pdwProcID); 要使用该函数需要链接ossvcs.lib。

keyssoft的乌托邦 1717

【WM】如何判断两个窗口是否由同一进程创建

在我们的代码中,可能要判断某个窗口是否由shell32、cprog、tmail或connmgr进程创建的。由于这几个进程都会创建数个很具有特征意义的窗口,比如:shell32进程会创建DesktopExplorerWindow和HHTaskBar等窗口,故这个问题就可简化为判断两个窗口是否由同一进程创建。 在头文件wpcpriv.h中,存在未归档Win32 API函数SHSameWindowP

keyssoft的乌托邦 1677
上一篇: 【WCE】使用 8253 定时器蜂鸣 (CEPC BSP)
下一篇: 【WCE】使用事件日志服务(一)
keyssoft
博客等级 码龄25年 8粉丝 35原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值