zoukankan      html  css  js  c++  java
  • c++调用win32API控制打印机打印

    win32实现将原始数据发送给打印机

    1、调用OpenPrinter()打开打印机,获取打印机句柄。

    2、初始化DOCINFO打印机结构体。

    3、调用StartDocPrinter()表明应用程序准备发送文档数据给打印机。

    4、调用StartPagePrinter()表明程序准备发送一个新的打印页给打印机。

    5、调用WritePrinter()发送原始数据给打印机。

    6、调用EndpagePrinter()表明打印页发送完毕。

    7、调用EndDocPrinter()表明文档发送完毕。

    8、调用ClosePrinter()关闭打印机,释放资源。

    通过上面步骤即可实现将原始打印数据发送给打印机。

     windows console 项目

    #include <windows.h>
    int Print(char str[]){
        char szprinter[80];
        char *szDevice,*szDriver,*szOutput;
        HDC hdcprint; // 定义一个设备环境句柄
        //定义一个打印作业
        static DOCINFO di={sizeof(DOCINFO),"printer",NULL}; 
        GetProfileString("windows","device",",,,",szprinter,80); 
        szDevice=strtok(szprinter,",");
        szDriver=strtok(NULL,",");
        szOutput=strtok(NULL,",");
        if(szDevice&&szDriver&&szOutput){if((hdcprint=CreateDC(szDriver,szDevice,szOutput,NULL))!=0){
                    if(StartDoc(hdcprint,&di)>0) //开始执行一个打印作业
                    {
                    
                        StartPage(hdcprint); //打印机走纸,开始打印
                        SaveDC(hdcprint); //保存打印机设备句柄  
                        TextOut(hdcprint,1,1,str,strlen(str));
                        RestoreDC(hdcprint,-1); //恢复打印机设备句柄
                        EndPage(hdcprint); //打印机停纸,停止打印
                        EndDoc(hdcprint); //结束一个打印作业
                //        MessageBox("打印完毕!","提示",MB_ICONINFORMATION);
                    }
                    // 用API函数DeleteDC销毁一个打印机设备句柄
                    DeleteDC(hdcprint);
            }
            else{
                //    MessageBox("没有默认打印机,或者没有安装打印机!");
                    return 0;
                }
            }
        return 1;
    }

    调用上面的Print函数就可以打印出 你想要打印的字符串

    前提是你的打印机在本地就能打出东西来 不然我也没办法了。我测试ok的 我把它加到昨天写的socket里面 ,服务器发个数据,我这边打印出一个数据。代码如下 只是把这个函数放进去就可以了 其他的跟之前一样!

    这是客户端代码,服务端代码已经贴过了,不管是c++写的,还是用php都是一样的,socket通信而已!

    #include "winsock2.h"
    #include <iostream>
    #include <windows.h>
    #pragma comment(lib, "ws2_32.lib")
    
    using namespace std;
    BOOL RecvLine(SOCKET s, char* buf); //读取一行数据
    
    int Print(char str[]){
        char szprinter[80];
        char *szDevice,*szDriver,*szOutput;
        HDC hdcprint; // 定义一个设备环境句柄
        //定义一个打印作业
        static DOCINFO di={sizeof(DOCINFO),"printer",NULL}; 
        GetProfileString("windows","device",",,,",szprinter,80); 
        szDevice=strtok(szprinter,",");
        szDriver=strtok(NULL,",");
        szOutput=strtok(NULL,",");
        if(szDevice&&szDriver&&szOutput){if((hdcprint=CreateDC(szDriver,szDevice,szOutput,NULL))!=0){
                    if(StartDoc(hdcprint,&di)>0) //开始执行一个打印作业
                    {
                    
                        StartPage(hdcprint); //打印机走纸,开始打印
                        SaveDC(hdcprint); //保存打印机设备句柄
                    //    TextOut(hdcprint,1,1,"热烈祝贺编程实例出版发行!",16); 
                        TextOut(hdcprint,1,1,str,strlen(str));
                        RestoreDC(hdcprint,-1); //恢复打印机设备句柄
                        EndPage(hdcprint); //打印机停纸,停止打印
                        EndDoc(hdcprint); //结束一个打印作业
                //        MessageBox("打印完毕!","提示",MB_ICONINFORMATION);
                    }
                    // 用API函数DeleteDC销毁一个打印机设备句柄
                    DeleteDC(hdcprint);
            }
            else{
                //    MessageBox("没有默认打印机,或者没有安装打印机!");
                    return 0;
                }
            }
        return 1;
    }
    int main(int argc, char* argv[])
    {
    const int BUF_SIZE = 64;
    
    WSADATA wsd; //WSADATA变量
    SOCKET sHost; //服务器套接字
    SOCKADDR_IN servAddr; //服务器地址
    char buf[BUF_SIZE]; //接收数据缓冲区
    char bufRecv[BUF_SIZE];
    int retVal; //返回值
    //初始化套结字动态库
    if (WSAStartup(MAKEWORD(2,2), &wsd) != 0)
    {
    cout << "WSAStartup failed!" << endl;
    return -1;
    }
    //创建套接字
    sHost = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
    
    if(INVALID_SOCKET == sHost)
    {
    cout << "socket failed!" << endl;
    WSACleanup();//释放套接字资源
    return  -1;
    }
    
    //设置服务器地址
    servAddr.sin_family =AF_INET;
    servAddr.sin_addr.s_addr = inet_addr("139.129.15.159");
    servAddr.sin_port = htons((short)1234);
    int nServAddlen  = sizeof(servAddr);
    
    //连接服务器
    retVal=connect(sHost,(LPSOCKADDR)&servAddr, sizeof(servAddr));
    if(SOCKET_ERROR == retVal)
    {
    cout << "connect failed!" <<retVal<< endl;
    closesocket(sHost); //关闭套接字
    WSACleanup(); //释放套接字资源
    return -1;
    }
    ZeroMemory(bufRecv, BUF_SIZE);
    while(true){
    //向服务器发送数据
    //ZeroMemory(buf, BUF_SIZE);
    //cout << " 向服务器发送数据:  ";
    //cin >> buf;
    //retVal = send(sHost, buf, strlen(buf), 0);
    //    if (SOCKET_ERROR == retVal)
    //    {
    //    cout << "send failed!" << endl;
    //    closesocket(sHost); //关闭套接字
    //    WSACleanup(); //释放套接字资源
    //    return -1;
    //     }
    //RecvLine(sHost, bufRecv);
        
        recv(sHost, bufRecv,BUF_SIZE , 0); // 接收服务器端的数据, 只接收5个字符
        if(bufRecv[0] != '0')
        {
            cout << endl <<"从服务器接收数据:" << bufRecv<< endl;
            Print(bufRecv);
        }
        else  break;
    }
    //退出
    closesocket(sHost); //关闭套接字
    WSACleanup(); //释放套接字资源
    return 0;
    } 
  • 相关阅读:
    vector<vector<int>> 判断三个数为一组是否重复
    数位dp——hdu2089不要62
    nyoj1099 四点坐标判断正方形
    构造回文——最长公共子序列问题 java
    nyoj08 一种排序
    记录一个protobuf枚举类型引发问题的分析和思考
    记录一下996.icu
    Android N requires the IDE to be running with Java 1.8 or later
    使用fresco后引发的关于造轮子的思考
    使用了一段时间的instant run 记录一下遇到的问题
  • 原文地址:https://www.cnblogs.com/lobsterIT/p/4610504.html
Copyright © 2011-2022 走看看