码迷,mamicode.com
首页 > Windows程序 > 详细

Windows客户端开发--必须清楚HWND、HANDLE、HMODULE、HINSTANCE的区别

时间:2016-11-17 20:51:07      阅读:248      评论:0      收藏:0      [点我收藏+]

标签:此刻   windows   sse   ast   cto   应用程序   进程   art   comment   

我先不说话,就看看几个代码片段

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上,二者有所不同).

Windows客户端开发--必须清楚HWND、HANDLE、HMODULE、HINSTANCE的区别

标签:此刻   windows   sse   ast   cto   应用程序   进程   art   comment   

原文地址:http://blog.csdn.net/wangshubo1989/article/details/53203718

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!