我先不说话,就看看几个代码片段
1 使用HWND
查找窗口:
创建窗口:
HWND hwnd = WindowEx::Create(NULL, L"", WS_POPUP, WS_EX_TOOLWINDOW);2 使用HANDLE
单例运行:
获取文件大小:
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:
获取模块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
打开目录:
1 HWND
A handle to a window
2 HANDLE
A handle to an object
3 HMODULE
A handle to a module. This is the base address of the module in memory.
看到定义了,答案很明了:
HMODULE 和 HINSTANCE 只有在16位的windows系统上才有区别,否则没有区别。
4 HINSTANCE
A handle to an instance. This is the base address of the module in memory.
此时此刻,不知道你懵逼了没有,反正我是懵了,看定义,HWND、HANDLE、HMODULE、HINSTANCE这四个东西不是一样的吗!!!!
也就是可以说 HWND、HANDLE、HMODULE、HINSTANCE之间的差别不是在变量类型上,而是在语义上。
到底有什么区别?HWND是线程相关的,你可以通过HWND找到该窗口所属进程和线程
Handle 是代表系统的内核对象,如文件句柄,线程句柄,进程句柄。
系统对内核对象以链表的形式进行管理,载入到内存中的每一个内
核对象都有一个线性地址,,同时相对系统来说,在串列中有一个索引位置,这个索引位置就是内核对象的handle。
HINSTANCE的本质是模块基地址,他仅仅在同一进程中才有意义,跨进程的HINSTANCE是没有意义
HMODULE 是代表应用程序载入的模块,win32系统下通常是被载入模块的线性地址。
HINSTANCE 在win32下与HMODULE是相同的东西(只有在16位windows上,二者有所不同).