小程序:windows下C++调用打印机过程简介

本文介绍了如何通过WindowsAPI函数如GetProfileString获取默认打印机信息,创建打印设备句柄,并利用TextOut函数在打印机上输出文本,以一个小程序为例演示了整个过程。
摘要由CSDN通过智能技术生成

         本文目的主要是通过这个小程序理解打印机调用过程。通过调用windowsAPI函数GetProfileString,获得当前计算机默认打印机信息,然后生成打印设备句柄,再调用TextOut函数通过打印设备句柄将文字信息输出打印机上。
//有关程序代码及详细注释见下:
//**********马上龙年春节了,祝所有看到本文的朋友们春节快乐!龙年大吉!*********
#include <windows.h>
#include <string>
using namespace std;

int Print(string str)
{
    char szprinter[80];//用于存储打印相关信息
    char *szDevice,*szDriver,*szOutput; //用于存储将上面信息解析后的信息
    HDC hdcprint; // 定义一个打印设备句柄
    //定义一个打印作业
    static DOCINFO docinfo={sizeof(DOCINFO),"printer",NULL}; 
    /*
     关于DOCINFO结构体:
         int cbSize - 结构体字节数
         LPCTSTR lpszDocName - 指向指定文档名称的空终止字符串的指针
         LPCTSTR lpszOutput - 指向指定输出文件名称的以空结尾的指针。如果此指针为 NULL,则输出将发送到
                              由传递给 StartDoc 函数的设备上下文句柄标识的设备。
         LPCTSTR lpszDatatype - 指向指定用于记录打印作业的数据类型的空终止字符串的指针。此成员可以为 
                                NULL。这里使用缺省值。
         DWORD fwType - 指定有关打印作业的附加信息。此成员必须使用指定值。这里使用缺省值。
    */
    GetProfileString("windows","device",",,,",szprinter,80); 
       //GetProfileString是WIN32 API函数,功能是检索与 Win.ini文件的指定节中的键关联的字符串。注意此函
       //数只是为了与基于 16 位 Windows的应用程序兼容,其提取的信息应在注册表中。
       //参数介绍:
       //lpAppName -- 包含密钥的节的名称。
       //lpKeyName -- 要检索其关联字符串的键的名称。
       //lpDefault -- 默认字符串。如果在初始化文件中找不到lpKeyName键,函数会将默认字符串复制到lpReturnedString中。
       //lpReturnedString -- 指向接收字符串的缓冲区的指针。
       //nSize -- lpReturnedString 参数指向的缓冲区的大小(以字符为单位)。
    szDevice=strtok(szprinter,","); 
          //功能:分解字符串为一组标记串。参1 要分解的字符串、参2 字符串中的分隔符。
          //说明:首次调用时,参1必须指向要分解的字符串,随后再调用要把参1改成NULL。 
    szDriver=strtok(NULL,",");
    szOutput=strtok(NULL,",");
    if(szDevice&&szDriver&&szOutput)
    {
        if((hdcprint=CreateDC(szDriver,szDevice,szOutput,NULL))!=0) //生成打印设备句柄
             {
                if(StartDoc(hdcprint,&docinfo)>0) //开始执行一个打印作业 
                {
                    StartPage(hdcprint); //开始打印
                    SaveDC(hdcprint); //保存打印设备句柄  
                    TextOutA(hdcprint,10,10,str.data(),str.length());
                    string temp= "打印完毕!";
                    TextOutA(hdcprint, 10, 200, temp.data(), temp.length());
                    RestoreDC(hdcprint, -1); //恢复打印设备句柄到最近由SaveDC函数保存的状态中
                    EndPage(hdcprint); //停止打印
                    EndDoc(hdcprint); //结束一个打印作业
                    MessageBox(NULL,"打印完毕!","提示",MB_ICONINFORMATION); 
                }
                DeleteDC(hdcprint);// 销毁打印设备句柄                
             }
        else{
                MessageBox(NULL,"没有默认打印机,或者没有安装打印机!","消息",1);
                return 0;
            }
       }
    return 1;
}
int main()
{
    string a="天津市位于渤海之滨,是一座美丽的城市!";
    
    Print(a);
    system("pause");
    return 0;

}

