以下是该方案:
当我连接到终端服务器时,打印机工作正常。我测试了打印测试页面。
当我使用我的软件在本地计算机上的终端服务器中发送原始数据时,我收到此错误:
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。我尝试用服务器中的那个替换它,但它什么都不做,不发送错误,但也不会发送任何数据。
还有另一种方法吗?我的代码有问题吗?
我感谢任何帮助或见解。
答案 0 :(得分:1)
我发现问题,是Easy Print驱动程序,它在RAW模式下期望XPS规范,但我只发送文本。
我禁用了Easy Print以使打印机处于后备模式(类似的东西),这是终端服务器的位置,首先它查找已安装的驱动程序然后进行Easy Print(这可以在属性中验证高级选项中的打印机。)
现在它有效,谢谢。