?? vc編程基礎——句柄篇.htm
字號:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<!-- saved from url=(0052)http://www.pcvc.net/relevance/b_detail.asp?sendid=25 -->
<HTML><HEAD><TITLE>VC編程基礎——句柄篇</TITLE>
<META content="text/html; charset=gb2312" http-equiv=Content-Type><LINK
href="VC編程基礎——句柄篇.files/esb.css" rel=stylesheet>
<META content="MSHTML 5.00.3502.5390" name=GENERATOR></HEAD>
<BODY>
<DIV align=center>
<CENTER>
<TABLE border=1 borderColorDark=#ffffff borderColorLight=#000000 cellPadding=0
cellSpacing=0 height=218 width=710>
<TBODY>
<TR>
<TD bgColor=#d0d0d0 height=20>
<P align=center><FONT size=2><B>欄目</B>:VC大本營--相關資料(SDK) |
<B>加入日期</B>:2001-9-10 18:22:29 | <B>閱讀次數</B>:10818</FONT> </P></TD></TR>
<TR>
<TD height=20>
<P align=right><FONT size=2><A
href="javascript:self.close()">關閉窗口</A> </FONT></P></TD></TR>
<TR>
<TD height=20>
<P align=center><B>VC編程基礎——句柄篇</B></P></TD></TR>
<TR>
<TD height=95 width=750>
<P align=left><FONT
size=2><BR><B> 作者</B>:賈旭濱 <B>來自</B>:重慶大學光電工程學院</FONT>
</P>
<BLOCKQUOTE> 句柄概念在WINDOWS編程中是一個很重要的概念,在許多地方都扮演著重要的角色。但由此而產生的句柄概念也大同小異,比如:</FONT><BR> <<Microsoft Windows 3 Developer's Workshop>>(Microsoft Press,by Richard Wilton)一書中句柄的概念是:在Windows環境中,句柄是用來標識項目的,這些項目包括:</FONT><BR> *.模塊(module)</FONT><BR> *.任務(task)</FONT><BR> *.實例(instance)</FONT><BR> *.文件(file)</FONT><BR> *.內存塊(block of memory)</FONT><BR> *.菜單(menu)</FONT><BR> *.控制(control)</FONT><BR> *.字體(font)</FONT><BR> *.資源(resource),包括圖標(icon),光標(cursor),字符串(string)等</FONT><BR> *.GDI對象(GDI object),包括位圖(bitmap),畫刷(brush),元文件(metafile),調色板(palette),畫筆(pen),區域(region),以及設備描述表(device context)。</FONT><BR></FONT><BR> WINDOWS程序中并不是用物理地址來標識一個內存塊,文件,任務或動態裝入模塊的,相反的,WINDOWS API給這些項目分配確定的句柄,并將句柄返回給應用程序,然后通過句柄來進行操作。</FONT><BR></FONT><BR> 在<<WINDOWS編程短平快>>(南京大學出版社)一書中是這么說的:句柄是WONDOWS用來標識被應用程序所建立或使用的對象的唯一整數,WINDOWS使用各種各樣的句柄標識諸如應用程序實例,窗口,控制,位圖,GDI對象等等。WINDOWS句柄有點象C語言中的文件句柄。</FONT><BR></FONT><BR> 從上面的2個定義中的我們可以看到,句柄是一個標識符,是拿來標識對象或者項目的,它就象我們的姓名一樣,每個人都會有一個,不同的人的姓名不一樣,但是,也可能有一個名字和你一樣的人。從數據類型上來看它只是一個16位的無符號整數。應用程序幾乎總是通過調用一個WINDOWS函數來獲得一個句柄,之后其他的WINDOWS函數就可以使用該句柄,以引用相應的對象。在WINDOWS編程中會用到大量的句柄,比如:HINSTANCE(實例句柄),HBITMAP(位圖句柄),HDC(設備描述表句柄),HICON(圖標句柄)等等,這當中還有一個通用的句柄,就是HANDLE,比如下面的語句:</FONT><BR></FONT><BR> HINSTANCE hInstance;</FONT><BR></FONT><BR>可以改成:</FONT><BR></FONT><BR> HANDLE hInstance;</FONT><BR></FONT><BR> 上面的2句語句都是對的。</FONT><BR></FONT><BR> 一個WINDOWS應用程序可以用不同的方法獲得一個特定項的句柄。許多API函數,諸如CreateWindow,GlobalAlloc,OpenFile的返回值都是一個句柄值。另外,WINDOWS也能通過應用程序的引出函數將一個句柄作為參數傳送給應用程序,應用程序一旦獲得了一個確定項的句柄,便可在WINDOWS環境下的任何地方對這個句柄進行操作。其實句柄的大量使用已經影響到了每一個WINDOWS的程序設計。</FONT><BR></FONT><BR> 句柄只有當唯一的確定了一個項目的時候,它才開始有意義。句柄對應著項目表中的一項,而只有WINDOWS本身才能直接存取這個表,應用程序只能通過API函數來處理不同的句柄,舉個例子來說吧!比如:我們可以為我們的應用程序申請一塊內存塊,通過調用API函數GlobalAlloc,來返回一個句柄值:</FONT><BR></FONT><BR> hMem=GlobalAlloc(......);</FONT><BR></FONT><BR> 其實現在hMem的值只是一個索引值,不是物理地址,應用程序還不能直接存取這塊內存。這兒還有一個話外題,就是,一般情況下我們在編程的時候,給應用程序分配的內存都是可以移動的或者是可以丟棄的,這樣能使有限的內存資源充分利用,所以,在某一個時候我們分配的那塊內存的地址是不確定的,因為他是可以移動的,所以得先鎖定那塊內存塊,這兒應用程序需要調用API函數GlobalLock函數來鎖定句柄。如下:</FONT><BR></FONT><BR> lpMem=GlobalLock(hMem);</FONT><BR></FONT><BR>這樣應用程序才能存取這塊內存。</FONT><BR></FONT><BR> 我想現在大家已經能對句柄概念有所了解了,我希望我的文章能對大家有所幫助。其實如果你學過SDK編程,那對句柄的概念理解會更好,更深。如果你是直接學VC6的MFC編程的,建議你看一下SDK編程,這會對你大有好處。
</BLOCKQUOTE></TD>
<BLOCKQUOTE></BLOCKQUOTE></TD></TR></TBODY></TABLE></CENTER></DIV></BODY></HTML>
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -