如何从PRINTDLG 结构体中获得打印机的名称

2024-03-05 03:58

本文主要是介绍如何从PRINTDLG 结构体中获得打印机的名称,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

如何从PRINTDLG 结构体中获得打印机的名称?

http://msdn.microsoft.com/zh-cn/site/ms646843

里面的字就是看不懂,似乎是说调用 PrintDlg 之后, hDevMode中会指向一个DEVMODE对象,但是我使用

DEVMODE *devmode = (DEVMODE*)pd.hDevMode;

DEVNAMES *devname = (DEVNAMES*)pd.hDevNames;

会发现dmDeviceName就是乱七八糟的东西,根本不是想要的。

typedef struct tagPD {DWORD lStructSize;HWND hwndOwner; HGLOBAL hDevMode;HGLOBAL hDevNames;HDC hDC;DWORD Flags;WORD nFromPage;WORD nToPage;WORD nMinPage;WORD nMaxPage;WORD nCopies;HINSTANCE hInstance;LPARAM lCustData;LPPRINTHOOKPROC lpfnPrintHook;LPSETUPHOOKPROC lpfnSetupHook;LPCTSTR lpPrintTemplateName;LPCTSTR lpSetupTemplateName;HGLOBAL hPrintTemplate;HGLOBAL hSetupTemplate;
} PRINTDLG, *LPPRINTDLG;


HGLOBAL

是兼容以前windows 3.x时代的16位内存分配API的数据,表示一个内存块,这个内存块是GlobalAlloc分配的,需要GlobalLock才能取得内存块的指针。
不过在Win32下,这个数据和Global内存分配函数完全没有用了,保留下来只是为了兼容。而且在Win32下,HGLOBAL就是一个void *的指针,可以不用GlobalLock直接使用来访问内存。
HGLOBAL 这个是windows 定义的数据类型。
这是个句柄,标示一个内存区,不是指针。在对内存区的操作中,一般用指针,从这个handle可以得到指针,然后就可以对内存区进行操作了。
GlobalUnlock函数解除锁定的内存块,使指向该内存块的指针无效,GlobalLock锁定的内存,一定要用GlobalUnlock解锁
--------------------------------------------------
eg: 开一个200byte的内存区,在里面赋值
HGLOBAL hMemHandle=::GlobalAlloc(GHND,50*sizeof(int)); //得到handle
int *p=(int *)::GlobalLock(hMemHandle); //从handle得到指针
for(int k=0;k<50;k++) *(p+k)=k;
char s[128];
sprintf(s,"testing:p[49]=%i",p[49]);
::GlobalUnlock(hMemHandle); //
::GlobalFree(p);
AfxMessageBox(s);
开辟一个新的内存区域,用一指针指向此地址区域,通过指针完成对内存区域的操作。记住用指针指向的时候要 ::GlobalLock(), 操作完成后,::GlobalUnlock()此内存区域的句柄,然后,::GlobalFree()掉此指针。

所以:

pd来自printDlg函数

devmode = (DEVMODE*)::GlobalLock(pd.hDevMode);


这篇关于如何从PRINTDLG 结构体中获得打印机的名称的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/775266

相关文章

Vite 打包目录结构自定义配置小结

《Vite打包目录结构自定义配置小结》在Vite工程开发中,默认打包后的dist目录资源常集中在asset目录下,不利于资源管理,本文基于Rollup配置原理,本文就来介绍一下通过Vite配置自定义... 目录一、实现原理二、具体配置步骤1. 基础配置文件2. 配置说明(1)js 资源分离(2)非 JS 资

Java集合中的链表与结构详解

《Java集合中的链表与结构详解》链表是一种物理存储结构上非连续的存储结构,数据元素的逻辑顺序的通过链表中的引用链接次序实现,文章对比ArrayList与LinkedList的结构差异,详细讲解了链表... 目录一、链表概念与结构二、当向单链表的实现2.1 准备工作2.2 初始化链表2.3 打印数据、链表长

创建springBoot模块没有目录结构的解决方案

《创建springBoot模块没有目录结构的解决方案》2023版IntelliJIDEA创建模块时可能出现目录结构识别错误,导致文件显示异常,解决方法为选择模块后点击确认,重新校准项目结构设置,确保源... 目录创建spChina编程ringBoot模块没有目录结构解决方案总结创建springBoot模块没有目录

SpringBoot利用树形结构优化查询速度

《SpringBoot利用树形结构优化查询速度》这篇文章主要为大家详细介绍了SpringBoot利用树形结构优化查询速度,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录一个真实的性能灾难传统方案为什么这么慢N+1查询灾难性能测试数据对比核心解决方案:一次查询 + O(n)算法解决

Django HTTPResponse响应体中返回openpyxl生成的文件过程

《DjangoHTTPResponse响应体中返回openpyxl生成的文件过程》Django返回文件流时需通过Content-Disposition头指定编码后的文件名,使用openpyxl的sa... 目录Django返回文件流时使用指定文件名Django HTTPResponse响应体中返回openp

Oracle查询表结构建表语句索引等方式

《Oracle查询表结构建表语句索引等方式》使用USER_TAB_COLUMNS查询表结构可避免系统隐藏字段(如LISTUSER的CLOB与VARCHAR2同名字段),这些字段可能为dbms_lob.... 目录oracle查询表结构建表语句索引1.用“USER_TAB_COLUMNS”查询表结构2.用“a

MySQL中的索引结构和分类实战案例详解

《MySQL中的索引结构和分类实战案例详解》本文详解MySQL索引结构与分类,涵盖B树、B+树、哈希及全文索引,分析其原理与优劣势,并结合实战案例探讨创建、管理及优化技巧,助力提升查询性能,感兴趣的朋... 目录一、索引概述1.1 索引的定义与作用1.2 索引的基本原理二、索引结构详解2.1 B树索引2.2

如何使用Maven创建web目录结构

《如何使用Maven创建web目录结构》:本文主要介绍如何使用Maven创建web目录结构的问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录创建web工程第一步第二步第三步第四步第五步第六步第七步总结创建web工程第一步js通过Maven骨架创pytho

Python循环结构全面解析

《Python循环结构全面解析》循环中的代码会执行特定的次数,或者是执行到特定条件成立时结束循环,或者是针对某一集合中的所有项目都执行一次,这篇文章给大家介绍Python循环结构解析,感兴趣的朋友跟随... 目录for-in循环while循环循环控制语句break语句continue语句else子句嵌套的循

Python+PyQt5实现文件夹结构映射工具

《Python+PyQt5实现文件夹结构映射工具》在日常工作中,我们经常需要对文件夹结构进行复制和备份,本文将带来一款基于PyQt5开发的文件夹结构映射工具,感兴趣的小伙伴可以跟随小编一起学习一下... 目录概述功能亮点展示效果软件使用步骤代码解析1. 主窗口设计(FolderCopyApp)2. 拖拽路径