(转)TComboBox patch for Delphi 7
unit D7ComboBoxStringsGetPatch; // The patch fixes TCustomComboBoxStrings.Get method for empty string item in Delphi . interface {$IF RTLVersion <> 15.0} 'This patch is intended for Delphi 7 only'; {$IFEND} implementation uses Windows, SysUtils, StdCtrls; resourcestring RsPatchingFailed = 'TCustomComboBoxStrings.Get patching failed.'; type TPatchResult = (prNotNeeded, prOk, prError); function PatchCode(RoutineStartAddr: Pointer; PatchOffset: Cardinal; OriginalCode: Pointer; OriginalCodeLen: Cardinal; PatchedCode: Pointer; PatchedCodeLen: Cardinal): TPatchResult; const JmpOpCode = $25FF; type PPackageThunk = ^TPackageThunk; TPackageThunk = packed record JmpInstruction: Word; JmpAddress: PPointer; end; var CodeStart: Pointer; BytesWritten: DWORD; begin if FindClassHInstance(System.TObject) <> HInstance then with PPackageThunk(RoutineStartAddr)^ do if JmpInstruction = JmpOpCode then RoutineStartAddr := JmpAddress^ else begin Result := prError; Exit; end; CodeStart := Pointer(LongWord(RoutineStartAddr) + PatchOffset); if CompareMem(CodeStart, OriginalCode, OriginalCodeLen) then begin if WriteProcessMemory(GetCurrentProcess, CodeStart, PatchedCode, PatchedCodeLen, BytesWritten) and (BytesWritten = PatchedCodeLen) then begin FlushInstructionCache(GetCurrentProcess, CodeStart, PatchedCodeLen); Result := prOk; end else Result := prError; end else Result := prNotNeeded; end; type TCustomComboBoxStringsHack = class(TCustomComboBoxStrings); function AddrOfTCustomComboBoxStringsGet: Pointer; begin Result := @TCustomComboBoxStringsHack.Get; end; procedure PatchTCustomComboBoxStringsGet; const OriginalCode: Cardinal = $74FFF883; // CMP EAX, - | JZ +$ PatchedCode: Cardinal = $7E00F883; // CMP EAX, | JLE +$ PatchOffset = $1F; // for DEBUG DCU by Pavel Rogulin OriginalCodeD: Cardinal = $FFF07D83; PatchedCodeD: Cardinal = $00F07D83; PatchOffsetD = $2E; var PatchResult: TPatchResult; begin PatchResult := PatchCode(AddrOfTCustomComboBoxStringsGet, PatchOffset, @OriginalCode, SizeOf(OriginalCode), @PatchedCode, SizeOf(PatchedCode)); if PatchResult = prNotNeeded then PatchResult := PatchCode(AddrOfTCustomComboBoxStringsGet, PatchOffsetD, @OriginalCodeD, SizeOf(OriginalCodeD), @PatchedCodeD, SizeOf(PatchedCodeD)); case PatchResult of prError: begin if IsConsole then WriteLn(ErrOutput, RsPatchingFailed) else MessageBox(, PChar(RsPatchingFailed), nil, MB_OK or MB_ICONSTOP or MB_TASKMODAL); RunError(); end; end; end; initialization PatchTCustomComboBoxStringsGet; end.
官方BUG解决地址:
http://cc.embarcadero.com/item/18872
(转)TComboBox patch for Delphi 7的更多相关文章
- Delphi XE2 之 FireMonkey 入门(42) - 控件基础: TComboBox、TComboEdit
Delphi XE2 之 FireMonkey 入门(42) - 控件基础: TComboBox.TComboEdit TListBox 有两个兄弟 TComboListBox.TComboEditL ...
- delphi连接sql存储过程
针对返回结果为参数的 一. 先建立自己的存储过程 ALTER PROCEDURE [dbo].[REName] ) AS BEGIN select ROW_NUMBER() over(order by ...
- 转:Delphi 6 实用函数
来自: daocaoren0824, 时间: -- ::, ID: 再给你一份 程序员实用函数 {▎▎▎▎▎▎▎▎▎▎▎▎▎▎▎▎▎▎▎▎▎▎▎▎▎▎▎▎▎▎▎▎▎▎▎▎▎▎▎} {▎ ▎} {▎ 大 ...
- delphi里动态创建AlphaControls实现换肤
AlphaControls是一套Delphi下的优秀的皮肤vcl控件.几年前,一般用得比较多的是vclskin,使用很方便,可惜这套2010年已经停止维护了.后来就看到更多的人开始推崇AlphaCon ...
- delphi.指针.应用
注:初稿...有点乱,可能增删改... 因为指针应用,感觉不好写,请大家指出错误,谢谢. 注意: 本文着重点讲的是指针的各类型的应用或使用,而不是说这种方法不应该+不安全+危险+不提倡使用. 其它:本 ...
- Delphi完成的断点续传例子 转
unit Unit1; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms ...
- Delphi经验总结(1)
先人的DELPHI基础开发技巧 ◇[DELPHI]网络邻居复制文件 uses shellapi; copyfile(pchar('newfile.txt'),pchar('//computername ...
- Delphi xe7 FireMonkey / Mobile (Android, iOS)生成 QR Code完整实例
这个实例在windows.OS X.IOS和Android等平台运行正常.本文参考这个网站提供的方法:http://zarko-gajic.iz.hr/firemonkey-mobile-androi ...
- 2年后的Delphi XE6
1.有幸下载到Delphi XE6,下载地址如下: http://altd.embarcadero.com/download/radstudio/xe6/delphicbuilder_xe6_win. ...
随机推荐
- vue 常见的新增、编辑、查看公用同一个页面
用vue开发经常会碰到,一个功能的新增.编辑.查看公用同一个页面,如果是页面暂且不提. 但是弹框,很多人会发现,如果是点击编辑,取消,再点新增,弹框上面是会有残留数据的,为什么会这样呢,因为在点编辑的 ...
- Muduo 多线程模型:一个 Sudoku 服务器演变
陈硕 (giantchen AT gmail) blog.csdn.net/Solstice Muduo 全系列文章列表: http://blog.csdn.net/Solstice/category ...
- 1 slow requests are blocked > 32 sec解决方法
[root@node1 ~]# ceph -s cluster: id: b8b4aa68-d825-43e9-a60a-781c92fec20e health: HEALTH_WARN Reduce ...
- javaScript之事件处理程序
事件就是用户或浏览器自身执行的某个动作,JavaScript与HTML的交互也是通过事件实现的.而相应某个事件的函数就叫做事件处理函数.包括以下几种: 1.HTML事件处理程序 某个元素支持的每 ...
- HBase 官方文档
HBase 官方文档 Copyright © 2010 Apache Software Foundation, 盛大游戏-数据仓库团队-颜开(译) Revision History Revision ...
- CentOS 7 配置 http 服务器
一.http单域名访问 1.安装软件: yum -y install httpd 2.启动服务:systemctl start httpd 3.设置开机启动: systemctl enable ht ...
- Socket对象以及异常
1 socket构造器: public Socket() 创建一个Socket套接字 public Socket(InetAddress address,int port) 创建一个指定IP和端口的 ...
- spring+jax 出现java.io.Serializable is an interface, and JAXB can't handle interfaces
spring+jax 出现java.io.Serializable is an interface, and JAXB can't handle interfaces 原因是我的webservice方 ...
- php学习笔记-可变变量
看一个例子. <?php $a = 'hello'; $hello = 'hi'; echo $$a; ?> 如果一个变量名前面有两个美元符号,那么这个变量就叫做可变变量.就拿上面这个举例 ...
- Linux awk指令详解
简介 awk是一个强大的文本分析工具,相对于grep的查找,sed的编辑,awk在其对数据分析并生成报告时,显得尤为强大.简单来说awk就是把文件逐行的读入,以空格为默认分隔符将每行切片,切开的部分再 ...