控制代碼與指標的區別 一

2021-06-02 02:40:45 字數 3702 閱讀 3275

控制代碼其實就是指標,但是他和指標最大的不同是:給你乙個指標,你可以通過這個指標做任何事情,也許是好事,也許是通過這個指標破壞記憶體,幹一些搗亂的事情。這個我想大家都會碰到過,因為亂用指標導致程式崩潰

控制代碼就沒有這個缺點,通過控制代碼,你只能幹一些windows讓你幹的事情(呼叫一些api函式等等),沒有了指標的壞處。

控制代碼是一些表的索引也就是指向指標的指標,控制代碼和指標都是位址,控制代碼是windows程式設計的乙個關鍵性的概念,編寫windows應用程式總是要和各種控制代碼打交道。

所謂控制代碼,就是乙個唯一的數,用以標識許多不同的物件型別,如視窗、選單、記憶體、畫筆、畫刷等。在win32裡,控制代碼是指向乙個「無型別物件」(void*)的指標,也就是乙個4位元組長的資料。

無論它的本質是什麼,控制代碼並不是乙個真正意義上的指標。從構造上看,控制代碼是乙個指標,儘管它沒有指向用於儲存某個物件的記憶體位置。事實上,控制代碼指向乙個包含了對該物件進行的引用的位置。

控制代碼的宣告是這樣的:

typedef void *handle

由於windows是乙個多工作業系統,它可以同時執行多個程式或乙個程式的多個副本。這些執行的程式稱為乙個例項。為了對同一程式的多個副本進行管 理,windows引入了例項控制代碼。windows為每個應用程式建立一張表,例項控制代碼就好象是這張表的乙個索引。

不同在於:

1、控制代碼所指的可以是乙個很複雜的結構,並且很有可以是與系統有關的,比如說上面所說的執行緒的控制代碼,它指向的就是乙個類或者結構,他和系統有很密切的關 系,當乙個執行緒由於不可預料的原因,而終止時在系統就可以回它所占用的資料,如cpu,記憶體等等,反過來想可以知道,這個控制代碼中的某一些項,是與系統進行 互動的。由於windows系統,是乙個多工的系統,它隨時都可能要分配記憶體,**記憶體,重組記憶體。

2、指標它也可以指向乙個複雜的結構,但是通常是使用者定義的,所以的必需的工作都要使用者完成,特別是在刪除的時候。但在vc++6.0中也有一些指標,它 們都是處理一些小問題才用的,如最常見的字元的指標,它也是要使用者處理的如果你動態分配了記憶體;但是cstring 就不要使用者處理了,它其實是vc++中的乙個類,所以的操作都由成員函式完成,產生(分配)由建構函式,刪除(**)由析構函式完成。

獲得視窗控制代碼三種方法

.hwnd findwindow(lpctstr lpclassname, lpctstr lpwindowname)

hwnd findwindowex(hwnd hwndparent, hwnd hwndchildafter,lpctstr lpclassname, lpctstr lpwindowname)

2.hwnd windowfrompoint(point& point)//獲得當前滑鼠游標位置的視窗hwnd

3.bool callback enumchildproc(hwnd hwnd,lparam lparam)

bool callback enumchildwindows(hwnd hwndparent, wndenumproc lpenumfunc,lparam lparam)

bool callback enumwindows(wndenumproc lpenumfunc, lparam lparam)

bool callback enumwindowsproc(hwnd hwnd, lparam lparam)

指標 控制代碼之間的轉換

a.由指標獲得控制代碼

cwnd * pwnd;

cwnd hwnd;

hwnd = pwnd->getsafehwnd();

b.由控制代碼得到指標:

cwnd* pwnd=fromehandle(hmyhandle);

pwnd->setwindowtext("hello world!");

or cwnd* pwnd; pwnd->attach(hmyhandle);

mfc類中有的還提供了標準方法,比如window 控制代碼:

static cwnd* pascal fromhandle( hwnd hwnd );

hwnd getsafehwnd( ) const;

對於位圖:

static cbitmap* pascal fromhandle( hbitmap hbitmap );

static cgdiobject* pascal fromhandle( hgdiobj hobject );

hgdiobj getsafehandle( ) const;

有人說句並就是乙個標示,乙個id號,是錯誤的。乙個id號可以包括多個資源,比如說單文件中的idr_mainframe,一般是指在硬碟上的資源。但 是當把硬碟上的資源調入記憶體以後,將有乙個控制代碼指向它,但是控制代碼只能指向乙個資源。而且控制代碼知道所指的記憶體有多大。還有指標,指標指向位址,它不知道分配 的記憶體有多大。

