Windows API 基於 C/C++ 類型 (如 LPSTR、HICON、HWND),Delphi 使用 Pascal 類型 (string、TIcon、THandle),直接調用會類型不匹配,需封裝轉換。
function GetSysPath: string;
var
sTmp: string;
begin
Result := '';
SetLength(sTmp, 256); // 預分配緩衝區
GetSystemDirectory(PChar(sTmp), 256); // API 需 PChar
SetLength(sTmp, StrLen(PChar(sTmp))); // 截取實際長度
Result := sTmp + '\';
end;
要點:SetLength 確保緩衝區可寫,PChar(sTmp) 取首字符指針,StrLen 計算以 #0 結尾的長度。
procedure TForm1.ChangeAppIcon;
var
Icon: TIcon;
begin
Icon := TIcon.Create;
try
// ExtractIcon 返回 HICON (Pointer),賦給 TIcon.Handle
Icon.Handle := ExtractIcon(Application.Handle, PChar('D:\WINNT\regedit.exe'), 0);
if Icon.Handle <> 0 then
Application.Icon := Icon; // TIcon 隱式轉換
finally
Icon.Free;
end;
end;
錯誤寫法:Application.Icon := ExtractIcon(...) 類型不匹配。正確做法:創建中間 TIcon,接收句柄再賦值。
| C/C++ 類型 | Delphi 類型 | 轉換方式 |
|---|---|---|
| LPSTR/LPCSTR | PAnsiChar / PChar | PChar(string) |
| HWND | HWND / THandle | 直接賦值 |
| HINSTANCE | HINST / THandle | 直接賦值 |
| HICON | HICON / THandle | TIcon.Handle |
| HBITMAP | HBITMAP / THandle | TBitmap.Handle |
| DWORD | DWORD / Cardinal | 直接賦值 |
| BOOL | BOOL / LongBool | 非零為 True |