PB-API函数调用参考
### PB-API函数调用参考:PowerBuilder 9.0中的打印控制 #### 6.1 系统缺省打印机的获取和设置 在探讨PowerBuilder 9.0中如何进行打印控制之前,需要理解计算机系统可能连接有多个本地或网络打印机,但其中只有一个会被设置为系统默认打印机。当应用程序需要执行打印操作时,默认会使用这一台打印机。 在PowerBuilder 7.0及之前的版本中,并没有提供直接获取和设置系统默认打印机的功能。然而,PowerBuilder 8.0引入了一个名为`PrintGetPrinter`的系统函数来获取当前系统默认打印机的信息,但仍然缺乏设置默认打印机的功能。因此,对于使用PowerBuilder 8.0及其之后版本的开发者来说,虽然不再需要直接调用API函数来获取系统默认打印机,但对于早期版本的使用者而言,了解以下API函数仍然是非常必要的。 ##### 6.1.1 Windows 2000及后续版本中默认打印机的获取与设置 在Windows 2000及后续操作系统中,提供了两个API函数`GetDefaultPrinter`和`SetDefaultPrinter`来实现默认打印机的获取与设置功能。这些函数的声明及相关参数的说明可以在Windows文档中找到。 **1. 获取缺省打印机** 获取缺省打印机的过程可以分为几个步骤: - **第一步**:使用`GetDefaultPrinter`函数获取缺省打印机的名称。为了处理字符串长度未知的情况,可以采用两步法调用此函数。首次调用时,将字符串缓冲区设置为NULL,从而获取到所需的缓冲区长度;随后,根据这个长度使用PowerBuilder的`Space`函数为字符串分配合适的缓冲区,再次调用函数以获取实际的打印机名称。 ```pb String ls_DefaultPrinterName; Long ll_PrinterNameSize; // 第一步:获取所需的缓冲区大小 ll_PrinterNameSize = GetDefaultPrinter(NULL, 0); if (ll_PrinterNameSize == 0) { // 处理错误情况 } // 第二步:分配缓冲区并获取打印机名称 ls_DefaultPrinterName = Space(ll_PrinterNameSize); ll_PrinterNameSize = GetDefaultPrinter(ls_DefaultPrinterName, ll_PrinterNameSize); if (ll_PrinterNameSize == 0) { // 处理错误情况 } ``` - **第二步**:调用`OpenPrinter`函数获取缺省打印机对象的句柄。 - **第三步**:使用`GetPrinter`函数并通过`PRINTER_INFO_2`结构来进一步获取缺省打印机的相关信息,例如驱动程序名称、连接端口以及打印机备注等。 由于`PRINTER_INFO_2`结构包含多种数据类型,包括String、Long和DEVMODE结构,因此在程序实现过程中需要注意一些细节: - 在调用`GetPrinter`函数时,可以将第三个参数声明为Blob型变量,函数成功返回后,使用内存块复制函数`RtlMoveMemory`(通常别名为`CopyMemory`)将Blob型变量中的信息拷贝到`PRINTER_INFO_2`结构中。 - 对于包含String类型的成员,可以采取变通的方式,即将所有成员的数据类型统一声明为Long型,这样每个成员所需的内存缓冲区长度固定为4个字节,整个`PRINTER_INFO_2`结构的总长度为84个字节。 - 使用PowerBuilder的`String`函数从Long型变量中提取字符串信息时,需要在调用`String`函数时加上`"address"`关键字。 下面是具体的示例代码: ```pb String ls_DefaultPrinterName, ls_DriverName, ls_PortName, ls_Comment; Long ll_PrinterNameSize; Long ll_Handle, ll_cbBuf, ll_cbNeeded; Blob bl_Buffer; str_PRINTER_DEFAULTS str_PrinterDefaults; str_PRINTER_INFO_2 str_PrinterInfo; // 获取默认打印机名称 ll_PrinterNameSize = GetDefaultPrinter(NULL, 0); if (ll_PrinterNameSize == 0) { // 错误处理 } ls_DefaultPrinterName = Space(ll_PrinterNameSize); ll_PrinterNameSize = GetDefaultPrinter(ls_DefaultPrinterName, ll_PrinterNameSize); if (ll_PrinterNameSize == 0) { // 错误处理 } // 打开打印机 ll_Handle = OpenPrinter(ls_DefaultPrinterName, &str_PrinterDefaults, NULL); if (ll_Handle == 0) { // 错误处理 } // 获取打印机信息 ll_cbBuf = sizeof(str_PrinterInfo); ll_cbNeeded = GetPrinter(ll_Handle, 2, bl_Buffer, ll_cbBuf, &ll_cbNeeded); if (ll_cbNeeded == 0) { // 错误处理 } // 将Blob中的信息复制到PRINTER_INFO_2结构中 CopyMemory(&str_PrinterInfo, bl_Buffer, ll_cbNeeded); // 从Long型变量中提取字符串信息 ls_DriverName = String(str_PrinterInfo.pDriverName, "address"); ls_PortName = String(str_PrinterInfo.pPortName, "address"); ls_Comment = String(str_PrinterInfo.pComment, "address"); // 关闭打印机句柄 ClosePrinter(ll_Handle); ``` 以上就是PowerBuilder 9.0中利用API函数获取系统缺省打印机名称的方法。通过这种方式,开发人员能够更好地控制打印过程,满足特定的应用需求。

















- 粉丝: 3
我的内容管理 展开
我的资源 快来上传第一个资源
我的收益
登录查看自己的收益我的积分 登录查看自己的积分
我的C币 登录后查看C币余额
我的收藏
我的下载
下载帮助


最新资源
- 网络课程设计报告.doc
- 通信工程项目管理试题A卷答案.doc
- 拉斯维加斯酒店系统集成方案样本.doc
- 网络系统集成开发方案设计莫光星要点.doc
- 网络人才需求形势与职业生涯规划.ppt
- 机械制造业电子商务平台规划.doc
- 基因工程的基本操作程序公开课专家讲座.pptx
- 最新最新毕业论文_基于单片机的数字温度计.docx
- 个人网络教研总结.docx
- 网络带来的碎片作文900字.docx
- 网络广告协议书范本.doc
- 基于ASP的旅游网站设计.doc
- 物联网技术及应用习题一.doc
- 专升本《计算机图形学与CAD技术》-试卷-答案.doc
- 基于SPARK的ETHINK数据挖掘与分析介绍.pdf
- 网络设备配置说课稿.ppt


