Delphi Win32 API 使用的特殊情況 (轉)
我個人認為, 是當今最好的 視覺化開發工具。
其種種特點令開發如虎添翼。但要想發揮出 Delphi 真正的內含
比如開發,實現一些特殊的功能,就必須直接 。
Win32 API 主要包含在 Windows95/98/NT/2K 的動態連線庫中
如 Kernel32.dll、User32.dll、Gdi32.dll、32.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,找第三方控制元件(這個方法好像是廢話)
二:動態加在函式。方法如下:以 中的 AnimateWindow 為例
(關於 AnimateWindow 函式的詳細討論,請到 "> 文件,VB
查詢關鍵字 AnimateWindow,感謝: iProgram)
Unit XXXX;
.....
type
FAnimateWindow = function(
const hwnd : HWND; 對視窗有效
const dwTime : D; 畫持續時間,預設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.
怎麼樣,是有些麻煩吧,很值的。
如果你不想讓自己的程式挑三揀四,
如果你不想讓自己被稱為廢物程式設計師,呵呵,試一下吧。
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/10752043/viewspace-988378/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- DOM對映的特殊情況
- DBMS_BACKUP_RESTORE用於特殊情況下的恢復(轉)REST
- 為什麼使用API?什麼情況下避免使用API?API
- Java程式異常處理的特殊情況Java
- DELPHI中使用API函式詳解 (轉)API函式
- 城市天氣情況APIAPI
- Win32 API 登錄檔類的編制以及使用 (轉)Win32API
- DBMS_BACKUP_RESTORE用於特殊情況下的恢復REST
- eclipse 專案gradle無反應的幾種特殊情況EclipseGradle
- 高階網站建設中出現的一些特殊情況網站
- Oracle資料庫聯接(inner join ,outer join)和NOT IN的特殊情況Oracle資料庫
- 在Delphi中巧用WINDOWS 的API函式 (轉)WindowsAPI函式
- VB中API的宣告特殊問題 (轉)API
- oracle order by索引是否使用的情況Oracle索引
- DBMS_BACKUP_RESTORE.DBMS_BACKUP_RESTORE用於特殊情況下的恢復REST
- IOS 自動化,幾種特殊情況下 UI 元素獲取的方式iOSUI
- 在不重灌Windows情況Ç(轉)Windows
- Delphi Open Tools Api例項研究(一) (轉)API
- Win32除錯API學習心得(一) (轉)Win32除錯API
- win32除錯API學習心得(三) (轉)Win32除錯API
- Win32除錯API學習心得(二) (轉)Win32除錯API
- 記一次使用Oauth的情況OAuth
- 公司使用大資料的基本情況大資料
- PHP應避免使用addslashes()的情況PHP
- 特殊情況之下,千鋒老師教你如何準備影片面試面試
- [zt] Oracle不使用索引的幾種情況Oracle索引
- 使用sed做特殊的行列轉換
- 如何在不使用Java Collection API的情況下從陣列中刪除重複項JavaAPI陣列
- 什麼情況下不能使用最壞情況評估演算法的複雜度?演算法複雜度
- 在Delphi中使用Queued 元件 (轉)元件
- 我的Win32開發抉擇,Delphi老將復出Win32
- 華為鴻蒙來了!八大亮點超越安卓,特殊情況隨時可用!鴻蒙安卓
- Win32常用API講解Win32API
- 外連線轉換為內連線的情況
- Mongodb記憶體管理和使用情況情況查詢MongoDB記憶體
- Swift 1.1語言函式引數的特殊情況本地引數名外部引數名Swift函式
- 觀察者Observer模型事件,使用注意情況Server模型事件
- ORACLE程式佔用CPU情況分析(轉載)Oracle