2011-12-03 132 views
0

這裏印刷原始數據的情景:在終端服務器

  • 我有一個Windows Server 2008終端服務器(沒有域控制器,沒有加入到域)
  • 我有一個客戶機的Windows XP SP3更新(.NET 3.0 SP1和.NET 4.0)
  • 我用英巴卡迪諾C++ Builder中(BCB6)
  • 我有一票打印機(熱敏打印機,票據打印機,愛普生,斑馬等)

當我連接到終端服務器時,打印機工作正常。我測試了打印測試頁。

當我使用我的軟件在本地計算機上的終端服務器發送的原始數據,我得到這個錯誤:

Windows Presentation Foundation terminal server print W has encountered a 
problem and needs to close. We are sorry for the inconvenience. 

我跟着從這個support page的意見,沒有運氣。

我用來直接打印到LPT1:,但與Windows Server 2008這是越來越難,使這項工作,所以我們必須改變我們打印到這類打印機的方式。

這裏是我正在使用的代碼。我本地測試,它工作正常,但在終端服務器不起作用:

bool TForm1::RawDataToPrinter(char* szPrinterName, char* lpData, unsigned int dwCount) 
{ 
    int BytesWritten; 
    HANDLE hPrinter; 
    TDocInfo1 DocInfo; 
    bool bStatus = false; 
    int dwJob = 0; 
    unsigned long dwBytesWritten = 0; 

    // Open a handle to the printer. 
    bStatus = OpenPrinter(szPrinterName, &hPrinter, NULL); 

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

     // to indicate that the application will be sending document data to the printer. 
     dwJob = StartDocPrinter(hPrinter, 1, (LPBYTE)&DocInfo); 

     if (dwJob > 0) 
     { 
      // Start a page. 
      bStatus = StartPagePrinter(hPrinter); 
      bStatus = true; 

      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); 
    } 
    // Check to see if correct number of bytes were written. 
    if (!bStatus || (dwBytesWritten != dwCount)) 
     bStatus = false; 
    else 
     bStatus = true; 

    return bStatus; 
} 

我從Microsoft的支持中的示例複製此代碼。我也嘗試將「RAW」更改爲「TEXT」,但我得到相同的錯誤。

我嘗試這個代碼,因爲它使用了GDI打印:

long pageline; 

char prueba[255]; 

Printer()->SetPrinter(ListBox1->Items->Strings[ListBox1->ItemIndex].c_str(), "WINSPOOL", "", NULL); 
Printer()->BeginDoc(); 

pageline = 0; 
while(pageline < Memo1->Lines->Count) 
{ 
    Printer()->Canvas->TextOut(10, (10 + Printer()->Canvas->TextHeight("Hi! There")) * pageline, Memo1->Lines->Strings[pageline]); 
    pageline++; 
} 

Printer()->EndDoc(); 

這是我在Embarcadero的論壇發現了一個例子。

我也驗證TsWpfWrp.exe。我嘗試將它替換爲服務器中的那個,但它什麼都不做,不發送錯誤,但也不會發送任何數據。

還有另一種方式來做到這一點?代碼中有錯嗎?

我知道的任何幫助或洞察力。

回答

1

我發現這個問題,是輕鬆打印驅動程序,它在RAW模式下所期望的XPS規範,但我只發送文本。

我禁用Easy Print將打印機置於故障預置模式(類似於此),這是終端服務器首先查找安裝的驅動程序然後進行輕鬆打印(可以在高級選項中的打印機)。

現在,它的工作,謝謝。