GlobalLock

HGLOBAL hImageMemory=GlobalAlloc(GMEM_MOVEABLE, dwFileSize); //给图片分配全局内存

void *pImageMemory=GlobalLock(hImageMemory); //锁定内存

//锁定内存的同时,获得句柄hImageMemory指向的内存的实际地址赋给pImageMemory,接着便可以通过*pImageMemory对实际地址进行操作。

DWORD dwReadedSize; //保存实际读取的文件大小

ReadFile(hFile, pImageMemory, dwFileSize, &dwReadedSize, NULL); //读取图片到全局内存当中

GlobalUnlock(hImageMemory); //解锁内存

CloseHandle(hFile); //关闭文件句柄

IStream *pIStream;//创建一个IStream接口指针,用来保存图片流

GlobalAlloc申请的内存分两种,一种是GMEM_FIXED,另一种是GMEM_MOVEABLE。两者的差别只要在于GMEM_MOVEABLE类型的内存操作系统是可以移动的,比如堆中有好几块小内存,当再申请一大块内存时,操作系统会移动GMEM_MOVEABLE类型的内存来合并出一大块。正因为GMEM_MOVEABLE是可移动的,所以要用句柄标识,不能用内存地址标识,在使用时通过GlobalLock由句柄得到内存地址。

对于GMEM_FIXED类型的,该函数返回的句柄就是内存指针,可以直接当内存指针使用。

时间: 2024-10-13 02:43:22

GlobalLock的相关文章

winAPI 中 的 GlobalLock GlobalUnlock 的作用

在项目中遇到GlobalLock  GlobalUnlock 这两个操作内存的函数. 百度百科解释为:锁定内存中指定的内存块,并返回一个地址值,令其指向内存块的起始处.除非用 GlobalUnlock 函数将内存块解锁,否则地址会一直保持有效.msdn的说明:Locks a global memory object and returns a pointer to the first byte of the object's memory block.  讲的都比较简单. 程序员看到的都是虚拟地

delphi备份恢复剪切板(使用了GlobalLock API函数和CopyMemory)

看了季世平老兄的C++代码后翻译过来的 [delphi] view plain copy unit clipbak; interface uses SysUtils, Classes, Clipbrd, Windows, Contnrs; type TClipData = class Format: WORD; Data: THANDLE; end; TClipBackuper = class private ClipList: TList; public constructor Create;

GlobalLock锁定一个全局内存对象

GlobalLock BAIPro 原文地址:https://www.cnblogs.com/hshy/p/10885767.html

【转载】COM 组件设计与应用(四)——简单调用组件

原文:http://vckbase.com/index.php/wv/1211.html 一.前言 同志们.朋友们.各位领导,大家好. VCKBASE 不得了, 网友众多文章好. 组件设计怎么学? 知识库里闷头找! 摘自---杨老师打油集录 在 VCKBASE 的顶力支持下,在各位网友回帖的鼓励下,我才能顺利完成系列论文的前三回.书到本回,我们终于开始写代码啦.写点啥那?恩,有了!咱们先从如何调用现成的简单的组件开始吧,同时也顺便介绍一些相关的知识. 二.组件的启动和释放 在第三回中,大家用“小

干货!一篇文章集合所有Linux基础命令,适合所有菜鸟学习和老手回顾!

1 文件{ ls -rtl # 按时间倒叙列出所有目录和文件 ll -rt touch file # 创建空白文件 rm -rf 目录名 # 不提示删除非空目录(-r:递归删除 -f强制) dos2unix # windows文本转linux文本 unix2dos # linux文本转windows文本 enca filename # 查看编码 安装 yum install -y enca md5sum # 查看md5值 ln 源文件 目标文件 # 硬链接 ln -s 源文件 目标文件 # 符号

RedHat 6.4 搭建rhcs集群

架构拓扑(图片摘自网络) 一.实验环境 os:RedHat 6.4 node5    192.168.2.200    luci管理端 node1    192.168.2.103    集群节点 node2    192.168.2.111    集群节点 虚拟IP     192.168.2.110 初始化操作:关闭所有涉及设备的iptables.selinux=disabled.关闭NetworkManager 注:在该步骤中node2.example.com对应上面环境中提到的node1

窗口截图(可指定HWND窗口句柄)(三篇文章)

[cpp] view plain copy BOOL SaveHwndToBmpFile(HWND hWnd, LPCTSTR lpszPath) { HWND hDesktop = ::GetDesktopWindow(); ASSERT(hDesktop); if(NULL == hWnd) { hWnd = hDesktop; } RECT rect; ::GetWindowRect(hWnd, &rect); int nWidht = rect.right - rect.left; in

分析一个delphi程序

系统 : Windows xp 程序 : k4n6 程序下载地址 :https://pan.baidu.com/s/1pLANxyj 要求 : 注册机编写 使用工具 : OD & DeDe 可在看雪论坛中查找关于此程序的破文,传送门 首先在DeDe找到激发按钮点击事件的 代码: 0044435C 55 push ebp 0044435D 8BEC mov ebp, esp 0044435F 33C9 xor ecx, ecx 00444361 51 push ecx 00444362 51 pu

bcb ole拖拽功能的实现

最近项目中用到了OLE 拖拽功能 和BCB 一个Form的Drag 不同的是,只有实现了OLE 拖拽才能,从其他程序拖拽数据到Form 下面的代码实现了,同HTML网页拖拽到Form时,Form获得HTML数据 其核心思想是, 1,要实现 COM的 IDropTarget 接口 2,RegisterDragDrop(handle,this); 注册窗口的拖拽 3,窗口类构造 OleInitialize(NULL); 4,窗口类析构时 OleUninitialize(); 5,在下面的代码中,我将