Delphi Как получить принтер по умолчанию в Windows 2022 Server.Terminal server

Рейтинг: 0Ответов: 1Опубликовано: 12.05.2023

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 изменена структура раздела реестра, куда прописывается принтер по умолчанию текущего юзера.

Ответы

▲ 0

Поскольку Майкрософт поменял расположение в реестре принтера по умолчанию, функция 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';