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; }