c++调用win32API控制打印机打印

来源:互联网 发布:手机淘宝昵称怎么修改 编辑:程序博客网 时间:2024/05/20 07:50

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;} 
复制代码
0 0
原创粉丝点击