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