HINSTANCE的本質是模塊基地址,他僅僅在同一進程中才有意義,跨進程的HINSTANCE是沒有意義
HWND是線程相關的,你可以通過HWND找到該窗口所屬進程和線程
Handle 是代表系統的內核對像,如文件句柄,線程句柄,進程句柄。
HMODULE 是代表應用程序載入的模塊,win32系統下通常是被載入模塊的線性地址。
HINSTANCE 在win32下與HMODULE是相同的東西,在Win32下還存在主要是因為win16程序使用HINSTANCE來區別task。HWND 是窗口句柄。HMODULE等同於HINSTANCE
1 使用HWND
查找窗口:
HWND h_wnd = ::FindWindow(_T("MainForm"), NULL);
創建窗口:
HWND hwnd = WindowEx::Create(NULL, L"", WS_POPUP, WS_EX_TOOLWINDOW);
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");
獲取模塊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上,二者有所不同).
ref:
http://bbs.csdn.net/topics/391545781
http://blog.sina.com.cn/s/blog_4b4cf2af0100smp6.html
沒有留言:
張貼留言