Win32 API 使用的特殊情況
發表時間:2024-02-19 來源:明輝站整理相關軟件相關文章人氣:
[摘要]我個人認為,Delphi 是當今最好的 Windows 可視化開發工具。其種種特點令開發如虎添翼。但要想發揮出 Delphi 真正的內含性能比如開發控件,實現一些特殊的功能,就必須直接調用 Win32 API。Win32 API 主要包含在 Windows95/98/NT/2K 的系統動態連接庫中...
我個人認為,Delphi 是當今最好的 Windows 可視化開發工具。
其種種特點令開發如虎添翼。但要想發揮出 Delphi 真正的內含性能
比如開發控件,實現一些特殊的功能,就必須直接調用 Win32 API。
Win32 API 主要包含在 Windows95/98/NT/2K 的系統動態連接庫中
如 Kernel32.dll、User32.dll、Gdi32.dll、Shell32.dll 等等
通常情況下 我們只要在代碼的 Uses 部分加入 Windows 等單元
的聲明即可像使用 Delphi 內置函數一樣的使用 Win32 API 函數,十
分方便。
但是,這樣使用有時候會帶來一些意想不到的麻煩。具體如下:
眾所周知,Windows 的版本十分多,僅 Win95 就有 Win95A,Win95B
等等,而它們對 Win32 API 的實現是有細微差別的,盡管它們都是
Win32 平臺。有一些 Win32 API 函數在特定的 Windows 版本中名稱有
些許不同,或者根本就是是不存在的。
這樣就帶來了問題: Delphi 的 Windows 等單元是與當時最新的
Win32 API 全集對應的,Delphi 在編譯的時候總是動態連接 Windows
函數庫(所有的 Windows 編譯型開發工具都是這樣的)。編譯時毫無
問題的代碼,其可執行文件在特定的 Windows 平臺上就無法使用。
由于 Windows 的可執行文件加載機制,在 Delphi 集成環境中是
無法跟蹤這樣的潛在問題的。下面舉兩個例子:
例一:
Win32 API 聲明:
function BroadcastSystemMessage; external user32
name 'BroadcastSystemMessageA';
(來自 Delphi 5 Enterprise Windows.pas :29408)
注意,使用這個函數編譯后,程序在 Win95 的早期版本中無法使用(
好像是 Win95A)
將函數聲明改為如下后,問題解決:
function BroadcastSystemMessage; external user32
name 'BroadcastSystemMessage'; //注意這里!!
例二:
Win32 API 聲明:
function SHGetSpecialFolderPath; external shell32
name 'SHGetSpecialFolderPathA'
(來自 Delphi 5 Enterprise ShlObj.pas :3333)
注意,使用這個函數編譯后,程序在 Win95 某版本中無法使用
(Shell32.dll 版本:4.00.1111),因為這個函數根本就不存在��!
目前我尚無解決方案
要避免這樣的問題的出現,有兩個方法:
一:不直接使用 Win32 API,找第三方控件(這個方法好像是廢話)
二:動態加在函數。方法如下:以 Win2K 中的 AnimateWindow 為例
(關于 AnimateWindow 函數的詳細討論,請到 www.csdn.net 文檔,VB
查找關鍵字 AnimateWindow,感謝: iProgram)
Unit XXXX;
.....
type
FAnimateWindow = function(
const hwnd : HWND; //僅對窗口有效
const dwTime : DWORD; //動畫持續時間,默認200ms
const dwFlags : DWORD): DWORD; stdcall;
function AnimateWindow(const hWnd : HWND; const dwTime : DWORD;
const dwFlags : DWORD): DWORD;
implementation
function AnimateWindow(const hWnd : HWND; const dwTime : DWORD;
const dwFlags : DWORD): DWORD;
var
DLLHandle : THandle;
AnimateWindow : FAnimateWindow;
begin
Result := 0;
DLLHandle := LoadLibrary('user32.dll');
@AnimateWindow := GetProcAddress(DllHandle,'AnimateWindow');
Result := AnimateWindow(hWnd, dwTime, dwFlags);
end;
.....
end.
怎么樣,是有些麻煩吧,很值的。
如果你不想讓自己的程序挑三揀四,
如果你不想讓自己被稱為廢物程序員,呵呵,試一下吧。