//程序运行结果:(在打印机上输出)
//天津市位于渤海之滨,海河穿越其中,是一座美丽的城市!
//打印完毕!

  • 4
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Windows下使用C语言集成打印后台处理程序API接口获取默认打印机各项信息,可以通过以下步骤实现: 1. 引入Windows API头文件 在C语言程序中,需要使用Windows API头文件来调用系统提供的API接口。在此场景下,需要包含以下头文件: ```c #include <windows.h> #include <winspool.h> ``` 2. 获取默认打印机名称 在Windows系统中,可以通过调用GetDefaultPrinter函数获取默认打印机名称。该函数的定义如下: ```c BOOL GetDefaultPrinter(LPTSTR pszBuffer, LPDWORD pcchBuffer); ``` 其中,参数pszBuffer为一个指向缓冲区的指针,用于存储获取的默认打印机名称。参数pcchBuffer为一个指向DWORD类型的指针,用于存储缓冲区的大小。 示例代码: ```c TCHAR defaultPrinterName[MAX_PATH]; DWORD bufferSize = MAX_PATH; GetDefaultPrinter(defaultPrinterName, &bufferSize); printf("Default Printer Name: %s\n", defaultPrinterName); ``` 3. 获取默认打印机设备上下文句柄 获取默认打印机设备上下文句柄的方法是调用OpenPrinter函数。该函数的定义如下: ```c BOOL OpenPrinter(LPCTSTR pPrinterName, LPHANDLE phPrinter, LPPRINTER_DEFAULTS pDefault); ``` 其中,参数pPrinterName为一个指向打印机名称的指针,可以传入NULL表示获取默认打印机。参数phPrinter为一个指向HANDLE类型的指针,用于存储获取的打印机设备上下文句柄。参数pDefault为一个指向PRINTER_DEFAULTS类型的指针,用于指定打印机的默认属性。 示例代码: ```c HANDLE defaultPrinterHandle = NULL; PRINTER_DEFAULTS printerDefaults = {NULL, NULL, PRINTER_ACCESS_USE}; if (!OpenPrinter(defaultPrinterName, &defaultPrinterHandle, &printerDefaults)) { printf("Failed to open default printer\n"); return; } ``` 4. 获取打印机属性信息 获取打印机属性信息的方法是调用GetPrinter函数。该函数的定义如下: ```c BOOL GetPrinter(HANDLE hPrinter, DWORD Level, LPBYTE pPrinter, DWORD cbBuf, LPDWORD pcbNeeded); ``` 其中,参数hPrinter为打印机设备上下文句柄;参数Level为指定返回的打印机信息的级别,常用的有2和5;参数pPrinter为一个指向缓冲区的指针,用于存储获取的打印机信息;参数cbBuf为缓冲区的大小;参数pcbNeeded为一个指向DWORD类型的指针,用于存储实际需要的缓冲区大小。 示例代码: ```c DWORD neededSize = 0; GetPrinter(defaultPrinterHandle, 5, NULL, 0, &neededSize); BYTE* printerInfo = (BYTE*)malloc(neededSize); if (!GetPrinter(defaultPrinterHandle, 5, printerInfo, neededSize, &neededSize)) { printf("Failed to get printer info\n"); free(printerInfo); return; } PRINTER_INFO_5* printerInfo5 = (PRINTER_INFO_5*)printerInfo; printf("Driver Name: %s\n", printerInfo5->pDriverName); printf("Port Name: %s\n", printerInfo5->pPortName); free(printerInfo); ``` 上述代码中,我们调用GetPrinter函数两次,第一次获取需要的缓冲区大小,第二次获取打印机属性信息。在第二次调用中,我们指定了获取打印机信息的级别为5,得到的是PRINTER_INFO_5结构体,其中包含了打印机的驱动名称和端口名称等信息。 完整代码示例: ```c #include <stdio.h> #include <stdlib.h> #include <windows.h> #include <winspool.h> int main() { // 获取默认打印机名称 TCHAR defaultPrinterName[MAX_PATH]; DWORD bufferSize = MAX_PATH; GetDefaultPrinter(defaultPrinterName, &bufferSize); printf("Default Printer Name: %s\n", defaultPrinterName); // 获取默认打印机设备上下文句柄 HANDLE defaultPrinterHandle = NULL; PRINTER_DEFAULTS printerDefaults = {NULL, NULL, PRINTER_ACCESS_USE}; if (!OpenPrinter(defaultPrinterName, &defaultPrinterHandle, &printerDefaults)) { printf("Failed to open default printer\n"); return -1; } // 获取打印机属性信息 DWORD neededSize = 0; GetPrinter(defaultPrinterHandle, 5, NULL, 0, &neededSize); BYTE* printerInfo = (BYTE*)malloc(neededSize); if (!GetPrinter(defaultPrinterHandle, 5, printerInfo, neededSize, &neededSize)) { printf("Failed to get printer info\n"); free(printerInfo); return -1; } PRINTER_INFO_5* printerInfo5 = (PRINTER_INFO_5*)printerInfo; printf("Driver Name: %s\n", printerInfo5->pDriverName); printf("Port Name: %s\n", printerInfo5->pPortName); free(printerInfo); ClosePrinter(defaultPrinterHandle); return 0; } ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值