控制程式碼的本質——撥亂反正篇 (轉)

worldblog發表於2007-12-10
控制程式碼的本質——撥亂反正篇 (轉)[@more@]

受M$的幫助文件以及很多書籍的影響,大家對局柄比較普遍的認識是:控制程式碼是一個整數,用以標識Windows,控制程式碼不是一個指標……

而實際上,這些不過是M$進行資料封裝的幌子而已,下面我們一起來分析一下HANDLE到底是什麼。

請先到Windef.h找絕大多數控制程式碼的定義:
DECLARE_HANDLE(HWND);
DECLARE_HANDLE(HHOOK);
……
DECLARE_HANDLE(HGDIOBJ);
DECLARE_HANDLE(HBITMAP);
DECLARE_HANDLE(HBRUSH);
……
typedef HANDLE              HGLOBAL;
typedef HANDLE              HLOCAL;
……

OK, 現在大家跟我一起翻到Winnt.h,看看DECLARE_HANDLE和HANDLE到底是什麼:
#ifdef STRICT
typedef void *HANDLE;
#define DECLARE_HANDLE(name) struct name##__ { int unused; }; typedef struct name##__ *name
#else
typedef PVOID HANDLE;
#define DECLARE_HANDLE(name) typedef HANDLE name
#endif
typedef HANDLE *PHANDLE;

哈哈,現在知道了吧,HANDLE就是PVOID,也就是無型別指標,
而DECLARE_HANDLE(HWND);就是:
struct HWND__ {
    int unused;};
typedef struct HWND__ *HWND;
現在實際上都清楚啦,這些Handles都不過是指向struct的指標,至於這個struct的用處,連M$都說unused了,^o^

現在解釋下M$這麼做的意義,這就是所謂資料封裝,你可以在你的中把M$的內部結構指標傳來傳去,可是你卻不知道它到底指向的內容是什麼,而且可以編個控制程式碼的瞎話防止大家的質疑:)。而M$的程式大可以這麼寫:
#include   //這個和大家用的一樣
#include "windows_in.h"  //這個是M$自用的,外人別想看到^o^

HSOMETHINGELSE DoSomething(HSOMETHING hSomething) {
    struct RealSomething* p = (struct RealSomething*)hSomething; //先強制型別轉換成內部結構指標
    ……do something……
    return (HSOMETHINGELSE)pRealSomethingElse;//強制型別逆轉換
}

^o^  ^o^  ^o^  ^o^  ^o^  ^o^  ^o^  ^o^  ^o^  ^o^  ^o^  ^o^  ^o^  ^o^  ^o^  ^o^ 


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/10752043/viewspace-990957/,如需轉載,請註明出處,否則將追究法律責任。

相關文章