close


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
arrow
arrow
    全站熱搜

    天才R 發表在 痞客邦 留言(0) 人氣()