Delphi Как получить принтер по умолчанию в Windows 2022 Server.Terminal server
FastReport принтер по умолчанию определяет следующим образом
var
prnName: array[0..255] of Char;
begin
GetProfileString('windows', 'device', '', prnName, 255);
Result := Copy(prnName, 1, Pos(',', prnName) - 1);
всегда работало корректно. Всегда мог поменять/установить нужный принтер по умолчанию. В последнее время ПО работало на терминальном сервере 2008 там было все ок. Сейчас ПО перенесено на терминальный сервер под Windows 2022. ПО не всегда находит принтер по умолчанию. Как можно программно изменить принтер по умолчанию под Win 2022? Похоже, что в 2022 изменена структура раздела реестра, куда прописывается принтер по умолчанию текущего юзера.
Ответы (1 шт):
Поскольку Майкрософт поменял расположение в реестре принтера по умолчанию, функция GetProfileString('windows', 'device', '', prnName, 255) не находит принтера.
В связи с этим FastReport не может найти принтер по умолчанию и отправляет печать на первый принтер в списке. Если комуто это интересно то надо поменять функцию в frxPrinter.pas следующим образом
было
function TfrxPrinters.GetDefaultPrinter: String;
var
prnName: array[0..255] of Char;
begin
GetProfileString('windows', 'device', '', prnName, 255);
Result := Copy(prnName, 1, Pos(',', prnName) - 1);
end;
стало
function TfrxPrinters.GetDefaultPrinter1: String;
var
Buff, s, c: string;
BuffSize, Err: DWord;
begin
GetDefaultPrinter(nil, BuffSize);
SetLength(Buff, BuffSize);
if GetDefaultPrinter(PChar(Buff), BuffSize) then
Result := buff
else
begin
Err := GetLastError();
if Err = ERROR_FILE_NOT_FOUND then
Result:= 'No default printer assigned'
else
Result:= 'Failed. Error: ' + intToStr(Err) ;
end;
end;
Т.е. использовать API функцию виндовс. Объявить ее после секции uses
function GetDefaultPrinter(Buffer: PChar; var BufferSize: DWord): BOOL; stdcall; external 'winspool.drv' name 'GetDefaultPrinterA';