流沙团
HWND、HANDLE、HMODULE、HINSTANCE的区别
2017-12-27 流沙团


1 使用HWND 

查找窗口:



HWND h_wnd = ::FindWindow(_T("MainForm"), NULL);

1

创建窗口:



HWND hwnd = WindowEx::Create(NULL, L"", WS_POPUP, WS_EX_TOOLWINDOW);

1

2 使用HANDLE 

单例运行:



bool SingletonRun(const wchar_t *application)

{

    assert(application);

    if (application == NULL)

        return false;



    HANDLE hMutex = ::CreateMutexW(NULL, TRUE, application);



    if (hMutex == NULL)

        return false;



    if (::GetLastError() == ERROR_ALREADY_EXISTS)

    {

        ::CloseHandle(hMutex);

        return false;

    }



    /* 从此这个互斥信号量就被不受控地打开了,直到进程退出 */

    return true;

}



获取文件大小:



int64_t GetFileSize(const PathString &filepath)

{

    WIN32_FIND_DATAW file_data;

    HANDLE file = FindFirstFileW(filepath.c_str(), &file_data);



    if (file == INVALID_HANDLE_VALUE)

        return -1;

    LARGE_INTEGER li = { file_data.nFileSizeLow, file_data.nFileSizeHigh };

    FindClose(file);

    return li.QuadPart;

}



3 使用HMODULE 

动态加载dll:



HMODULE moudle_handle = ::LoadLibraryW(L"shell32.dll");

1

获取模块directory:



std::wstring GetModuleDirectory(HMODULE module_handle)

{

    //DCHECK(IsModuleHandleValid(module_handle));

    std::wstring module_directory;

    if (FilePathApartDirectory(GetModulePathName(module_handle), module_directory))

        return module_directory;

    return L"";

}



4 使用HINSTANCE 

打开目录:



HINSTANCE inst = ::ShellExecute(NULL, L"open", dir.c_str(), NULL, NULL, SW_SHOW);



Windows上如何定义的



1 HWND 

A handle to a window



typedef HANDLE HWND;



2 HANDLE 

A handle to an object



typedef PVOID HANDLE;



3 HMODULE 

A handle to a module. This is the base address of the module in memory.



typedef HINSTANCE HMODULE;



看到定义了,答案很明了: 

HMODULE 和 HINSTANCE 只有在16位的windows系统上才有区别,否则没有区别。



4 HINSTANCE 

A handle to an instance. This is the base address of the module in memory.



typedef HANDLE HINSTANCE;



此时此刻,不知道你懵逼了没有,反正我是懵了,看定义,HWND、HANDLE、HMODULE、HINSTANCE这四个东西不是一样的吗!!!!



也就是可以说 HWND、HANDLE、HMODULE、HINSTANCE之间的差别不是在变量类型上,而是在语义上。



到底有什么区别?



HWND是线程相关的,你可以通过HWND找到该窗口所属进程和线程



Handle 是代表系统的内核对象,如文件句柄,线程句柄,进程句柄。 

系统对内核对象以链表的形式进行管理,载入到内存中的每一个内 

核对象都有一个线性地址,同时相对系统来说,在串列中有一个索引位置,这个索引位置就是内核对象的handle。



HINSTANCE的本质是模块基地址,他仅仅在同一进程中才有意义,跨进程的HINSTANCE是没有意义



HMODULE 是代表应用程序载入的模块,win32系统下通常是被载入模块的线性地址。



HINSTANCE 在win32下与HMODULE是相同的东西(只有在16位windows上,二者有所不同).

发表评论:
昵称

邮件地址 (选填)

个人主页 (选填)

内容