1. 程式人生 > >c++呼叫win32API控制印表機列印

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;
} 
複製程式碼

相關推薦

c++呼叫win32API控制印表機列印

win32實現將原始資料傳送給印表機 1、呼叫OpenPrinter()開啟印表機,獲取印表機控制代碼。 2、初始化DOCINFO印表機結構體。 3、呼叫StartDocPrinter()表明應用程式準備傳送文件資料給印表機。 4、呼叫StartPagePrint

C#呼叫TSC條碼印表機列印二維碼(轉)

#region 呼叫TSC印表機列印 /// <summary> /// 呼叫TSC印表機列印 /// </summary> /// <param name="title">列印的標題</param

C#呼叫TSC條碼印表機列印條碼(轉)

#region 呼叫TSC印表機列印條碼 /// <summary> /// 呼叫TSC印表機列印條碼 /// </summary> /// <param name="title">列印的標題&l

C#呼叫系統預設印表機列印文字和圖片

本方法適用於有列印驅動的印表機列印。直接用電腦預設印表機進行列印文字和圖片。 首先安裝印表機驅動,然後在裝置和印表機中將要用的印表機設為預設印表機,然後呼叫該方法即可 Pulic Void Print() { PrintService ps = new PrintService();

C# 呼叫win32API 獲取程序控制代碼 有毛用???

private void button2_Click(object sender, EventArgs e) { Process[] ProceddingCon = Process.GetProcesses(); //獲得所有程序 Int

[C#]呼叫Bartender服務並列印bartender標籤

通常大部分企業在生產,倉儲,QC等運作環節會用到標籤,標籤上有些各種標識。 一般的企業都有配有標籤軟體+專用的標籤印表機。此例以bartender為例子。 如果為了實現列印條碼,或者

C#呼叫codesoft實現批量列印

 private void button4_Click(object sender, EventArgs e)        {            //即然能找到這來的基本上應該是對Codesoft有所瞭解了,所以基礎的codesoft軟體怎麼用就不再講,軟體本身很簡單,

獲取iframe中的內容、查詢獲取指定元素(關於用c++呼叫WEBBROWSER控制元件,使用相關介面操作web頁面元素的一些方法)

最近開發WINDOWS下的應用程式,需要用到C++中呼叫WEBBROWSER控制元件操作網頁的相關技術,查閱了一下相關文件,反覆除錯了幾天,對其中的技術有了一些膚淺的認識,大多數C++程式設計師對COM應該不陌生,其實用C++操作網頁,在前端應用層上主要就是對COM介面的查

C++呼叫com控制元件方法

  最近要求做一個C++呼叫com元件的DEMO。由於自己對C++並無研究包括IDE工具。後來在網上查閱了些資料,經過努力終於告一段落。    網上對於C++載入com元件的方法已經說的很多了,我就僅貼下我所使用的方法(不用註冊dll,當然網上推薦了一些更簡單也更有

c# 利用webbrower控制元件列印html——實現列印頁面設定

領導分配了一個任務,利用c#連線印表機,列印一個html頁面,對於一個Java本專業還不太熟練的我,之前從未接觸過c#,挑戰還是很大的。但是沒辦法,做唄!!!首先找一個寫c#的工具唄,所以下載了vs2015,實現方法如下:1、新建一個form專案2、form中整合一個webb

C# 使用WIN32API獲取印表機

主要使用到winspool.drv中的EnumPrinters函式,程式碼如下: [DllImport("winspool.drv", SetLastError = true, CharSet = CharSet.Auto)] [return: MarshalAs(UnmanagedType.Bool)]

C# 呼叫印表機列印圖片

是基於WPF的。 具體程式碼如下,列印時會有一個小彈窗一閃而過,還在繼續找辦法改進 由於目前使用的方法所需的變數型別和程式裡需要列印的圖片的變數型別不一樣,所以這裡我將需要列印的照片先儲存為檔案,然

C# TSC列印二維碼和條形碼(轉) C#呼叫dll提示"試圖載入格式不正確的程式"解決方法

效果圖   開發、使用環境說明 安裝TSC_7.3.8_M-3.exe印表機驅動,安裝時選擇對應的ttp 244 pro 將TSCLIB.dll複製到C:\Windows\system 驅動安裝說明     選擇下一步   &nbs

C#實現CamLink控制E2V的CCD----呼叫採集卡SDK

首先分析一下埃科科技公司提供的採集卡SDK,在C#支援上提供了兩個dll,IKapBoardClassLibrary.dll和IKapBoard.dll。 以下是偽碼: 呼叫兩個庫,第一個庫是C#庫,可以直接使用名稱空間,第二個是C++庫,所以要用DllImpo

C#如何在普通類裡呼叫窗體控制元件

一種是建立窗體物件的方式,通過物件呼叫控制元件或方法  例如: Form1 form1 = new Form1(); form1.Button; //呼叫控制元件 form1.Method(); //呼叫方法123 當然了,控制元件的Modifiers屬性要設定成pub

Linux系統呼叫——程序控制(C/C++)(Linux)

系統呼叫——程序控制 什麼是程序?         程序是資源分配的最小單元,是一個具有一定獨立功能的程式的一次執行活動。每個程序都是一個獨立的執行單元。 程序與程式的區別? (1)程式是放到磁碟的可執行檔案,程序是指程式執行的例項。 (2)程序是動態的,程式是

JavaWeb開發,使用jqprint呼叫印表機列印頁面

1、實現頁面列印要引入jQuery和Jqprint。點選下載Jqprint外掛 1 2 <script language="javascript" src="jquery-1.4.4.min.js"></script> <scr

JavaWeb開發,使用js呼叫印表機列印頁面

首先,在html中,通過star和end來標記列印區域 1 2 3 4 5 6 7 8 <h1>這塊內容不需要列印</h1> <!--startprint--> <div class="content"> 這裡

java實現二維碼生成及呼叫印表機列印

在開發二維碼列印的過程中走過幾次彎路,所以在這裡特意將其記錄下來留作備忘。一開始參考其他博主寫的文章,有介紹通過編寫JAVA後臺程式碼來獲取本地預設印表機的驅動實現列印。BUT!這樣就導致在本地開發測試時看似一切正常,一旦專案部署到linux環境下,就會完全失效了(JAVA後臺程式碼去獲取linux本地的印表

duilib CWebBrowser控制元件 C++呼叫js函式&&js中呼叫C++函式

C++和js相互呼叫是個有意思的事情。 一、js中呼叫C++函式。函式原型 int g_FunSub(int x,int y); 呼叫方式如下: <html> <head&g