惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

B
Blog RSS Feed
Google DeepMind News
Google DeepMind News
罗磊的独立博客
Martin Fowler
Martin Fowler
博客园_首页
Stack Overflow Blog
Stack Overflow Blog
Last Week in AI
Last Week in AI
The GitHub Blog
The GitHub Blog
B
Blog
C
Check Point Blog
WordPress大学
WordPress大学
G
Google Developers Blog
CTFtime.org: upcoming CTF events
CTFtime.org: upcoming CTF events
量子位
月光博客
月光博客
U
Unit 42
Engineering at Meta
Engineering at Meta
有赞技术团队
有赞技术团队
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
大猫的无限游戏
大猫的无限游戏
博客园 - 聂微东
让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
Y
Y Combinator Blog
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
Cyber Security Advisories - MS-ISAC
Cyber Security Advisories - MS-ISAC
Vercel News
Vercel News
Application and Cybersecurity Blog
Application and Cybersecurity Blog
博客园 - 【当耐特】
cs.CV updates on arXiv.org
cs.CV updates on arXiv.org
cs.AI updates on arXiv.org
cs.AI updates on arXiv.org
Jina AI
Jina AI
S
Secure Thoughts
aimingoo的专栏
aimingoo的专栏
D
Darknet – Hacking Tools, Hacker News & Cyber Security
I
Intezer
Latest news
Latest news
V
Vulnerabilities – Threatpost
D
Docker
Attack and Defense Labs
Attack and Defense Labs
Help Net Security
Help Net Security
S
Security @ Cisco Blogs
Forbes - Security
Forbes - Security
MongoDB | Blog
MongoDB | Blog
云风的 BLOG
云风的 BLOG
L
LINUX DO - 热门话题
P
Palo Alto Networks Blog
Cloudbric
Cloudbric
Spread Privacy
Spread Privacy

博客园 - wuhang

今天看到一个好的WEB进度条,博客园果然是富饶啊,先记录下来以备后用 c#后台写javascript前端调用 动态SQL语句根据数据库列来查询数据,动态的生成列名称 asp.net的自动跳转 [转载来的]C# API 大全 [心情日記]亦夢亦幻 【转载来的】C# 2.0中P/Invoke支持的几处增强 [转载来的]P/Invoke使用Win32非托管函数2 [转载来的]P/Invoke使用Win32非托管函数3 [转载来的]P/Invoke使用Win32非托管函数1 转载来的WCF基础知识问与答 转载来的,线程的基础 转载来的线程池 转载来的WinForm多线程编程篇 还是转载的C# 插件构架实战 依旧是转载来的Thread and Sync In C# (C#中的线程与同步) 转载来的C# 2.0中P/Invoke支持的几处增强 还是转载来的P/Invoke使用Win32非托管函数 转载来的P/Invoke调用,来自MSDN
【转载来的】关于句柄的一些知识
wuhang · 2008-06-03 · via 博客园 - wuhang

句柄的本质  
  一、书上定义:  
   
  <<Microsoft   Windows   3   Developer''s   Workshop>>(Microsoft   Press,by   Richard   Wilton)  

 在Windows环境中,句柄是用来标识项目的,这些项目包括:模块(module)、任务(task)、实例   (instance)、文件(file)、内存块(block   of   memory)、菜单(menu)、控制(control)、 字体(font)、资源(resource),包括图标(icon),光标   (cursor),字符串(string)等、GDI对象(GDI   object),包括位图(bitmap),画刷(brush),元文件(metafile),调色板(palette),画笔(pen),区域   (region),以及设备描述表(device   context)。  
   

  <<WINDOWS编程短平快>>(南京大学出版社):  
          句柄是WONDOWS用来标识被应用程序所建立或使用的对象的唯一整数,WINDOWS使用各种各样的句柄标识诸如应用程序实例,窗口,控制,位图,GDI对象等等。WINDOWS句柄有点象C语言中的文件句柄。  
   
  二、MFC源代码:  
   
  #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  
   
  DECLARE_HANDLE(HMODULE);  
  DECLARE_HANDLE(HINSTANCE);  
  DECLARE_HANDLE(HLOCAL);  
  DECLARE_HANDLE(HGLOBAL);  
  DECLARE_HANDLE(HDC);  
  DECLARE_HANDLE(HRGN);  
  DECLARE_HANDLE(HWND);  
  DECLARE_HANDLE(HMENU);  
  DECLARE_HANDLE(HACCEL);  
  DECLARE_HANDLE(HTASK);  
   
   
  三、理解:  
          HANDLE就是PVOID,也就是无类型指针,  
          上面这些资源的句柄Handles都不过是指向struct的指针,至于这个struct的用处,连M$都说unused了,现在解释下M$这么做的意 义,这就是所谓数据封装,你可以在你的程序中把M$的内部结构指针传来传去,可是你却不知道它到底指向的内容是什么。  
   
          句柄与指针确实是完全不同的两个概念。句柄仅仅是一个32位整数,WIN32中用于标记某个系统或进程的对象,可以理解为对象索引(由于M$未完全公开相 关技术,在一定程度上只能如此理解),这个索引更像是一种映射关系(从句柄到对象指针的映射),而不是纯粹意义上的“数组下标”。  
   
   
            句柄可以理解为用于指向或标识内存的一块“资源”,这些资源如:文件(file)、内存块(block   of   memory)、菜单(menu)等等。操作系统通过句柄来定位核心对象和系统资源。  
          指针即为指向内存的“数据或指令”某一单元。  

 说的确切一点,句柄实际上是一种指向某种资源的指针,但与指针又有所不同:指针对应着一个数据在内存中的地址,得到了指针就可以自由地修改该数据。Windows并不希望一般程序修改其内部数据结构,因为这样太不安全。所以Windows给每个使用GlobalAlloc等函数声明的内存区域指定一个句柄(本质上仍是一个指针,但不要直接操作它),平时你只是在调用API函数时利用这个句柄来说明要操作哪段内存。  
   
           

  四、引喻:  
        牧童遥指杏花村  
        牧童的手为指针,杏花村的牌子为句柄,杏花村酒店为对象的实例.  
   
   
  附注:获得窗口句柄三种方法  
   
  1.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)