Windows客户端开发--必须清楚HWND、HANDLE、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上,二者有所不同).

时间: 2024-10-12 22:51:59

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

windows客户端开发调试工具

本文介绍windows常用开发与调试工具. 1.windows常用开发与调试工具 1.1 Sysinternals 内核大神打造,含大量windows系统工具,windows开发必备神器,大神被MS招安. 下载地址:http://technet.microsoft.com/en-us/sysinternals Procmon.exe 监视程序运行过程中的动作,可用于性能监控. procexp.exe 相当于升级版的任务管理器,可以查看加载模块,模块查找,线程列表(含CPU百分比), 创建dump

windows客户端开发--也许是一条不归路

如今的Windows客户端开发,已经被同行嘲笑为鸡肋,甚至有些人认识做Windows客户端就是一个笑柄. 食之无味,弃之可惜. 不可否认,PC端没落的很快. 但是想说的是,任何一门技术都有存在的道理. 微软就是所有Windows客户端开发人员的大腿,虽然这个大腿让人捉摸不定,主方向总是变化. 换言之,Windows客户端开发难度不小.如果你能轻松的驾驭指针.内存.类等等,即使有一个Windows客户端彻底完蛋了,你也许只用一个星期或是一个月就掌握了另一种编程语言开发. 重要的是思想~ 我个人认为

Windows客户端开发简介(一)

在这样一个移动当道的年代,我跟大家讨论Windows客户端开发,似乎有些倚老卖老的意思了.然而我却觉得无论什么时候,Windows客户端开发其实还是有着不少实用经典的技术的.对了,确切说我是要说说Windows C++客户端开发,什么WinForm,WPF,并不在讨论范围之内,我承认用.NET ,C#做Windows客户端对开发人员来说确实是件轻松愉快的事,但是因为这些技术由于种种原因(主要还是效率问题)在经典的Windows客户端程序采用的少之又少,所以我打算把他们略过. 我并不是什么微软技术

windows客户端开发--使你的输入框具有拖拽上传的功能

今天谈一天windows客户端拖拽上传功能. 其实主要是拖拽功能,上传是自己实现的. DragAcceptFiles 函数 最重要的就是这个函数了,看看作用: Registers whether a window accepts dropped files 原型: VOID DragAcceptFiles( HWND hWnd, BOOL fAccept ); 参数: hWnd Type: HWND The identifier of the window that is registering

windows客户端开发--使你的客户端运行时记住上次关闭的大小和位置

几乎所有的windows客户端都可以调整大小,所以用户根据自己的喜好调整客户端的大小和位置. 但是当该客户端退出后,重新运行客户端的时候,我们往往又要调整自己喜好的大小和位置. 微信的windows客户端做了记住客户端退出时候的大小和位置,下次运行的时候直接,窗口直接显示为你喜好的大小和位置. 现在的任务就是八一八这个小小的功能. 首先,你肯定是想到了使用配置文件.再客户端退出的时候,把客户端窗口的信息记录在一个配置文件中,一般都是.ini文件.读写配置文件 很简单,这里就不再赘述了. 但是使用

Windows客户端开发简介(二)

一个典型的Windows客户端程序要有哪几部分构成呢?下面我会以一个国内比较流行的互联网客户端程序的基本架构来跟大家逐步展开分析,由于涉及到知识产权的问题,请大家不要问我是什么产品,当然,如果你能猜到,那我就管不着了^_^. 某视频影音互联网PC客户端产品基本架构 如上只是个粗略的分层架构图,没有更细致的划分,但是有几个地方是需要特别关注的,比如最上层的那几个部分,音视频解码引擎,UI引擎,WebKit浏览器内核,内核通信模块,日志系统. 因为音视频解码引擎和内核通信模块只是对于视频客户端和P2

Windows客户端开发简介(三)

之前的一篇文章里,我简单概要的介绍了一下界面库的知识.既然是跟界面有关,那么必然少不了很多关于绘制的内容.对于Windows开发而言,界面绘制使用的一类API就是所谓的"GDI". GDI这个东西可有历史了,但是我们就不去追根朔源了.首先,我不能免俗的要先介绍一下它的全称:"Graphic Device Interface",即"图形设备接口",从这个名称我们可以大略吸收到的信息就是:GDI是个跟图形绘制有关的接口,对的,正是这样! 先让我们来看

windows客户端开发--根据可下载url另存为文件(微信windows客户端这样做的)

可以我的blog的标题会让你误解,那么好,没图说了xx: 比如微信windows客户端发送了一张图片,我们可以预览这张图片,还可以保存到本地: 那么windows程序是如何下载这张图片的呢? 是这样,别人给你发了一张图片,这张图片的原图会存在微信的服务器上,这样这个文件就对应了一个可下载的url. 如果你拿到了这个url,用浏览器访问,你就可以通过下载这个原图了. 但是,在浏览器下载是我们客户端控制不了的,下载路径也要在浏览器中设置,也不能方便的重命名. 那么这时候问题来了: 我们怎么样从一个u

windows客户端开发--客户端国际化中特殊处理(日期等)

之前介绍了windows客户端使用xml进行国际化. 我们更多的时候关注的是显示,比如中文是关闭,英文系统显示为close. 但是在国际化过程中,还有一些其他地方不要处理的.不只是简单的翻译而已,有时候需要改变规则. 时间就是一个例子. 从学习英语我们就知道,老外时间.地址等表达方式跟我们不同. 所以这篇博客就是与您探讨探讨客户端国际化过程中对日期的特殊处理. 现在的前提是,你拿到了一个时间戳,要把它进行显示. 这非常简单,使用strftime即可. 博客http://blog.csdn.net