Delphi学习笔记一

 声明:
GetDesktopWindow: HWND; {无参数; 返回桌面窗口的句柄}

举例:

var
  h: HWND;
begin
  h := GetDesktopWindow;
  ShowMessage(IntToStr(h));
end;
Application.MainForm句柄


--------------------------------------------------------------------------------
声明:

GetCurrentThread: THandle; {返回当前线程的虚拟句柄}
GetCurrentThreadId: DWORD; {返回当前线程 ID}
GetCurrentProcess: THandle; {返回当前进程的虚拟句柄}
GetCurrentProcessId: DWORD; {返回当前进程 ID}


提示:
ID 是系统唯一的标识.
所谓虚拟句柄, 就是该句柄只在调用进程的进程中有效, 也不能被继承;
如果用于其他进程需要用 DuplicateHandle 复制句柄;
GetCurrentProcess 返回的虚拟句柄,可以通过 OpenProcess 创建一个真实的句柄.

        在系统中,对象分两类:核心对象和用户对象.如进程对象,线程对象,文件映射对象等就是核心对象;而像窗口,菜单等都是用户对象. 两者是有差别的,用于标示用户对象的句柄是系统唯一的,也就是说,一个进程完全可以对另外一个进程中的用户对象进行操作,比如两个进程间通信的方法之一, 就是发送消息.正是由于窗口是用户对象,所以句柄是系统唯一,通过FindWindow(), 得到另外一个进程的窗口句柄,然后用SendMessage(),让hWnd的窗口过程来处理消息,实现了进程间的通信.因此,对于用户对象,你根本不用DuplicateHandle(),直接把句柄拿来用就行了. 而核心对象则不一样.核心对象是为了加强系统的稳定性,因此,核心对象句柄是进程相关的,在每一个进程中都有一个核心对象表,每一个对象的索引(不完全是)作为内核对象的句柄,从而实现进程相关.同一个对象在不同的进程中可能有不同的索引,即句柄.对核心对象进行操作时,系统还要进行安全检验,看一下你是否有权来操作这个对象.因此你不能同用户对象一样,直接把句柄拿过来用.比方说,你想操作另一个进程中的文件映射对象,这个文件映射对象句柄在那个进程中假设是0x000001,但在你的进程中,很有可能0x00000001时表示另一个核心对象,此时的操作就永远不会成功,甚至会产生灾难性的后果.此时,就有必要用DuplicateHandle().

核心对象(内核对象)详解: 

1:什么是内核对象?
    内核对象是一组可以被内核创建、识别和操作的数据结构的总称。我的理解是操作系统为了管理资源而定义和实现的一组内部数据,这些数据只能被内核创建和修改。而用户层是无法看到他们的真正内容或者对他们直接进行操作的。我们的用户程序只能通过windows提供的一些api来获得这些内核对象的句柄,从而通过windows本身提供的其他api来间接访问和修改内核对象本身。这就好比windows为内核对象的操作提供了一个类似c++的封装。而一个内核对象的句柄与一个内核对象之间存在着一种间接的引用关系。
    内核对象的生命周期是由内核来管理的,用户层的程序只能通过增删引用计数来提醒内核,某个内核对象的使用数为0或者其他,内核一旦发现某个内核对象的使用计数为0时才真正删除这个对象。
    内核对象有一个重要的特性是安全访问机制,在创建一个内核对象的时候,可以指定该对象的访问权限。凡是在创建的时候可以指定一个SECURITY_ATTRIBUTES的对象都是一个内核对象。这可以用来区分普通的gdi对象。

如:

HANDLE CreateFileMapping(
HANDLE hFile,                       //物理文件句柄
LPSECURITY_ATTRIBUTES lpAttributes, //安全设置-----------------------------表明文件映射对象是内核对象
DWORD flProtect,                    //保护设置
DWORD dwMaximumSizeHigh,            //高位文件大小
DWORD dwMaximumSizeLow,             //低位文件大小
LPCTSTR lpName                      //共享内存名称
);

2:内核对象的使用
   每个进程都有可能创建或者打开若干内核对象,但是前面说过,用户无法获得真正的内核对象的内容,只能通过windows提供的api来创建和访问内核对象。具体表现为一个内核对象句柄(HANDLE)。windows为每个进程都创建一个内核对象句柄表。不同的进程的内核对象句柄表是互相独立的。windows提供的操作内核对象的api需要根据这个句柄表来进一步完成其任务。一般的内核对象句柄的值为真正内核对象在这个句柄表中的索引。windows的api根据句柄表和索引可以找到指向真正的内核对象的指针,及其访问权限和继承标志等信息。而这一切对于用户都是不可见的。不过将来句柄的值也许就不是索引,而是另外一种方式了,这里windows做了一个抽象,只要记住一个内核对象句柄与其真正的内核对象之间存在着某种引用关系
   在每个进程中都一个内核句柄表,这也就说明同一个内核对象其在不同的进程中其内核句柄值可能是不一样的。但是内核对象的作用很大程度上就在于能够在进程之间共同访问。这就需要提供一种跨越进程间的共享机制。目前有3种方法可以在进程间共享内核对象:
       1:利用对象句柄的继承性;
            前面说过每个进程有一个独立的句柄表,当该进程创建子进程的时候,可以指定子进程是否能继承其句柄表中的可继承句柄。如果子进程继承了父进程的对象句柄表,那么意味着同样的句柄值在两个进程中都是可以访问的。关于句柄是否可继承的需要在创建内核对象的时候指定其可继承性。如果将一个不可继承的句柄值传递给子进程使用,子进程的句柄表中并没有这个句柄值的索引,就会发生错误。
       2:利用对象的可命名性;
            在创建内核对象的时候可以给其指定一个全局的名字。其他进程中则可以通过这个名字获得这个内核对象的句柄。
       3:利用windows提供的转换机制;
            windows本身提供了将一个进程的内核对象句柄表中一个句柄拷贝到另一个进程的内核对象句柄表中的机制,利用他可以在进程间共享内核对象。

 

众所周知,Windows编程最基础的还是对资源的利用、控制操作,资源是一个比较具体的东西,比如CPU、内存等等。那么怎么来对资源进行操作呢,我们通常是通

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值