首页 > Computer > [转]Delphi的内部字符串处理函数/过程不完全列表

[转]Delphi的内部字符串处理函数/过程不完全列表

本来这贴在旧blog上已经备份过的,不过由于那个blog所在的服务器归期无望,我还是从新备份一份吧。

  在破解用Delphi写的软件时,经常会碰到一些诸如System.@LStrCmp、System.@LStrAddRef之类的函数。实际上它们都是Delphi内部用来处理字符串的过程/函数。这些函数在System里都可以找到。但是它们的参数和返回值有点特别。于是抽空看了一下system.pas。

  首先,这些函数名都有一定的格式:

_xStryyy

  其中x可以是字符P、L、W。P代表该函数是处理传统Pascal字符串的,L代表该函数是处理长字符串的,W当然就是Unicode了。yyy就是表示函数的实际作用了。比如_PStrCat就是表示传统Pascal字符串的连接函数。大家可以查阅system.pas来验证一下。不过一般不大见到W开头的函数。

  下面是经过整理的结果,算是为大家提供一个方便。说明一下,列表不全,但没列出来的函数完全可以见名知意。当然,前提是你看完列表。

  另外,需要注意的是,对于在堆栈里的返回值,一般以EBP引用。如果你看到函数调用后下一条语句是MOV xxx,[EBP+yy],那通常就是保存返回值了。特别是_LStrCopy。

 

名称 参数 返回值 作用 等价形式 / 备注
_PStrCat EAX :目标字符串EDX :源字符串 EAX 连接两个 Pascal 字符串 s:=copy(s+s1,1,255)
_PStrNCat EAX :目标字符串EDX :源字符串

CL :结果字符串最大长度

EAX 连接两个 Pascal 字符串 s:=copy(s+s1,1,n)
_PStrCpy EAX :目标字符串EDX :源字符串 EAX Pascal 字符串复制 s:=s1
_PStrNCpy EAX :目标字符串EDX :源字符串

CL :结果字符串最大长度

EAX Pascal 字符串复制 s:=copy(s1,1,n)
_PStrCmp EAX :左字符串EDX :右字符串 标志位 Z Pascal 字符串比较 if s=s1
_AStrCmp EAX :左字符串EDX :右字符串

ECX :要比较的字符个数

标志位 Z Ansi 字符串比较 if s=s1
procedure _LStrClr(var S: AnsiString); EAX :字符串   清空字符串 s:=”
Procedure _LStrArrayClr(var str: AnsiString; cnt: longint); EAX :字符串数组指针EDX :数组长度   清空字符串数组  
procedure _LstrAsg(var dest: AnsiString; source: AnsiString) EAX :目标字符串EDX :源字符串   复制 Ansi 字符串  
Procedure _LstrLAsg(var dest: AnsiString; source: AnsiString)     复制 Ansi 字符串。但是和 _LstrAsg 的区别不详  
Procedure _NewAnsiString(length: Longint) EAX :长度 EAX (指针) 分配指定长度的 AnsiString  
procedure _LStrFromPCharLen(var Dest: AnsiString; Source: PAnsiChar; Length: Integer) EAX :目标字符串EDX :源字符串

ECX :要复制的长度

  分配并从 PChar 复制指定长度的 AnsiString  
procedure _LStrFromPWCharLen(var Dest: AnsiString; Source: PWideChar; Length: Integer) EAX :目标字符串EDX :源字符串

ECX :要复制的长度

  分配并从 PWideChar 复制指定长度的 AnsiString  
procedure _LStrFromChar(var Dest: AnsiString; Source: AnsiChar) EAX :目标字符串EDX :源字符串   单字符的分配和复制  
procedure _LStrFromWChar(var Dest: AnsiString; Source: WideChar) EAX :目标字符串EDX :源字符串   单字符的分配和复制  
procedure _LStrFromPChar(var Dest: AnsiString; Source: PAnsiChar)     Pchar 到 AnsiStr 的转换  
procedure _LStrFromPWChar(var Dest: AnsiString; Source: PWideChar)     PWideChar 到 AnsiStr 的转换  
procedure _LStrToString(var Dest: ShortString; const Source: AnsiString; MaxLen: Integer) EAX :目标字符串EDX :源字符串

ECX :要复制的长度

  AnsiString 到 Pascal 字符串的转换  
Function _LstrLen(str: AnsiString): Longint EAX :目标字符串 EAX AnsiStr 的长度  
Procedure _LstrCat(var dest: AnsiString; source: AnsiString) EAX :目标字符串EDX :源字符串   Ansi 字符串的连接 dest+=source
Procedure _LStrCat3(var dest:AnsiString; source1: AnsiString; source2: AnsiString) EAX :目标字符串EDX :源字符串 1

ECX :源字符串 2

  Ansi 字符串的连接 dest+=source
Procedure _LstrCatN(var dest:AnsiString; argCnt: Integer; …) EAX :目标字符串EDX :源字符串的个数 +2

[ESP+4*i] :第 i 个源字符串的指针

  Ansi 字符串的连接 这里的入口参数比较特别
_LStrCmp EAX :左字符串EDX :右字符串 标志位 Z Ansi 字符串比较 if s=s1
_LStrAddRef EAX :目标字符串   增加 Ansi 字符串的引用计数 这个可以不用管
_LStrToPChar EAX EAX 类型转换  
Procedure _LstrCopy(const s : AnsiString; index, count : Integer): AnsiString EAX :目标字符串EDX :起始位置

ECX :要复制的长度

[ESP+4] 复制指定长度的 Ansi 子串  
_LStrDelete EAX :目标字符串EDX :起始位置

ECX :要删除的长度

  同 Delete  
Procedure _LstrInsert(const source : AnsiString; var s : AnsiString; index : Integer) EAX :要插入的字符串EDX :目标字符串

ECX :要插入的位置

  将 source 插入到 s 的 index 位置 结果是 s 加长
_LStrPos EAX :子串EDX :目标字符串 EAX 同 POS  
_LStrSetLength EAX :目标字符串EDX :新长度      
分类: Computer 标签: , ,
  1. 本文目前尚无任何评论.
  1. 本文目前尚无任何 trackbacks 和 pingbacks.
:wink: :-| :-x :twisted: :) 8-O :( :roll: :-P :oops: :-o :mrgreen: :lol: :idea: :-D :evil: :cry: 8) :arrow: :-? :?: :!:
click to changeSecurity Code