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