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

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

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

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

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

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

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

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

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

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

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

 windows console 项目

复制代码
#include 
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 
#include 
#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!" < 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;
} 
复制代码

你可能感兴趣的:(MFC)