但是如果你定義乙個控制代碼,然後在vc裡面右擊滑鼠,選擇"go to definition of handle,你會發現它的本質就是乙個指標,但是它的作用不同於指標。

控制代碼是個指標,指向一塊記憶體,但至於這塊記憶體跟控制代碼所標識的物件是怎麼聯絡起來的,呼叫者不需要清楚,呼叫者只需要知道,這個控制代碼聯絡著乙個win32物件。

控制代碼是實體地址,可以跨程序傳遞,例如,handle ha程序a的乙個視窗,你可以在程序b中利用乙個跟ha相等的值(相等就是說它們強制轉成int32的值相等)初始化乙個控制代碼,利用這個控制代碼你可以對程序 a的那個物件進行操作,例如movewindow,showwindow等。

控制代碼包含了一些引用計數之類的東西,所以我的上一點說的給控制代碼賦值是不安全的,windows api提供了一些函式,可以對控制代碼進行操作。

控制代碼就是受限的指標。

它是由作業系統管理的,你不能通過它訪問作業系統建立的資料結構。

作業系統在建立乙個物件(如gdi, file)等的時候,它會為這個物件context保留一塊資料結構,然後把它放在一張全域性表中。。控制代碼就是這塊資料結構在表中的索引

csdn上有人說過:牧童遙指杏花村。

牧童的手為指標,杏花村的牌子為控制代碼,杏花村酒店為物件的例項.

控制代碼就是烤叉,用烤爐烤過鴨,雞,牛,羊,狗麼?

爐子裡的東西是看不見,摸不到的,但你能用叉子去控制,至於叉子上的是什麼,你放進去前應該記住。呵呵

控制代碼有時是指標,有時是索引,但他絕對是一把鑰匙,核心控制代碼110的鑰匙,gdi控制代碼是您的鑰匙,只對您有效。

單從概念上講,控制代碼指乙個物件的標識,而指標是乙個物件的首位址。從實際處理的角度講,即可以把控制代碼定義為指標,又可以把它定義為同類物件陣列的索引,這 兩種處理方法都有優缺點,至於選用哪種方式,完全應該看實際需要,這可以說是一種程式設計上的技巧。那種單純認為控制代碼是指標或索引的想法都是機械的、不確 切的。其實,在windows中類似的處理是很多的、很靈活的。再具個相似的例子:

我們知道,在windows中有個函式叫做callwindowproc。

故名思義,它的作用就是向指定的視窗過程傳遞乙個訊息。你也許會想,既然我已經有了視窗過程的指標,為什麼我不可以直接通過這個指標呼叫該函式(這是c語 言的內建功能)?事實上,在win16中確實可以這麼做,因為getwindowlong返回的確實是該函式的指標。但在win32 下,getwindowlong返回的並不是該函式的指標,而是乙個包含函式指標的資料結構的指標(msdn上說返回的是乙個視窗函式位址或它的控制代碼,就 是指的這種情況)。該資料結構是可變的,但只要你使用callwindowproc來呼叫的話是不會出錯的。這裡我們又看到使用控制代碼處理帶來的好處。(補 充說明一點:微軟在這裡之所以這麼處理,是為了解決16位/32位以及ansi/unicode的轉化問題)

看來,控制代碼很多時候是乙個用於描述和標記乙個資源的資料結構的指標,而不是資源本身的指標,控制代碼中可能包含資源的指標,但是根多時候不僅僅是這樣。

指標與控制代碼的區別

指標與控制代碼的區別 1 什麼是控制代碼?控制代碼在windows程式設計中是乙個很重要的概念,在很多程式中都扮演者重要的角色。在windows環境中,控制代碼是用來標識專案的,這些專案包括 模組,任務,例項,檔案,記憶體塊,選單,控制,字型,資源 包括圖示,游標,字串等 gdi物件 包括位圖,畫刷...

控制代碼與指標的區別

控制代碼實際上是一種指向某種資源的指標,但與指標又有所不同 指標對應著乙個資料在記憶體中的位址,得到了指標就可以自由地修改該資料。windows並不希望一般程式修改其內部資料結構,因為這樣太不安全。所以windows給每個使用globalalloc等函式宣告的記憶體區域指定乙個控制代碼 本質上仍是乙...

指標與控制代碼的區別

最近兩天在複習一些c 的知識,中間發現了許多以前沒有注意過的問題。關於控制代碼以前總是將其理解為指標,其實不然,他們之間有著明顯的區別。首先,指標指向系統中物理記憶體的位址,而控制代碼是windows在記憶體中維護的乙個物件記憶體實體地址列表的整數索引,控制代碼是一種指向指標的指標。在windows...