如何获得打印机的句柄(50分)

  • 主题发起人 主题发起人 cleanhands
  • 开始时间 开始时间
C

cleanhands

Unregistered / Unconfirmed
GUEST, unregistred user!
如何获得打印机的句柄
 
delphi不是之间可以调用printer吗?
 
Printer.GetPrinter(Device, Driver, Port, hDMode);
// 获取打印机句柄

定义如下
Device: array[0..255] of char;
Driver: array[0..255] of char;
Port: array[0..255] of char;
hDMode: THandle;
 
//faint Printer.GetPrinter里的hDMode: THandle是一个DEVMODE。不要误人子弟啊。
你可以用
winSpool.OpenPrinter(pPrinterName: PChar;
var phPrinter: THandle;
pDefault: PPrinterDefaults): BOOL;
stdcall;
其中pPrinterName就是Printer.GetPrinter里得到的打印机名称啦,如果你知道确切的名
称直接写也可以的。var phPrinter: THandle是穿出来的句柄,就是cleanhands要的东东。
pDefault设成nil就可以啦,还有不明白的可以到msdn上看一看
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/gdi/prntspol_9qnm.asp
 
我考,是不是要我把代码全部贴上来才算好啊
下面是个自定义页面大小的代码,开始就是去取句柄
procedure TYPrinter.setPageSize(iPageLength, iPageWidth : integer);
var
Device: array[0..255] of char;
Driver: array[0..255] of char;
Port: array[0..255] of char;
hDMode: THandle;
PDMode: PDEVMODE;
begin
Printer.PrinterIndex := Printer.PrinterIndex;
Printer.GetPrinter(Device, Driver, Port, hDMode);
// 获取打印机句柄
if hDMode <> 0 then
// 0 表示打印机没有加载
begin
pDMode := GlobalLock(hDMode);
// 加锁,获取devicemode在内存的指针
if pDMode <> nil then
begin
if (iPageLength > 0) or (iPageWidth > 0) then
begin
// 设置自定义纸张
pDMode^.dmFields := pDMode^.dmFields or // 指定要修改的位是PagerSize,
DM_PAPERSIZE or // PagerWidth,
DM_PAPERWIDTH or // PagerLength
DM_PAPERLENGTH;
// 如果有一个值为0则取系统默认值
if iPageLength = 0 then
iPageLength := pDMode^.dmPaperLength;
if iPageWidth = 0 then
iPageWidth := pDMode^.dmPaperWidth ;
pDMode^.dmPaperSize := DMPAPER_USER;
// 自定义纸张
pDMode^.dmPaperWidth := iPageWidth ;

pDMode^.dmPaperLength := iPageLength
end;

GlobalUnlock(hDMode);
// 解锁, 释放指向devicemode的指针
end;
end;
Printer.PrinterIndex := Printer.PrinterIndex;
end;


 

写完后仔细想一想,觉得好像对句柄的原始定义有点疑问,
句柄原来就可以标识一个硬件对象所用内存的,然后通过某个函数直接可以取得指向该段
内存的指针。
我不知道我的理解是不是有误
 
[:P]从网上找到的一段话。
<<Microsoft Windows 3 Developer's Workshop>>(Microsoft Press,by Richard Wilton)
一书中句柄的概念是:在Windows环境中,句柄是用来标识项目的,这些项目包括:
*.模块(module)
*.任务(task)
*.实例(instance)
*.文件(file)
*.内存块(block of memory)
*.菜单(menu)
*.控制(control)
*.字体(font)
*.资源(resource),包括图标(icon),光标(cursor),字符串(string)等
*.GDI对象(GDI object),包括位图(bitmap),画刷(brush),元文件(metafile),调色板
(palette),画笔(pen),区域(region),以及设备描述表(device context)。
WINDOWS程序中并不是用物理地址来标识一个内存块,文件,任务或动态装入模块的,相
反的,WINDOWS API给这些项目分配确定的句柄,并将句柄返回给应用程序,然后通过句柄来
进行操作。
所以ggb1999对句柄的理解应该说是正确的,但他给出的程序却得不到打印机的句柄。不知他
有没有在实际操作中用过上面的那个函数,在delphi的帮助中GetPrinter的解释
DeviceMode returns the handle to a memory buffer containing a DeviceMode
record, which contains device-specific initialization data for the device driver.
Use the GlobalLock function to convert this handle into a pointer to the record.
//so GetPrinter返回的句柄是打印机状态的句柄而不是打印机的句柄
 
TPrinter 不是有Handle属性吗? 直接引用不就行了
 
后退
顶部