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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM