如何从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);


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值