討論區快速選單
知識庫快速選單
軟體開發過程中有哪些資安漏洞? 網路投保旅行平安險 網路投保旅行平安險
[ 回上頁 ] [ 討論區發言規則 ]
程式設計中handle是什麼意思
更改我的閱讀文章字型大小
作者 : tzupingkao(高肥) 人氣指數超過10000點
[ 貼文 32 | 人氣 12219 | 評價 0 | 評價/貼文 0 | 送出評價 24 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2006/7/6 下午 07:10:58
常常在程式設計中看到handle這個字,但一直不了解其意義所在。
另外若硬要把handle翻成中文,應該稱做什麼?
作者 : shing819(Clier) VC++曠世奇才貼文超過1000則人氣指數超過30000點
[ 貼文 1740 | 人氣 40353 | 評價 8630 | 評價/貼文 4.96 | 送出評價 84 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
主題發起人tzupingkao註記此篇回應為最佳解答 2006/7/6 下午 09:46:56

>常常在程式設計中看到handle這個字,但一直不了解其意義所在。
>另外若硬要把handle翻成中文,應該稱做什麼?

Handle:
用來控制裝置(DC),視窗,檔案,對話方塊......,以一組數字表示.


大陸叫句柄,不容易望文生義.如果我翻譯會叫把手,雖然有點怪,
但比大陸翻譯好一點,基本上還是不要翻.


作者 : freelife(曉)
[ 貼文 162 | 人氣 277 | 評價 840 | 評價/貼文 5.19 | 送出評價 26 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
主題發起人tzupingkao註記此篇回應為最佳解答 2006/7/7 上午 09:51:15
個人習慣用......"代號" ...... =="

不知道大陸人為什麼翻成"句柄"呢? @@
作者 : crazystar(CrazyStar) C++ Builder優秀好手貼文超過200則人氣指數超過10000點
[ 貼文 449 | 人氣 17326 | 評價 2270 | 評價/貼文 5.06 | 送出評價 89 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
主題發起人tzupingkao註記此篇回應為最佳解答 2006/7/7 下午 01:51:51
我看過一些code, 它們常常這樣用:

typedef struct // <-- 某個自訂型別的 struct.
{
    int a;
    char b;
    ...
} MyStruct;

void ABC(HWND Handle) // <--- 傳進來的參數是一個 handle
{
    int a = (Mystruct *)Handle->a; // <--- 將 handle 轉型成 Mystruct
    ...
}

我一直很好奇,
1. 一般什麼時候要用 handle?
2. 所有的東西都可以是 handle 嗎? 若是的話, 那handle 跟其他資料型態的關係?
3. 以上面那個我讀code 常常見到的例子來說, 既然要轉成 struct, 那宣告成 "輸入參數是 MyStruct" 就好了, 幹嘛要用 handle?

(不好意思, 因為我常用的是BCB, 而BCB 的常見用法裡面比較沒有用到 handle. 所以也因此有些類似的相關疑問. 反之, 好像VC++ 方面的書, 就常常動不動就會看到 handle 呢.)

我的心得是:
從上面的例子看來, handle 其實只是一個數字, 而這個數字正好是個 address.
也就是說, 某個變數 abc 的address 是 0x1234, 則 0x1234 就是變數 abc 的 handle 了

這個說法對吧?

所以, "給你杯子的把手, 你就可以去拿它了."
(Give you the handle of a variable, then you can access it's content.)
難怪要叫做 handle (把手)?!

後記:
一開始舉的例子, 也許輸入參數要宣告成什麼, 可以因人, 因地, 因情況而定. 反正可以解問題就可以了. 但我還是很好奇. 因為麼VC 動不動就是用 handle 的方式來解決問題, 但BCB 就很少這樣用呢...

(有錯誤請指教, 謝謝!)
作者 : cog(Cog) VC++卓越專家C++優秀好手貼文超過200則
[ 貼文 458 | 人氣 12 | 評價 3390 | 評價/貼文 7.4 | 送出評價 0 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
主題發起人tzupingkao註記此篇回應為最佳解答 2006/7/7 下午 02:08:06
>我的心得是:
>從上面的例子看來, handle 其實只是一個數字, 而這個數字正好是個 address.
>也就是說, 某個變數 abc 的address 是 0x1234, 則 0x1234 就是變數 abc 的 handle 了

handle是一個數字,而這個數字不是說"一定",但"經常"是個address,若abc的address是0x1234,則吾人可以用0x1234常作是變數abc的handle,傳遞給外部的程式,作部程式要對abc做操作時,只能以handle的方式傳給吾人提供的程式作操作,而不能以abc的address直接對abc做操作。

也就是說,外部不能也不需要知道handle實際上所代表的abc的結構什麼樣子,handle可以用來代表任何東西,甚至根本就不是一個物件或結構。

handle只是一個代碼、識別值,只有吾人自己的程式可以知道怎麼使用handle。
作者 : cog(Cog) VC++卓越專家C++優秀好手貼文超過200則
[ 貼文 458 | 人氣 12 | 評價 3390 | 評價/貼文 7.4 | 送出評價 0 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
主題發起人tzupingkao註記此篇回應為最佳解答 2006/7/7 下午 02:19:09
>後記:
>一開始舉的例子, 也許輸入參數要宣告成什麼, 可以因人, 因地, 因情況而定. 反正可以解問題就可以了. 但我還是很好奇. 因為麼VC 動不動就是用 handle 的方式來解決問題, 但BCB 就很少這樣用呢...

我想VC給用handle,是因為基本上windows上所有的資源都是用handle的方式傳遞,我是沒用過BCB啦,但你應該也會在上面看到HWND這樣的東西吧?

視窗的代碼。讓你可以透過API + handle操作視窗系統上的所有視窗,但你又不用知道視窗實際在記譩體中是如何存在的。

基本上我認為如果程式都是自己寫、自己用,是沒有什麼理由特別加上個handle字眼的。
作者 : kenycchen(小城) 人氣指數超過10000點
[ 貼文 104 | 人氣 24588 | 評價 400 | 評價/貼文 3.85 | 送出評價 11 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
主題發起人tzupingkao註記此篇回應為最佳解答 2006/7/7 下午 02:53:50
windows 為了保護系統資源 , 因此不希望 user 直接存取系統資源 . windows 所傳回的 handle , 可以把它當作為用來提取系統資源的索引值 , 系統會利用該 handle 取得正確的系統資源 .
作者 : allen123(Allen)
[ 貼文 107 | 人氣 0 | 評價 730 | 評價/貼文 6.82 | 送出評價 0 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
主題發起人tzupingkao註記此篇回應為最佳解答 2006/7/7 下午 03:49:20
這樣說好了, Handle也不是少用, 而被VCL封裝掉了, 如果不是直接和WindowAPI或是Message打交道, 幾乎不會直接使用它, 而Handle本身是個正整數(0..2^32-1)值
作者 : mizar(Mizar) VC++優秀好手貼文超過200則
[ 貼文 249 | 人氣 133 | 評價 1240 | 評價/貼文 4.98 | 送出評價 17 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
主題發起人tzupingkao註記此篇回應為最佳解答 2006/7/10 上午 10:55:11
HANDLE是指向指標的指摽,在需要配置資源的function中,你傳pointer進去是不行的。

......
int* pn = null;
fun1(pn);
......

void fun1(int* pn)
{
    pn = new int;
   *pn = 1;
   return;
}
上面的方式是行不通的,有興趣可以自己實驗一下,想想箇中緣由。
你必須宣告個指向指標的指標,才能順利的把在fun1中配置好的指標傳回來。
......
int **hn = NULL;
hn = new int*;
*hn = NULL;
fun2(hn);
......

void fun2(int** hn)
{
   if(*hn==NULL) {
     *hn = new int;
     **hn = 1;
   }
}

而在Windows中,一律把**定義為HANDLE。
作者 : mizar(Mizar) VC++優秀好手貼文超過200則
[ 貼文 249 | 人氣 133 | 評價 1240 | 評價/貼文 4.98 | 送出評價 17 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
主題發起人tzupingkao註記此篇回應為最佳解答 2006/7/10 上午 11:11:38
使用fun2也可以簡單易點,如下:
......
   int *pn = NULL;
   fun2(&pn);
......

這也就是為什麼很多function需要傳入HANDLE,而非pointer了。
 板主 : 青衫 , Raymond
 > Visual C++ - 討論區
 - 最近熱門問答精華集
 - 全部歷史問答精華集
 - Visual C++ - 知識庫
  ■ 全站最新Post列表
  ■ 我的文章收藏
  ■ 我最愛的作者
  ■ 全站文章收藏排行榜
  ■ 全站最愛作者排行榜
  ■  月熱門主題
  ■  季熱門主題
  ■  熱門主題Top 20
  ■  本區Post排行榜
  ■  本區評價排行榜
  ■  全站專家名人榜
  ■  全站Post排行榜
  ■  全站評價排行榜
  ■  全站人氣排行榜
 請輸入關鍵字 
  開始搜尋
 
Top 10
評價排行
Visual C++
1 青衫 11070 
2 Raymond 10090 
3 Clier 7630 
4 小約翰 2500 
5 Cog 2030 
6 coco 1870 
7 aming 1410 
8 牧童哥 1400 
9 r2109 1380 
10 Akira 1350 
Visual C++
  專家等級 評價  
  一代宗師 10000  
  曠世奇才 5000  
  頂尖高手 3000  
  卓越專家 1500  
  優秀好手 750  
Microsoft Internet Explorer 6.0. Screen 1024x768 pixel. High Color (16 bit).
2000-2019 程式設計俱樂部 http://www.programmer-club.com.tw/
0.15625