本文為 Delphi 6 SysUtils.pas 函數大全系列第五部分,涵蓋 Kylix 相關訊號處理、動態載入庫、例外訊息處理、多位元組字元 (MBCS) 處理、路徑分隔符操作、字串替換/換行、命令列參數解析、物件釋放輔助、介面支援檢查、GUID 操作、套件載入/資訊、作業系統錯誤觸發、終止程序管理、安全載入庫、環境變數 及 原子操作。
重點函數分類速查
1. 動態載入庫與模組資訊
| 函數 | 用途 | 關鍵參數/回傳 |
LoadLibrary | 載入 DLL | 回傳 HMODULE |
FreeLibrary | 釋放 DLL | Boolean |
GetProcAddress | 取得函數位址 | Pointer |
GetModuleHandle | 取得已載入模組代碼 | HMODULE |
GetModuleName | 取得模組檔名 | 參數 0 = 當前程式 |
GetPackageModuleHandle | 取得套件模組代碼 | HMODULE |
2. 例外與錯誤處理
| 函數 | 用途 |
ExceptionErrorMessage | 取得指標操作失敗訊息長度,內容置於緩衝區 |
ShowException | 顯示指標操作失敗錯誤 (支援主控台) |
Abort | 觸發靜默中止 (EAbort),不顯示錯誤訊息 |
OutOfMemoryError | 觸發記憶體不足例外 |
RaiseLastOSError | 拋出最後一個 OS 錯誤碼對應的例外 |
RaiseLastWin32Error | (Deprecated) 改用 RaiseLastOSError |
Win32Check | 檢查 API 回傳值,非零則拋出例外 |
3. 多位元組字元 (MBCS) 字串處理
| 函數 | 用途 | 備註 |
ByteType | 取得字串指定位置字元 MBCS 類型 | 單一字元/前導/尾隨位元組 |
StrByteType | PChar 版 ByteType | Index 從 0 起算 |
ByteToCharLen | 字串中多位元組字元數 | MaxLen 指定處理位元組數 |
CharToByteLen | 字串中位元組數 | MaxLen 指定處理字元數 |
ByteToCharIndex | 位元組索引 → 字元索引 | 中文字佔 2 位元組 |
CharToByteIndex | 字元索引 → 位元組起始索引 | |
StrCharLength | 第一個字元寬度 (位元組數) | |
StrNextChar | 下一個字元指標 | StrNextChar('1234') = '234' |
CharLength | 指定位置字元寬度 | |
NextCharIndex | 下一個字元位置索引 | |
4. 路徑與分隔符操作
| 函數 | 用途 |
IsPathDelimiter | 指定位置是否為路徑分隔符 |
IsDelimiter | 指定位置是否為自訂分隔符集合 |
IncludeTrailingPathDelimiter | 確保路徑以分隔符結尾 |
ExcludeTrailingPathDelimiter | 移除尾部路徑分隔符 |
LastDelimiter | 最後一個分隔符位置 |
5. 字串比較與檔名處理
| 函數 | 用途 |
AnsiCompareFileName | 比較兩檔名 (區分大小寫) |
SameFileName | 檔名是否相等 (區分大小寫) |
AnsiLowerCaseFileName | 轉小寫檔名 |
AnsiUpperCaseFileName | 轉大寫檔名 |
AnsiPos | 子字串首次出現位置 (1-based) |
AnsiStrPos | PChar 版 AnsiPos |
AnsiStrRScan | 字元最後出現位置 (PChar) |
AnsiStrScan | 字元首次出現位置 (PChar) |
6. 進階字串操作
| 函數 | 用途 | 關鍵參數 |
StringReplace | 字串替換 | rfReplaceAll 全部、rfIgnoreCase 忽略大小寫 |
WrapText | 自動換行 | BreakStr 換行符、BreakChars 斷字符、MaxCol 最大欄寬 |
FindCmdLineSwitch | 檢查命令列參數 | 支援 /switch, -switch |
FreeAndNil | 釋放物件並設為 nil | 防止重複釋放 |
Supports | 檢查物件/類別是否支援介面 | 多載支援 IInterface/TObject/TClass |
7. GUID 操作
| 函數 | 用途 |
CreateGUID | 建立新 GUID,回傳 HResult (S_OK 成功) |
StringToGUID | 字串轉 GUID,格式錯誤拋例外 |
GUIDToString | GUID 轉字串 |
IsEqualGUID | 比較兩 GUID 是否相等 |
8. 套件 (Package) 管理
| 函數/程序 | 用途 |
LoadPackage | 載入套件,回傳 HMODULE |
UnloadPackage | 卸載套件 |
GetPackageInfo | 列舉套件內單元/需求資訊 |
GetPackageDescription | 取得套件描述字串 |
InitializePackage | 初始化套件 (呼叫 Register) |
FinalizePackage | 終結套件 |
9. 終止程序管理
AddTerminateProc:註冊程式結束時執行的程序
CallTerminateProcs:執行所有終止程序 (不建議手動呼叫)
10. 安全載入庫與環境變數
| 函數 | 用途 |
SafeLoadLibrary | 安全載入 DLL (抑制錯誤對話框 SEM_NOOPENFILEERRORBOX) |
GetEnvironmentVariable | 讀取環境變數 |
SetEnvironmentVariable | 設定環境變數 (配合上函數使用) |
11. 原子操作 (Kylix/多執行緒)
InterlockedIncrement/Decrement:原子增減
InterlockedExchange:原子交換
InterlockedExchangeAdd:原子累加
實用範例精選
取得模組檔名
var vHandle: THandle;
begin
vHandle := LoadLibrary(PChar(Edit1.Text));
Caption := GetModuleName(vHandle);
FreeLibrary(vHandle);
end;
建立 GUID
var vGUID: TGUID;
begin
CreateGUID(vGUID);
Edit1.Text := GUIDToString(vGUID);
end;
安全載入庫並抑制錯誤視窗
var hMod: HMODULE;
begin
hMod := SafeLoadLibrary('mylib.dll');
if hMod <> 0 then begin
// GetProcAddress...
FreeLibrary(hMod);
end;
end;
環境變數讀寫
SetEnvironmentVariable('MY_VAR', 'TestValue');
ShowMessage(GetEnvironmentVariable('MY_VAR')); // 顯示 TestValue
SysUtils 是 Delphi 核心工具單元,掌握上述函數能處理 90% 以上的字串、路徑、錯誤、動態載入與系統互動需求。建議搭配 IDE F1 線上說明深入研讀各函數完整簽名與邊界條件。