AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Windows 11 Standarddrucker ändern

Ein Thema von wuff01 · begonnen am 15. Jul 2022 · letzter Beitrag vom 15. Jul 2022
Antwort Antwort
wuff01

Registriert seit: 8. Okt 2007
9 Beiträge
 
#1

Windows 11 Standarddrucker ändern

  Alt 15. Jul 2022, 06:57
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?

Geändert von TBx (15. Jul 2022 um 07:01 Uhr) Grund: Delphi-Tags eingefügt
  Mit Zitat antworten Zitat
Redeemer

Registriert seit: 19. Jan 2009
Ort: Kirchlinteln (LK Verden)
1.018 Beiträge
 
Delphi 2009 Professional
 
#2

AW: Windows 11 Standarddrucker ändern

  Alt 15. Jul 2022, 10:10
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.
Janni
2005 PE, 2009 PA, XE2 PA
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
43.157 Beiträge
 
Delphi 12 Athens
 
#3

AW: Windows 11 Standarddrucker ändern

  Alt 15. Jul 2022, 10:15
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
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests

Geändert von himitsu (15. Jul 2022 um 11:44 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von KodeZwerg
KodeZwerg

Registriert seit: 1. Feb 2018
3.685 Beiträge
 
Delphi 11 Alexandria
 
#4

AW: Windows 11 Standarddrucker ändern

  Alt 15. Jul 2022, 10:18
SetDefaultPrinter
Zitat:
**\\server\**printername
Zitat:
For a local printer, the name format is printername
Irgendwie finde ich weder "setdefaultprinterA" noch "setdefaultprinterW"
Gruß vom KodeZwerg
  Mit Zitat antworten Zitat
peterbelow

Registriert seit: 12. Jan 2019
Ort: Hessen
672 Beiträge
 
Delphi 11 Alexandria
 
#5

AW: Windows 11 Standarddrucker ändern

  Alt 15. Jul 2022, 10:20

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...
Peter Below
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
43.157 Beiträge
 
Delphi 12 Athens
 
#6

AW: Windows 11 Standarddrucker ändern

  Alt 15. Jul 2022, 10:22
D2009


aber ist schon soooooooo lange her ... aus heutiger Sicht fast das Gleiche
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat
wuff01

Registriert seit: 8. Okt 2007
9 Beiträge
 
#7

AW: Windows 11 Standarddrucker ändern

  Alt 15. Jul 2022, 11:30
okay, ich schaue mir mal SetDefaultPrinterW an. Danke.
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
43.157 Beiträge
 
Delphi 12 Athens
 
#8

AW: Windows 11 Standarddrucker ändern

  Alt 15. Jul 2022, 11:34
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
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests

Geändert von himitsu (15. Jul 2022 um 11:37 Uhr)
  Mit Zitat antworten Zitat
wuff01

Registriert seit: 8. Okt 2007
9 Beiträge
 
#9

AW: Windows 11 Standarddrucker ändern

  Alt 15. Jul 2022, 11:40
Funktioniert, danke.
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 10:07 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz