首页 > 代码库 > 实例句柄

实例句柄

Windows应用程序中,总须要载入应用程序文件到系统内存里,为了标识每个文件在内存的差别,Windows使用了句柄来标识这些文件。比方在一个应用程序里,有一个可运行文件(EXE)和多个动态连接库文件(DLL),这时能够标识可运行文件为0x1D000000,动态连接库文件为0x1D001000。这里的值仅仅是举例,当系统运行应用程序时,就会分配实际的值给应用程序。载入到进程地址空间的每个可运行文件或是DLL文件都被赋予了一个独一无二的实例句柄。可运行文件的实例句柄就是(w)WinMain函数的第一个參数hInstance。传递这个參数给Windows应用程序,这样在C语言编写的应用程序里,就能够从这个參数拿到Windows应用程序实例句柄了。在非常多函数中都用到这个參数,比如:为了从可运行文件载入一个图标资源:

HICON   LoadIconHINSTANCE   hInstance ,   PCTSTR   pszIcdon

这里的第一个參数hInstance就是Windows应用程序实例句柄,假设想从EXE文件中载入图标,就把EXE文件的句柄传入;假设想从DLL文件中载入图标,就把DLL文件的句柄传入。hInstance參数实际上就是一个内存基地址,系统将可运行文件的映像载入到进程地址空间的这个位置。可是在Python的应用程序里,它的入口函数并不能直接拿到这个实例句柄參数,仅仅能另想它法。山重水复疑无路,柳暗花明又一村。在浏览Win32API里,能够找到两个相关的API函数:GetModuleHandleGetModuleHandleEx。这两个函数都能够获取文件的实例句柄,它们的差别是GetModuleHandle适用单线程获取句柄,不添加模块的引用计数;GetModuleHandleEx可用于多线程句柄,能够添加模块的引用计数,因此每调用一次这个函数,就要释放一次库的引用计数。在Python的应用程序里,就能够使用这两个函数来获取实例句柄,如以下的样例:

#windows应用程序

#开发者:蔡军生(QQ9073204) 深圳  2014-8-12

from ctypes import *

from ctypes.wintypes import *

 

hInst = windll.kernel32.GetModuleHandleW(None)

print(‘hInst: 0x%X‘ % hInst)

在这个样例里,聪明的你或许发现多导入了一个模块ctypes.wintypeswintypes是干什么用的呢?从前面学习ctypes已经知道能够使用ctypes里的类型,可是在转换为WIN32API时,就要记住比較多类型了。幸运的是wintypes已经帮我们做好基本经常使用的类型,比方:BYTEWORDDWORDUINTBOOLLPCWSTRCOLORREFHANDLEHWNDRECT等类型,假设须要很多其它关于这些类型,请查看python\Lib\ctypes\wintypes.py。有了这些类型,你就能够在Python里跟WIN32API的数据类型使用同样的形式了,而不必自己再去做脑力上的转换,这样能够省下不少时间,会大大提高开发效率。在这里通过windll.kernel32.GetModuleHandleW语句就能够获取当前进程的实例句柄,有了实例句柄,就能够向这个程序创建窗体、创建字体等事情了。

实例句柄