Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Windows 11 Standarddrucker ändern (https://www.delphipraxis.net/211019-windows-11-standarddrucker-aendern.html)

wuff01 15. Jul 2022 06:57


Windows 11 Standarddrucker ändern
 
Guten Morgen,

hat jemand unter Windows 11 aus Delphi heraus den Standarddrucker ändern können? Bis Windows 10 habe ich das so gemacht:

Delphi-Quellcode:
procedure TForm1.SetDefaultPrinter(NewDefPrinter: string);
var
  ResStr: array [0 .. 255] of char;
begin
  StrPCopy(ResStr, NewDefPrinter);
  WriteProfileString('windows', 'device', ResStr);
  StrCopy(ResStr, 'windows');
   SendNotifyMessage(HWND_BROADCAST, WM_WININICHANGE, 0, LongInt(@ResStr));
end;
Windows 11 reagiert auf den Code nicht.

Die 2 folgende Variante welche man häufig im Internet findet, bringt bei mir unter Windows 10 & 11 den Fehler 'Systemfehler. Code: 1801.
Der Druckername ist unzulässig'

Delphi-Quellcode:
 procedure SetWinDefaultPrinter(const Name: String);
  var
    fnSetDefaultPrinter: function(pszPrinter: PChar): Bool; stdcall;
    H: THandle;
    Size, Dummy: Cardinal;
    PrinterInfo: PPrinterInfo2;
begin
   if (Win32Platform = VER_PLATFORM_WIN32_NT) and (Win32MajorVersion >= 5) then begin
     @fnSetDefaultPrinter := GetProcAddress(GetModuleHandle(winspl), 'SetDefaultPrinterA');
     if (@fnSetDefaultPrinter = NIL) then
       RaiseLastOSError;
     if NOT fnSetDefaultPrinter(PChar(Name)) then
       RaiseLastOSError;
   end
   else begin
     if NOT OpenPrinter(PChar(Name), H, NIL) then
       RaiseLastOSError;
     try
       GetPrinter(H, 2, NIL, 0, @Size);
       if GetLastError <> ERROR_INSUFFICIENT_BUFFER then
         RaiseLastOSError;
       GetMem(PrinterInfo, Size);
       try
         if NOT GetPrinter(H, 2, PrinterInfo, Size, @Dummy) then
           RaiseLastOSError;
         PrinterInfo^.Attributes := PrinterInfo^.Attributes or PRINTER_ATTRIBUTE_DEFAULT;
         if NOT Winspool.SetPrinter(H, 2, PrinterInfo, PRINTER_CONTROL_SET_STATUS) then
           RaiseLastOSError;
       finally
         FreeMem(PrinterInfo);
       end;
     finally
       ClosePrinter(H);
     end;
   end;
Hat jemand einen Tipp für mich?

Redeemer 15. Jul 2022 10:10

AW: Windows 11 Standarddrucker ändern
 
Für den Fall, dass es sich um Netzwerkdrucker handelt, rate ich mal (ohne es zu wissen):
Es gibt unter Windows ab 10 mehrere Namen für Netzwerkdrucker. In Legacy-Anwendungen heißen sie anders als Microsoft-Anwendungen. Alte Methoden verwendeten immer die Legacy-Benennung \\Servername\Druckername. Vielleicht ist es jetzt Druckername an Servername, wie es in Windows oder Office ist.

himitsu 15. Jul 2022 10:15

AW: Windows 11 Standarddrucker ändern
 
Zitat:

Zitat von WriteProfileString
Note: This function is provided only for compatibility with 16-bit versions of Windows. Applications should store initialization information in the registry.

Alleine dass dir die (scheinbar nicht gelesene) Hilfe seit Jahrzehnten etwas versucht zu sagen, sollte dir bei deinem alten Code arg zu Denken geben.

Zeugs in der Win.ini , obwohl Vieles seit Jahrzehnten in der Registry liegt.
Irgendwann wird sich der Hersteller sagen: Jetzt habe ich jahrzehnte lange altes Zeugs noch ausgewertet ... langsam ist Schluß, weg damit ... wer das immernoch nutzt, ist selber Schuld.



MSDN-Library durchsuchenSetDefaultPrinter
Und auch hier sagt dir die Hilfe etwas.
Zitat:

Unterstützte Mindestversion : Windows 2000 Professional
Alles vor 2000 ist schon lange mehr als tot
2000 is tot
XP ist tot
Vista ist tot
7 ist tot
8 ist tot
die ersten drei oder vier Unterversionen der 10 sind bereits ausgestorben (Support ausgelaufen)

Wer kommt da jetzt auf die Idee LagacyCode einzubauen, für den Fall, dass es diese Funktion noch nicht geben sollte?



Aber daß und warum dein Code nicht funktioniert, ist sowas von klar.

SetDefaultPrinterA und PChar .... ähhhhh, also seit Delphi 2009 PChar=PWideChar und String=WideString UnicodeSting

KodeZwerg 15. Jul 2022 10:18

AW: Windows 11 Standarddrucker ändern
 
SetDefaultPrinter
Zitat:

**\\server\**printername
Zitat:

For a local printer, the name format is printername
Irgendwie finde ich weder "setdefaultprinterA" noch "setdefaultprinterW"

peterbelow 15. Jul 2022 10:20

AW: Windows 11 Standarddrucker ändern
 
Zitat:

Zitat von wuff01 (Beitrag 1508801)

Die 2 folgende Variante welche man häufig im Internet findet, bringt bei mir unter Windows 10 & 11 den Fehler 'Systemfehler. Code: 1801.
Der Druckername ist unzulässig'

Delphi-Quellcode:
 procedure SetWinDefaultPrinter(const Name: String);
  var
    fnSetDefaultPrinter: function(pszPrinter: PChar): Bool; stdcall;
    H: THandle;
    Size, Dummy: Cardinal;
    PrinterInfo: PPrinterInfo2;
begin
   if (Win32Platform = VER_PLATFORM_WIN32_NT) and (Win32MajorVersion >= 5) then begin
     @fnSetDefaultPrinter := GetProcAddress(GetModuleHandle(winspl), 'SetDefaultPrinterA');
Hat jemand einen Tipp für mich?

Hast Du das mal mit SetDefaultPrinterW versucht? Schließlich ist pChar schon seit D2006 PWidechar...

himitsu 15. Jul 2022 10:22

AW: Windows 11 Standarddrucker ändern
 
D2009 :angle:


aber ist schon soooooooo lange her ... aus heutiger Sicht fast das Gleiche

wuff01 15. Jul 2022 11:30

AW: Windows 11 Standarddrucker ändern
 
okay, ich schaue mir mal SetDefaultPrinterW an. Danke.

himitsu 15. Jul 2022 11:34

AW: Windows 11 Standarddrucker ändern
 
PS:
Delphi-Quellcode:
unit Winapi.WinSpool;

...

function SetDefaultPrinter; external winspl name 'SetDefaultPrinterW' delayed;
function SetDefaultPrinterA; external winspl name 'SetDefaultPrinterA' delayed;
function SetDefaultPrinterW; external winspl name 'SetDefaultPrinterW' delayed;
XE noch nicht, aber in 10.x isses schon drin

wuff01 15. Jul 2022 11:40

AW: Windows 11 Standarddrucker ändern
 
:thumb:Funktioniert, danke.


Alle Zeitangaben in WEZ +1. Es ist jetzt 02:32 Uhr.

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz