<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>句柄 _ 扒房网</title>
	<atom:link href="https://www.gxjlyf.com/tag/17303/feed" rel="self" type="application/rss+xml" />
	<link>https://www.gxjlyf.com</link>
	<description>手机系统教程_手机软件教程_手机app使用教程_电脑软件教程_电脑系统教程</description>
	<lastBuildDate>Mon, 05 Dec 2022 05:57:11 +0000</lastBuildDate>
	<language>zh-Hans</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	
	<item>
		<title>今天说说Win7玩英雄联盟出现句柄无效怎么解决</title>
		<link>https://www.gxjlyf.com/896012.html</link>
		
		<dc:creator><![CDATA[bafang18]]></dc:creator>
		<pubDate>Mon, 05 Dec 2022 05:57:11 +0000</pubDate>
				<category><![CDATA[PC教程]]></category>
		<category><![CDATA[句柄]]></category>
		<category><![CDATA[对象]]></category>
		<guid isPermaLink="false">https://www.chuwenyu.com/896012.html</guid>

					<description><![CDATA[最近，有Win7系统的用户，在玩英雄联盟游戏过程中突然出现警告音；最小化游戏后还是能够看到桌面上不停的出现提示 ...]]></description>
										<content:encoded><![CDATA[<p>最近，有Win7系统的用户，在玩英雄联盟游戏过程中突然出现警告音；最小化游戏后还是能够看到桌面上不停的出现提示句柄无效，也无法正常关机，最后只能强制关机。重启后用杀毒软件杀毒，杀毒完后并没发现有病毒。然后继续玩，又出现一样的问题，怎么办？那要如何彻底解决这样的问题呢？现在小编就和大家说一下Win7玩英雄联盟出现句柄无效的解决方法。</p>
<p><img decoding="async" alt="Win7玩英雄联盟出现句柄无效怎么解决？" src="https://dz.cwhello.com/wp-content/uploads/2022/12/20221205055710-638d88365d868.jpg" /></p>
<p><strong>步骤如下：</strong></p>
<p>处理方法：此警告音是否由于安装了第三方软件后提示的，如果是建议卸载掉不要使用，或查看是不是游戏本身遇到了问题，可以卸载重新下载安装。</p>
<p>系统不能加载用户配置， 但能加载默认配置。</p>
<p>&ldquo;句柄无效&rdquo;通常是编程的错误，但你的情况显然不可能是编程的问题，应该是丢失或更改了某些系统文件。我猜可能是你的dircetx错误，或者是丢失了某些动态连接库的DLL文件。你重新下载一个directx9.0c，安装试试。如果还不行，就重装操作系统，这样做比较省事。</p>
<p>其他对于&ldquo;句柄无效&rdquo;的相关解释：（仅供参考！）</p>
<p>所谓句柄实际上是一个数据，是一个Long （整长型）的数据。</p>
<p>句柄是WONDOWS用来标识被应用程序所建立或使用的对象的唯一整数，WINDOWS使用各种各样的句柄标识诸如应用程序实例，窗口，控制，位图，GDI对象等等。WINDOWS句柄有点象C语言中的文件句柄。</p>
<p>从上面的定义中的我们可以看到，句柄是一个标识符，是拿来标识对象或者项目的，它就象我们的姓名一样，每个人都会有一个，不同的人的姓名不一样，但是，也可能有一个名字和你一样的人。从数据类型上来看它只是一个16位的无符号整数。应用程序几乎总是通过调用一个WINDOWS函数来获得一个句柄，之后其他的WINDOWS函数就可以使用该句柄，以引用相应的对象。</p>
<p>如果想更透彻一点地认识句柄，我可以告诉大家，句柄是一种指向指针的指针。我们知道，所谓指针是一种内存地址。应用程序启动后，组成这个程序的各对象是住留在内存的。如果简单地理解，似乎我们只要获知这个内存的首地址，那么就可以随时用这个地址访问对象。但是，如果您真的这样认为，那么您就大错特错了。我们知道，Windows是一个以虚拟内存为基础的操作系统。在这种系统环境下，Windows内存管理器经常在内存中来回移动对象，依此来满足各种应用程序的内存需要。对象被移动意味着它的地址变化了。如果地址总是如此变化，我们该到哪里去找该对象呢？</p>
<p>为了解决这个问题，Windows操作系统为各应用程序腾出一些内存储地址，用来专门登记各应用对象在内存中的地址变化，而这个地址（存储单元的位置）本身是不变的。Windows内存管理器在移动对象在内存中的位置后，把对象新的地址告知这个句柄地址来保存。这样我们只需记住这个句柄地址就可以间接地知道对象具体在内存中的哪个位置。这个地址是在对象装载（Load）时由系统分配给的，当系统卸载时（Unload）又释放给系统。</p>
<p>句柄地址（稳定）&rarr;记载着对象在内存中的地址&mdash;&mdash;&mdash;&mdash;&rarr;对象在内存中的地址（不稳定）&rarr;实际对象</p>
<p>本质：WINDOWS程序中并不是用物理地址来标识一个内存块，文件，任务或动态装入模块的，相反的，WINDOWS API给这些项目分配确定的句柄，并将句柄返回给应用程序，然后通过句柄来进行操作。</p>
<p>但是必须注意的是程序每次从新启动，系统不能保证分配给这个程序的句柄还是原来的那个句柄，而且绝大多数情况的确不一样的。假如我们把进入电影院看电影看成是一个应用程序的启动运行，那么系统给应用程序分配的句柄总是不一样，这和每次电影院售给我们的门票总是不同的一个座位是一样的道理。</p>
<p>Win7玩英雄联盟出现句柄无效的解决方法就给各位详细介绍到这里了。如你在玩游戏的时候也有遇到只要的问题的，不妨请你试一下上述的方法吧！也许能够帮助解决这个麻烦的问题。有需要的用户也可以去试一下！</p>

<p><img src="https://www.gxjlyf.com/postviews/896012.png" /></p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>今天说说句柄是什么</title>
		<link>https://www.gxjlyf.com/883113.html</link>
		
		<dc:creator><![CDATA[bafang18]]></dc:creator>
		<pubDate>Thu, 01 Dec 2022 07:07:48 +0000</pubDate>
				<category><![CDATA[PC教程]]></category>
		<category><![CDATA[内存]]></category>
		<category><![CDATA[句柄]]></category>
		<guid isPermaLink="false">https://www.chuwenyu.com/883113.html</guid>

					<description><![CDATA[句柄是什么？在Windows中，句柄的存在就像指针的标识一样，但这样的答案显示不是你们需要的。闲暇之余，笔者摘 ...]]></description>
										<content:encoded><![CDATA[<p>句柄是什么？在Windows中，句柄的存在就像指针的标识一样，但这样的答案显示不是你们需要的。闲暇之余，笔者摘录以下Windows句柄的解释。用户可以端着咖啡再看Windows结构体里面句柄的作用表述。</p>
<p><img decoding="async" alt="句柄是什么？Windows结构体里面句柄的作用" src="https://dz.cwhello.com/wp-content/uploads/2022/12/20221201070747-638852c355fc5.jpg" /></p>
<p>这里我列举词条中的今天说说句柄的叙述不当之处，至于如何不当先不管，继续往下看就会明白：</p>
<p><strong>句柄是什么？</strong></p>
<p>Windows 之所以要设立句柄，根本上源于内存管理机制的问题&mdash;虚拟地址，简而言之数据的地址需要变动，变动以后就需要有人来记录管理变动，（就好像户籍管理一样），因此系统用句柄来记载数据地址的变更。</p>
<p>如果想更透彻一点地认识句柄，我可以告诉大家，句柄是一种指向指针的指针。</p>
<p>通常我们说句柄是Windows用来标识被应用程序所建立或使用的对象的唯一整数。这句话是没有问题的，但是想把这句话对应到具体的内存结构上就做不到了。下面我们来详细探讨一下Windows中的句柄到底是什么。</p>
<p><strong>一、虚拟内存结构</strong></p>
<p>我们知道，CPU是通过寻址来访问内存的。32位CPU的寻址宽度是 0~0xFFFFFFFF ，计算后得到的大小是4G，也就是说可支持的物理内存最大是4G。但在实践过程中，碰到了这样的问题，程序需要使用4G内存，而可用物理内存小于4G，导致程序不得不降低内存占用。</p>
<p>为了解决此类问题，现代CPU引入了 MMU（Memory Management Unit 内存管理单元）。</p>
<p>MMU 的核心思想是利用虚拟地址替代物理地址，即CPU寻址时使用虚址，由 MMU 负责将虚址映射为物理地址。MMU的引入，解决了对物理内存的限制，对程序来说，就像自己在使用4G内存一样。</p>
<p>内存分页（Paging）是在使用MMU的基础上，提出的一种内存管理机制。它将虚拟地址和物理地址按固定大小（4K）分割成页（page）和页帧（page frame），并保证页与页帧的大小相同。这种机制，从数据结构上，保证了访问内存的高效，并使OS能支持非连续性的内存分配。在程序内存不够用时，还可以将不常用的物理内存页转移到其他存储设备上，比如磁盘，这就是大家耳熟能详的虚拟内存。</p>
<p><strong>1、虚拟地址与物理地址需要通过映射</strong>，才能使CPU正常工作。</p>
<p>而映射就需要存储映射表。在现代CPU架构中，映射关系通常被存储在物理内存上一个被称之为页表（page table）的地方。</p>
<p>如下图：</p>
<p><img decoding="async" alt="句柄是什么？Windows结构体里面句柄的作用" src="https://dz.cwhello.com/wp-content/uploads/2022/12/20221201070747-638852c368c24.jpg" /></p>
<p>从这张图中，可以清晰地看到CPU与页表，物理内存之间的交互关系。</p>
<p>进一步优化，引入TLB（Translation lookaside buffer，页表寄存器缓冲）。</p>
<p>由上一节可知，页表是被存储在内存中的。我们知道CPU通过总线访问内存，肯定慢于直接访问寄存器的。</p>
<p>为了进一步优化性能，现代CPU架构引入了TLB，用来缓存一部分经常访问的页表内容。</p>
<p>如下图：</p>
<p><img decoding="async" alt="句柄是什么？Windows结构体里面句柄的作用" src="https://dz.cwhello.com/wp-content/uploads/2022/12/20221201070747-638852c37cb44.jpg" /></p>
<p>在中间加入了TLB。</p>
<p><strong>2、为什么要支持大内存分页？</strong></p>
<p>TLB是有限的，这点毫无疑问。当超出TLB的存储极限时，就会发生 TLB miss，之后，OS就会命令CPU去访问内存上的页表。如果频繁的出现TLB miss，程序的性能会下降地很快。</p>
<p>为了让TLB可以存储更多的页地址映射关系，我们的做法是调大内存分页大小。</p>
<p>如果一个页4M，对比一个页4K，前者可以让TLB多存储1000个页地址映射关系，性能的提升是比较可观的。</p>
<p>简而言之，虚拟内存将内存逻辑地址和物理地址之间建立了一个对应表，要读写逻辑地址对应的物理内存内容，必须查询相关页表（当然现在有还有段式、段页式内存对应方式，但是从原理上来说都是一样的）找到逻辑地址对应的物理地址做相关操作。我们常见的对程序员开放的内存分配接口如malloc等分配的得到的都是逻辑地址，C指针指向的也是逻辑地址。</p>
<p>这种虚拟内存的好处是很多的，这里以连续内存分配和可移动内存为例来讲一讲。</p>
<p>首先说一说连续内存分配，我们在程序中经常需要分配一块连续的内存结构，如数组，他们可以使用指针循环读取，但是物理内存多次分配释放后实际上是破碎的，如下图</p>
<p><img decoding="async" alt="句柄是什么？Windows结构体里面句柄的作用" src="https://dz.cwhello.com/wp-content/uploads/2022/12/20221201070747-638852c38e600.jpg" /></p>
<p>图中白色为可用物理内存，黑色为被其他程序占有的内存，现在要分配一个12大小的连续内存，那么显然物理内存中是没有这么大的连续内存的，这时候通过页表对应的方式可以看到我们很容易得到逻辑地址上连续的12大小的内存。</p>
<p>再说一说可移动内存，我们使用GlobalAlloc等函数时，经常会指定GMEM_MOVABLE和GMEM_FIXED参数，很对人对这两个参数很头疼，搞不明白什么意思。</p>
<p>实际上这里的MOVABLE和FIXED都是针对的逻辑地址来说的。GMEM_MOVABLE是说允许操作系统（或者应用程序）实施对内存堆（逻辑地址）的管理，在必要时，操作系统可以移动内存块获取更大的块，或者合并一些空闲的内存块，也称&ldquo;垃圾回收&rdquo;，它可以提高内存的利用率，这里的地址都是指逻辑地址。同样以分配12大小连续的内存，在某种状态时，内存结构如下</p>
<p><img decoding="async" alt="句柄是什么？Windows结构体里面句柄的作用" src="https://dz.cwhello.com/wp-content/uploads/2022/12/20221201070747-638852c39fda4.jpg" /></p>
<p>显然这时候是无法分配12连续大小的内存，但是如果这里的逻辑地址都指明为GMEM_MOVABLE的话，操作系统这时候会对逻辑地址做管理，得到如下结果：</p>
<p><img decoding="async" alt="句柄是什么？Windows结构体里面句柄的作用" src="https://dz.cwhello.com/wp-content/uploads/2022/12/20221201070747-638852c3b17a2.jpg" /></p>
<p>这时候就实现了逻辑地址的MOVE，相对比实现物理内存的移动，这样的代价当然要小得多撒，但是聪明的小伙伴们是不是要问，这样在逻辑地址中移动了内存，那么实际访问数据不都乱套了吗，还能找到自己分配的实际物理内存数据吗，等等，不要心急，这就是等下要讲的句柄做的事情了。</p>
<p>GMEM_FIXED是说允许在物理内存中移动内存块，但是必须保证逻辑地址是不变的，在早期16位Windows操作系统不支持在物理内存中移动内存，所以禁止使用GMEM_FIXED，现在的你估计体会不到了。</p>
<p>事实上用GlobalAlloc分配内存时指定GMEM_FIXED参数返回的句柄就是指向内存分配的内存块的指针，不理解？？？接着看下面的句柄结构，你就明白了。</p>
<p><strong>二、句柄结构</strong></p>
<p>在上面讲解虚拟内存结构的过程中，我们就引出了几个问题：MOVABLE的内存访问为什么不会乱，FIXED的内存为什么说就是指向分配内存块的指针。</p>
<p>事实上我们尽管Windows没有给出源码，但是从一些头文件、MSDN和Windows早期内存分配函数中我们还是可以一窥端倪。</p>
<p>在Winnt.h头文件中做了通用句柄的定义：</p>
<p>01#ifdef STRICT02typedef void *HANDLE;03#define DECLARE_HANDLE(name) struct name##__ { int unused; }; typedef struct name##__ *name04#else05typedef PVOID HANDLE;06#define DECLARE_HANDLE(name) typedef HANDLE name07#endif08typedef HANDLE *PHANDLE;复制代码#ifdef STRICTtypedef void *HANDLE;#define DECLARE_HANDLE(name) struct name##__ { int unused; }; typedef struct name##__ *name#elsetypedef PVOID HANDLE;#define DECLARE_HANDLE(name) typedef HANDLE name#endiftypedef HANDLE *PHANDLE;</p>
<p>在Windef.h做了特殊句柄的定义：</p>
<p>01#if !defined(_MAC) || !defined(GDI_INTERNAL)02DECLARE_HANDLE(HFONT);03#endif04DECLARE_HANDLE(HICON);05#if !defined(_MAC) || !defined(WIN_INTERNAL)06DECLARE_HANDLE(HMENU);07#endif08DECLARE_HANDLE(HMETAFILE);09DECLARE_HANDLE(HINSTANCE);10typedef HINSTANCE HMODULE;      /* HMODULEs can be used in place of HINSTANCEs */11#if !defined(_MAC) || !defined(GDI_INTERNAL)12DECLARE_HANDLE(HPALETTE);13DECLARE_HANDLE(HPEN);14#endif15DECLARE_HANDLE(HRGN);16DECLARE_HANDLE(HRSRC);17DECLARE_HANDLE(HSTR);18DECLARE_HANDLE(HTASK);19DECLARE_HANDLE(HWINSTA);20DECLARE_HANDLE(HKL);复制代码#if !defined(_MAC) || !defined(GDI_INTERNAL)DECLARE_HANDLE(HFONT);#endifDECLARE_HANDLE(HICON);#if !defined(_MAC) || !defined(WIN_INTERNAL)DECLARE_HANDLE(HMENU);#endifDECLARE_HANDLE(HMETAFILE);DECLARE_HANDLE(HINSTANCE);typedef HINSTANCE HMODULE;      /* HMODULEs can be used in place of HINSTANCEs */#if !defined(_MAC) || !defined(GDI_INTERNAL)DECLARE_HANDLE(HPALETTE);DECLARE_HANDLE(HPEN);#endifDECLARE_HANDLE(HRGN);DECLARE_HANDLE(HRSRC);DECLARE_HANDLE(HSTR);DECLARE_HANDLE(HTASK);DECLARE_HANDLE(HWINSTA);DECLARE_HANDLE(HKL);</p>
<p>这里微软把通用句柄HANDLE定义为void指针，显然啦，他是不想让人知道句柄的真实类型，但是和他以往的做法一样，微软空有一个好的想法结果没有实现。马上，如果定义了强制类型检查STRICT，他又定义了特殊类型句柄宏DECLARE_HANDLE，这里用到了##，这是比较偏僻的用法，翻译过来，对于诸如DECLARE_HANDLE（HMENU）定义其实就是</p>
<p>01typedef struct HMENU__02{03int unused;04} *HMENU;复制代码typedef struct HMENU__{int unused;} *HMENU;</p>
<p>到这里，你是不是觉得有一点眉目了呢，对，句柄是一种指向结构体的指针，结合这里的int unused定义很容易猜到结构体的第一个字段就是我们的逻辑地址（指针）。那么，是不是仅仅如此呢，当然不是！！！由于指向结构体指针可以强制截断只获取第一个字段，这里的struct结构体绝对不止一个字段，联系我们在Windows中的编程经验，对于线程HANDLE有计数那么必须有计数段，对于事件HEVENT等内核对象会要求指定属性那么必须有属性段，对于内存分配HANDLE有可移动和不可移动之说那么必须有内存可移动属性段，等等。基于此我们可以大胆猜测Windows的句柄指向的结构类似如下</p>
<p>01struct02{03int pointer;        //指针段04int count;          //内核计数段05int attribute;      //文件属性段:SHARED等等06int memAttribute;   //内存属性段:MOVABLE和FIXED等等07...08};复制代码struct{int pointer;        //指针段int count;          //内核计数段int attribute;      //文件属性段:SHARED等等int memAttribute;   //内存属性段:MOVABLE和FIXED等等...};</p>
<p>事实上，Windows内存管理器管理的其实都是句柄，通过句柄来管理指针，Windows的系统整理内存时检测内存属性段，如果是可以移动的就能够移动逻辑地址，移动完后将新的地址更新到对应句柄的指针段中，当要使用MOVABLE地址时的时候必须Lock住，这时候计数加1，内存管理器检测到计数》0便不会移动逻辑地址，这时候才能获得固定的逻辑地址来操作物理内存，使用完后Unlock内存管理器又可以移动逻辑地址了，到此MOVABLE的内存访问为什么不会乱这个问题就解决了。</p>
<p>下面再说一说，FIXED的内存为什么说就是指向分配内存块的指针。我们看上面的通用句柄定义，可以发现HANDLE的句柄定义一直是void指针，其他的特殊句柄在严格类型检查的时候定义为结构体指针，为什么不把二者定义为一样的呢。查看MSDN今天说说GlobalAlloc的叙述对于GMEM_FIXED类型&ldquo;Allocates fixed memory. The return value is a pointer.&rdquo;，这里返回的是一个指针，为了验证这个说法，我写了一小段程序</p>
<p>01//GMEM_FIXED02hGlobal = GlobalAlloc(GMEM_FIXED, (lstrlen(szBuffer)+1) * sizeof(TCHAR));03pGlobal = GlobalLock(hGlobal);04lstrcpy(pGlobal, szBuffer);05_tprintf(TEXT(&quot;pGlobal和hGlobal%sn&quot;), pGlobal==hGlobal ? TEXT(&quot;相等&quot;) : TEXT(&quot;不相等&quot;));06GlobalUnlock(hGlobal);07_tprintf(TEXT(&quot;使用句柄当做指针访问的数据为:%sn&quot;), hGlobal);08GlobalFree(hGlobal);复制代码//GMEM_FIXEDhGlobal = GlobalAlloc(GMEM_FIXED, (lstrlen(szBuffer)+1) * sizeof(TCHAR));pGlobal = GlobalLock(hGlobal);lstrcpy(pGlobal, szBuffer);_tprintf(TEXT(&quot;pGlobal和hGlobal%sn&quot;), pGlobal==hGlobal ? TEXT(&quot;相等&quot;) : TEXT(&quot;不相等&quot;));GlobalUnlock(hGlobal);_tprintf(TEXT(&quot;使用句柄当做指针访问的数据为:%sn&quot;), hGlobal);GlobalFree(hGlobal);</p>
<p>运行结果为</p>
<p>01pGlobal和hGlobal相等02使用句柄当做指针访问的数据为:Test text复制代码pGlobal和hGlobal相等使用句柄当做指针访问的数据为:Test text</p>
<p>对比使用GMEM_MOVABLE程序为</p>
<p>01//GMEM_MOVABLE02hGlobal = GlobalAlloc(GMEM_MOVEABLE, (lstrlen(szBuffer)+1) * sizeof(TCHAR));03pGlobal = GlobalLock(hGlobal);04lstrcpy(pGlobal, szBuffer);05_tprintf(TEXT(&quot;pGlobal和hGlobal%sn&quot;), pGlobal==hGlobal ? TEXT(&quot;相等&quot;) : TEXT(&quot;不相等&quot;));06_tprintf(TEXT(&quot;使用句柄当做指针访问的数据为:%sn&quot;), hGlobal);07GlobalUnlock(hGlobal);08GlobalFree(hGlobal);复制代码//GMEM_MOVABLEhGlobal = GlobalAlloc(GMEM_MOVEABLE, (lstrlen(szBuffer)+1) * sizeof(TCHAR));pGlobal = GlobalLock(hGlobal);lstrcpy(pGlobal, szBuffer);_tprintf(TEXT(&quot;pGlobal和hGlobal%sn&quot;), pGlobal==hGlobal ? TEXT(&quot;相等&quot;) : TEXT(&quot;不相等&quot;));_tprintf(TEXT(&quot;使用句柄当做指针访问的数据为:%sn&quot;), hGlobal);GlobalUnlock(hGlobal);GlobalFree(hGlobal);</p>
<p>运行结果为</p>
<p>01pGlobal和hGlobal不相等02使用句柄当做指针访问的数据为:?复制代码pGlobal和hGlobal不相等使用句柄当做指针访问的数据为:?</p>
<p>显然，使用GMEM_FIXED和使用GMEM_MOVABLE得到的数据类型不是一样的，我们有理由相信Windows在调用GlobalAlloc使用GEM_FIXED的时候返回的就是数据指针，使用Windows在调用GMEM_MOVABLE的时候返回的是指向结构体的句柄，这样操作的原因相信是为了使用更加方便。那么这里我们就要修正一下前面的说法了：通用句柄HANDLE有时候是逻辑指针，大多数时候是结构体指针，特殊句柄如HMENU等是结构体指针。这样第二个问题也解决了。</p>
<p><strong>三、总结：</strong></p>
<p><img decoding="async" alt="句柄是什么？Windows结构体里面句柄的作用" src="https://dz.cwhello.com/wp-content/uploads/2022/12/20221201070747-638852c3c3a21.jpg" /></p>
<p>下面，我们再回头看一看博文开头说的叙述不当之处，说他们不当是因为不是完全错误：第一点，确实句柄有管理内存地址变动之用，但是并不只是这个作用，内核对象访问级别、文件是否打开都是和他相关的；第二点，指向指针的指针，看得出来作者也是认真思考了的，但是他忽略了句柄包含的其他功能和管理内存地址的作用。</p>
<p>那么到这里对于句柄你应该非常理解了，在此基础我们在Windows编程上是不是可以有一些启发：</p>
<p>1、通用句柄HANDLE和特殊句柄一般情况下是可以相互转换的，但是有时候会出错。</p>
<p>2、如果不考虑跨平台移植的话，应该多采用Windows SDK提供的内存管理函数，这样可以获得更好的内存管理。</p>
<p>3、C语言的内存分配函数的实现都是依靠使用GMEM_FIXED调用Windows SDK的内存分配函数的。</p>
<p>注意可能在新的VS2005等系列编译器中看不到本文说的一些内容，因为在VC6时候有些代码还不是那么完善，所以给了我们机会去挖掘潜在的内容。至于微软苦心积虑不让我们看到句柄的真实定义那是必然的，试想一下主要的内存对象结构都被摸清楚了，那么黑客们还不反了天了。</p>
<p>至此，用户应该明白句柄是什么了吧，其实在不同的领域中，句柄的作用都是差不多的，可以作为一个标识的作用。</p>

<p><img src="https://www.gxjlyf.com/postviews/883113.png" /></p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>小编分享Win7系统打开虚拟机提示“句柄无效”怎么解决</title>
		<link>https://www.gxjlyf.com/859344.html</link>
		
		<dc:creator><![CDATA[bafang18]]></dc:creator>
		<pubDate>Sat, 26 Nov 2022 03:33:03 +0000</pubDate>
				<category><![CDATA[PC教程]]></category>
		<category><![CDATA[句柄]]></category>
		<category><![CDATA[虚拟机]]></category>
		<guid isPermaLink="false">https://www.chuwenyu.com/859344.html</guid>

					<description><![CDATA[最近有Win7系统用户反映，打开虚拟机的时候，出现提示&#8220;无法获得vmci驱动程序的版本：句柄无效&#038; ...]]></description>
										<content:encoded><![CDATA[<p>最近有Win7系统用户反映，打开虚拟机的时候，出现提示&ldquo;无法获得vmci驱动程序的版本：句柄无效&rdquo;，导致无法正常打开虚拟机，用户并不知道这是怎么回事，也不知道该怎么解决，为此非常苦恼。下面，针对这一问题，小编就来教教大家Win7系统打开虚拟机提示&ldquo;句柄无效&rdquo;的解决方法。</p>
<p><strong>方法/步骤</strong></p>
<p>1、打开虚拟机，新建一个虚拟机文件或者选择已有的虚拟机，双击；</p>
<p><img decoding="async" alt="Win7系统打开虚拟机提示“句柄无效”怎么解决？" src="https://dz.cwhello.com/wp-content/uploads/2022/11/20221126033257-638188e9525c7.jpg" /></p>
<p>2、进入虚拟机详细界面，在右方【配置文件】处，查看虚拟机存放路径；</p>
<p><img decoding="async" alt="Win7系统打开虚拟机提示“句柄无效”怎么解决？" src="https://dz.cwhello.com/wp-content/uploads/2022/11/20221126033258-638188ea06a96.jpg" /></p>
<p>3、然后打开本地路径，找到以VMX结尾的文件；</p>
<p><img decoding="async" alt="Win7系统打开虚拟机提示“句柄无效”怎么解决？" src="https://dz.cwhello.com/wp-content/uploads/2022/11/20221126033258-638188eac1449.jpg" /></p>
<p>4、右键点击虚拟机文件，选择【以记事本方式打开】；</p>
<p><img decoding="async" alt="Win7系统打开虚拟机提示“句柄无效”怎么解决？" src="https://dz.cwhello.com/wp-content/uploads/2022/11/20221126033259-638188eb8b4f4.jpg" /></p>
<p>5、进入记事本界面，点击上方菜单栏处【编辑选项】，然后点击【查找】；</p>
<p><img decoding="async" alt="Win7系统打开虚拟机提示“句柄无效”怎么解决？" src="https://dz.cwhello.com/wp-content/uploads/2022/11/20221126033300-638188ec3586a.jpg" /></p>
<p>6、进入查找界面，在文本框输入vmci0.present，点击查找下一个；</p>
<p><img decoding="async" alt="Win7系统打开虚拟机提示“句柄无效”怎么解决？" src="https://dz.cwhello.com/wp-content/uploads/2022/11/20221126033300-638188ecc946e.jpg" /></p>
<p>7、查找到vmci0.present=&ldquo;TRUE&rdquo; 代码，将true更改为false点击保存即可。</p>
<p><img decoding="async" alt="Win7系统打开虚拟机提示“句柄无效”怎么解决？" src="https://dz.cwhello.com/wp-content/uploads/2022/11/20221126033301-638188ed6956c.jpg" /></p>
<p>以上就是小编教给大家的Win7系统下打开虚拟机提示&ldquo;句柄无效&rdquo;的具体解决方法，按照以上方法操作后，再次打开虚拟机的时候就不会再出现句柄无效的提示了。</p>

<p><img src="https://www.gxjlyf.com/postviews/859344.png" /></p>
]]></content:encoded>
					
		
		
			</item>
	</channel>
</rss>
