进程是被当前操作系统加载到内存的、正在运行的应用程序的实例。每一个进程都是由内核对象和地址空间所组成的,内核对象可以让系统在其内存放有关进程的统计 信息并使系统能够以此来管理进程,而地址空间则包括了所有程序模块的代码和数据以及线程堆栈、堆分配空间等动态分配的空间。进程仅仅是一个存在,是不能独 自完成任何操作的,必须拥有至少一个在其环境下运行的线程,并由其负责执行在进程地址空间内的代码。在进程启动的同时即同时启动了一个线程,该线程被称作 主线程或是执行线程,由此线程可以继续创建子线程。如果主线程退出,那么进程也就没有存在的可能了,系统将自动撤消该进程并完成对其地址空间的释放。海姹网(网址:http://www.seacha.com),标签:进程、实例、HANDLE、HINSTANCE、HMODULE、HWND区别理解, HANDLE,HMODULE海姹网(网址:http://www.seacha.com),标签:进程、实例、HANDLE、HINSTANCE、HMODULE、HWND区别理解, HANDLE,HMODULE


    对应用程序来说,进程就像一个大容器。在应用程序被运行后,就相当于将应用程序装进容器里了,你可以往容器里加其他东西(如:应用程序在运行时所需的变量数 据、需要引用的DLL文件等),当应用程序被运行两次时,容器里的东西并不会被倒掉,系统会找一个新的进程容器来容纳它。 

海姹网(网址:http://www.seacha.com),标签:进程、实例、HANDLE、HINSTANCE、HMODULE、HWND区别理解, HANDLE,HMODULE


    HANDLE(Handle to an object)
    定义:

海姹网(网址:http://www.seacha.com),标签:进程、实例、HANDLE、HINSTANCE、HMODULE、HWND区别理解, HANDLE,HMODULE

typedef void *HANDLE;
    主要是代表系统的内核对象,如文件句柄,线程句柄,进程句柄。 
 
    系统对内核对象以链表的形式进行管理,载入到内存中的每一个内
    核对象都有一个线性地址,同时相对系统来说,在串列中有一个索引位置,这个索引位置就是内核对象的handle. 

海姹网(网址:http://www.seacha.com),标签:进程、实例、HANDLE、HINSTANCE、HMODULE、HWND区别理解, HANDLE,HMODULE


    HINSTANCE(Handle to an instance.)
    定义:
struct HINSTANCE__
{
    int unused;
};
typedef struct HINSTANCE__ HINSTANCE
    可用HMODULE代替,在Win32下还存在主要是因为win16 程序使用HINSTANCE来区别task(任务)。

海姹网(网址:http://www.seacha.com),标签:进程、实例、HANDLE、HINSTANCE、HMODULE、HWND区别理解, HANDLE,HMODULE

    
    HMODULE(Handle to a module. The value is the base address of the module.)
    定义:
typedef HINSTANCE HMODULE;  /* HMODULEs can be used in place of HINSTANCEs */
    所以在win32下HINSTANCE与HMODULE是相同的东西,它们在win32系统下通常是被载入模块的线性地址,有的书上说它们(实例句柄)实际是一个记录有进程加载位置的基本内存地址,我觉得有点不对,因为看定义,它们只是一个含有整型值的结构。所以线性地址说的较为准确。

海姹网(网址:http://www.seacha.com),标签:进程、实例、HANDLE、HINSTANCE、HMODULE、HWND区别理解, HANDLE,HMODULE


    HMODULE是一种特殊的handle他只对于exe, dll等模块

海姹网(网址:http://www.seacha.com),标签:进程、实例、HANDLE、HINSTANCE、HMODULE、HWND区别理解, HANDLE,HMODULE


    对于VC++链接程序所链接产生的程序,其默认的基本地址空间地址为0x00400000,如没有必要一般不要修改该值。在程序中,可以通过HMODULE hModule = GetModuleHandle()函数得到指定模块所使用的基本地址空间。

    HWND(Handle to a window.)

海姹网(网址:http://www.seacha.com),标签:进程、实例、HANDLE、HINSTANCE、HMODULE、HWND区别理解, HANDLE,HMODULE

    定义:
    有两个
    1(不明白):
struct {
HWND hWnd;
UINT Msg;
} HWND;
 
    2(和HINSTANCE一样一个宏定义):

海姹网(网址:http://www.seacha.com),标签:进程、实例、HANDLE、HINSTANCE、HMODULE、HWND区别理解, HANDLE,HMODULE

DECLARE_HANDLE            (HWND);
#define DECLARE_HANDLE(name) struct name##__ {int unused;}; \
typedef struct name##__ *name
    (不明白这两个定义在用的时候哪个起作用)
    
    
    总结
    Handle 是代表系统的内核对象,如文件句柄,线程句柄,进程句柄。
    
    HMODULE 是代表应用程序载入的模块,win32系统下通常是被载入模块的线性地址。
    
    HINSTANCE 在win32下与HMODULE是相同的东西,在Win32下还存在主要是因为win16程序使用HINSTANCE来区别task。

    HWND 是窗口句柄。

    HMODULE等同于HINSTANCE
    
    下面是测试代码:
void testfun()
{
    typedef int (_stdcall *FUN)(int,int,int);
    HMODULE hInst = LoadLibrary(_T("Test.dll"));
    if(hInst!=NULL)
    {
        FUN pFun = (FUN)GetProcAddress(hInst,"TestFun");
        if(pFun !=NULL)
        {
            TestFun();
        }
    }
    else
    {
        ::AfxMessageBox("找不到TestDll");
    }
}
    将
HMODULE hInst = LoadLibrary(_T("Test.dll")) 
    替换成 
HINSTANCE hInst = LoadLibrary(_T("Test.dll"))
    编译通过。
 
补充:
定义是这样的:typedef HINSTANCE HMODULE;

再看看HINSTANCE
typedef HANDLE HINSTANCE;

HANDLE又是什么呢?
typedef PVOID HANDLE;

PVOID又是什么呢?
typedef void *PVOID;

现在明白了吧》
其实这些都可以称为句柄,为了表述的方便,所以对于不同类型的句柄都用不同样式的tepedef..
比如说HINSTANCE表示实例句柄,我们也可以猜想HMODULE是模块句柄,实际上他们本质上都是VOID指针。。

This function returns a module handle for the specified module if the file is mapped into the address space of the calling process.

HMODULE GetModuleHandle(
LPCTSTR lpModuleName
);

这其实就是返回一个指向模块的句柄而已。。
posted on 2016-09-25 00:04  踏歌&而行  阅读(1668)  评论(0)    收藏  举报