【分享】Delphi的內部字串處理函式/過程不完全列表
在破解用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 :新長度 |
相關文章
- C語言之字串處理函式2024-06-23C語言字串函式
- GC析構物件和列表的處理過程2020-10-27GC物件
- SQL中的常用的字串處理函式大全2018-12-17SQL字串函式
- 【封裝小技巧】列表處理函式的封裝2022-05-14封裝函式
- 如何在 Go 中優雅的處理和返回錯誤(1)——函式內部的錯誤處理2021-10-01Go函式
- Clickhouse SQL日期處理函式及案例分享2024-05-24SQL函式
- 如何在函式內部定義函式?2024-03-01函式
- 函式內部This的指向問題2020-11-18函式
- 函式內部的變數提升2024-06-08函式變數
- python中PCA的處理過程2021-09-11PythonPCA
- PHP內建字串函式實現2018-08-23PHP字串函式
- 陣列處理函式2019-08-07陣列函式
- C++ 字串 cctype 標頭檔案標準庫處理函式2024-09-18C++字串函式
- jQuery內部對<script>標籤的處理2019-03-31jQuery
- DOM在Ahooks中的處理過程2022-07-21Hook
- 返回Promise物件的函式,函式內部記得加try catch!2020-11-12Promise物件函式
- js函式執行過程的探究2021-09-11JS函式
- Python 字串 String 內建函式大全(1)2021-09-09Python字串函式
- Python 字串 String 內建函式大全(2)2021-09-09Python字串函式
- 函式棧幀(呼叫過程)2018-08-05函式
- JavaScript 非同步函式的 Promisification 處理2022-08-15JavaScript非同步函式
- 物件轉json字串的過程中對value為null的值的一些處理2020-09-25物件JSON字串Null
- MySQL資料庫INNODB表損壞修復處理過程分享2021-09-09MySql資料庫
- 字串、列表、字典內建方法2024-05-14字串
- [提問交流]分享一個擷取字串的函式2019-05-11字串函式
- Python List 列表的處理2020-04-13Python
- 字串處理2024-09-15字串
- Flink流處理過程的部分原理分析2018-12-19
- 【原始碼】Redis命令處理過程2022-02-10原始碼Redis
- async、await和generator函式內部原理2019-07-30AI函式
- 讓element UI的select選擇器 :label 的值經過函式處理2020-10-24UI函式
- 關於變數的宣告和定義、內部函式和外部函式2024-11-14變數函式
- Flink處理函式實戰之四:視窗處理2020-11-23函式
- MySQL儲存過程 (即函式)2019-01-24MySql儲存過程函式
- mySql 儲存過程與函式2024-05-24MySql儲存過程函式
- SQL server儲存過程函式2024-08-09SQLServer儲存過程函式
- MySQL 儲存過程和函式2022-04-23MySql儲存過程函式
- MySQL儲存過程和函式2020-12-12MySql儲存過程函式
- Sanic 處理函式修飾器2019-04-15函式