這裏印刷原始數據的情景:在終端服務器
- 我有一個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。我嘗試將它替換爲服務器中的那個,但它什麼都不做,不發送錯誤,但也不會發送任何數據。
還有另一種方式來做到這一點?代碼中有錯嗎?
我知道的任何幫助或洞察力。