Печать в Windows не работает - PullRequest
0 голосов
/ 26 июня 2018

Я работаю над сценарием C ++ для печати непосредственно в Windows.

В настоящее время я использую следующий код из здесь :

BOOL RawDataToPrinter(LPTSTR szPrinterName, LPBYTE lpData, DWORD dwCount)
{
    BOOL     bStatus = FALSE;
    HANDLE     hPrinter = NULL;
    DOC_INFO_1 DocInfo;
    DWORD      dwJob = 0L;
    DWORD      dwBytesWritten = 0L;

    bStatus = OpenPrinter(szPrinterName, &hPrinter, NULL);

    if (bStatus) {
        // Fill in the structure with info about this "document." 
        DocInfo.pDocName = (LPTSTR)_T("My Document");
        DocInfo.pOutputFile = NULL;
        DocInfo.pDatatype = (LPTSTR)_T("RAW");

        // Inform the spooler the document is beginning. 
        dwJob = StartDocPrinter(hPrinter, 1, (LPBYTE)&DocInfo);
        if (dwJob > 0) {
            // Start a page. 
            bStatus = StartPagePrinter(hPrinter);

            if (bStatus) {
                // Send the data to the printer. 
                bStatus = WritePrinter(hPrinter, lpData, dwCount, &dwBytesWritten);
                EndPagePrinter(hPrinter);
            }
            // Inform the spooler that the document is ending. 
            EndDocPrinter(hPrinter);
        }
        // Close the printer handle. 
        ClosePrinter(hPrinter);

        std::cout << GetLastError() << std::endl;
    }
    // Check to see if correct number of bytes were written. 
    if (!bStatus || (dwBytesWritten != dwCount)) {
        bStatus = FALSE;
    }
    else {
        bStatus = TRUE;
    }
    return bStatus;
}

И яя вызываю метод с помощью:

std::string str = "Hello World";
BOOL blubb = RawDataToPrinter((LPTSTR)_T("PRINTER_NAME"), (LPBYTE) str.c_str(), str.size());

Проблема, с которой я столкнулся, заключается в том, что задание печати отображается в течение нескольких миллисекунд (достаточно долго, чтобы видеть) в очереди печати моего принтера, но он этого не делает.ничего не печатать.

Кто-нибудь знает, что я делаю не так?

1 Ответ

0 голосов
/ 14 сентября 2018

В 2004 году я столкнулся с большой проблемой при печати документа из программы C ++. Я пытался использовать Windows MFC API, но это не работает хорошо. Поэтому я нашел другое решение, которое продолжает работать в 2018 году с использованием Visual Studio 2017!

 XString sCmd;
 XString sDevice = "\\\\localhost\\DefaultPrinter";

 sCmd.Clear() << "net use LPT1: " << sDevice;
 iRetCode = system(sCmd);

 sCmd.Clear() << "print /D:LPT1 " << sFile;
 iRetCode = system(sCmd);

 sCmd = "net use LPT1: /delete";
 iRetCode = system(sCmd);

Класс XString является клоном MFC CString, улучшенным для того, чтобы код работал в Windows и BS2000 (операционная система Siemens = система Betrieb на немецком языке).

Этот код работает, только если вы определяете общий печатный файл с именем «DefaultPrinter» на каждом ПК, где должен запускаться C ++ EXE.

Без использования XString и упрощения некоторых строк код может быть:

std::string sDevice = "\\\\localhost\\DefaultPrinter";

system(string("net use LPT1: ") + sDevice);
system(string("print /D:LPT1 ") + sFileToPrint;
system("net use LPT1: /delete");
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...