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/)
-   -   Delphi Drucker entfernen (https://www.delphipraxis.net/193586-drucker-entfernen.html)

TUX_der_Pinguin 17. Aug 2017 11:22

Drucker entfernen
 
Hallo DPler,

ich versuche mich gerade an einer Möglichkeit Drucker aus einer eigenen Anwendung heraus zu entfernen. Ich habe da auf Delphi-Treff etwas passendes gefunden, jedoch funktioniert das nicht.
Delphi-Quellcode:
function PE_DeletePrinterNow(pPrinterName: PChar):BOOL;
var
hPrinter : Cardinal;
PrinterDef: PRINTER_DEFAULTS;
begin
  Result := FALSE;

   FillChar(PrinterDef, sizeof(PrinterDef), #0);
   PrinterDef.DesiredAccess := PRINTER_ALL_ACCESS;

   if OpenPrinter(pPrinterName, hPrinter, @PrinterDef) then
   begin
    if DeletePrinter(hPrinter) then Result := TRUE;
    ClosePrinter(hPrinter);
   end;
end;
Auflistung aller Drucker im System
Delphi-Quellcode:
procedure TForm2.FormCreate(Sender: TObject);
var
  Index: Integer;
 
begin
  for Index := 0 to Printer.Printers.Count-1 do
  begin
    ListBox1.Items.Add(Printer.Printers[Index]);
  end;
   
end;
Drucker entfernen
Delphi-Quellcode:
procedure TForm2.Button1Click(Sender: TObject);
begin
  if RemovePrinter(ListBox1.Items[ListBox1.ItemIndex]) then
    ShowMessage('Ok')
  else
    ShowMessage('Failed');
end;
Merkwürdig ist das beim ersten Versuch die Funktion einen Erfolg meldet, der Drucker bleibt aber im System erhalten, danach schlägt der jeder erneute Aufruf fehl. Probiert habe ich das ganze unter Windows 7, später soll die Software aber hauptsächlich unter Windows 10 laufen.

bra 17. Aug 2017 11:52

AW: Drucker entfernen
 
Versuche mal, ob der Drucker verschwindet, wenn du die Druckerwarteschlange neustartest.

himitsu 17. Aug 2017 12:38

AW: Drucker entfernen
 
Zitat:

Zitat von TUX_der_Pinguin (Beitrag 1378920)
Merkwürdig ...

Die Frage wäre ja, was beim zweiten Mal fehl schlägt ... OpenPrinter oder DeletePrinter.
Vermutlich OpenPrinter, weil der Printer ja gelöscht ist. :stupid:


Aber ein Boolean sagt ja nun überhaupt nichts darüber aus, was nicht ging und vorallem warum es nicht gin. :roll:
Delphi-Quellcode:
procedure PE_DeletePrinterNow(PrinterName: string);
var
  hPrinter : Cardinal;
  PrinterDef: PRINTER_DEFAULTS;
begin
  FillChar(PrinterDef, SizeOf(PrinterDef), #0);
  PrinterDef.DesiredAccess := PRINTER_ALL_ACCESS;
  if not OpenPrinter(PChar(PrinterName), hPrinter, @PrinterDef) then
    RaiseLastOSError;
  try
    if not DeletePrinter(hPrinter) then
      RaiseLastOSError;
  finally
    ClosePrinter(hPrinter);
  end;
end;

TUX_der_Pinguin 17. Aug 2017 12:38

AW: Drucker entfernen
 
Zitat:

Zitat von bra (Beitrag 1378927)
Versuche mal, ob der Drucker verschwindet, wenn du die Druckerwarteschlange neustartest.

Ich weiß zwar nicht wie ich das aus dem Programm heraus machen soll aber ich habe auch mal den Rechner komplett neugestartet und alle Drucker waren noch vorhanden. Wird ja wohl kaum eine zeitliche Begrenzung sein, dass der Drucker nur zum löschen markiert wird und wird innerhalb von X Sekunden/Minuten die Druckerwarteschlange neugestartet dann wird der Drucker tatsächlich gelöscht.

TUX_der_Pinguin 17. Aug 2017 12:50

AW: Drucker entfernen
 
Zitat:

Zitat von himitsu (Beitrag 1378932)
Zitat:

Zitat von TUX_der_Pinguin (Beitrag 1378920)
Merkwürdig ...

Die Frage wäre ja, was beim zweiten Mal fehl schlägt ... OpenPrinter oder DeletePrinter.
Vermutlich OpenPrinter, weil der Printer ja gelöscht ist. :stupid:


Aber ein Boolean sagt ja nun überhaupt nichts darüber aus, was nicht ging und vorallem warum es nicht gin. :roll:
Delphi-Quellcode:
procedure PE_DeletePrinterNow(PrinterName: string);
var
  hPrinter : Cardinal;
  PrinterDef: PRINTER_DEFAULTS;
begin
  FillChar(PrinterDef, SizeOf(PrinterDef), #0);
  PrinterDef.DesiredAccess := PRINTER_ALL_ACCESS;
  if not OpenPrinter(PChar(PrinterName), hPrinter, @PrinterDef) then
    RaiseLastOSError;
  try
    if not DeletePrinter(hPrinter) then
      RaiseLastOSError;
  finally
    ClosePrinter(hPrinter);
  end;
end;

Es schlägt DeletePrinter() fehl und nicht OpenPrinter() mit der Fehlermeldung ..
Zitat:

Systemfehler. Code: 1801.
Der Druckername ist unzulässig.
Eigentlich müsste ja OpenPrinter fehlschlagen tut es aber nicht und zu allem überfluss ist der Drucker immer noch vorhanden. :gruebel::gruebel::gruebel:

himitsu 17. Aug 2017 12:58

AW: Drucker entfernen
 
Was genau willst du eigentlich löschen, bzw. was soll dadurch erreicht werden?

Zitat:

The DeletePrinter function deletes the specified printer object.
Hmmm, DeletePrinter löscht nicht den Printer, also den Treiber,
sondern nur eines der "vielen" Schnittstellenobjekte.

DeletePrinter ist nur die Umkehrfunktion vom AddPrinter.
https://msdn.microsoft.com/de-de/lib...(v=vs.85).aspx

TUX_der_Pinguin 17. Aug 2017 13:03

AW: Drucker entfernen
 
Zitat:

Zitat von himitsu (Beitrag 1378937)
Was genau willst du eigentlich löschen, bzw. was soll dadurch erreicht werden?

Zitat:

The DeletePrinter function deletes the specified printer object.
Hmmm, DeletePrinter löscht nicht den Printer, also den Treiber,
sondern nur eines der "vielen" Schnittstellenobjekte.

DeletePrinter ist nur die Umkehrfunktion vom AddPrinter.
https://msdn.microsoft.com/de-de/lib...(v=vs.85).aspx

Das nur das Objekt gelöscht wird habe ich übersehen bzw. es stand nicht dabei wo ich das Beispiel gefunden habe. Ich will eigentlich einen Drucker aus dem System entfernen.

himitsu 17. Aug 2017 13:25

AW: Drucker entfernen
 
https://msdn.microsoft.com/en-us/lib...(v=vs.85).aspx
vermutlich DeletePrintDriver

TUX_der_Pinguin 17. Aug 2017 14:21

AW: Drucker entfernen
 
Zitat:

Zitat von himitsu (Beitrag 1378942)

Zitat:

The DeletePrinterDriver function removes the specified printer-driver name from the list of names of supported drivers on a server.
...
DeletePrinterDriver deletes a driver only if no version of the driver is in use for the specified environment. DeletePrinterDriverEx can delete specific versions of the driver.
Vielleicht ist mein Englisch zu schlecht aber das liest sich jetzt auch nicht unbedingt so als würde man damit einen Drucker entfernen können. Werde dann wohl erst mal aufgeben und es dabei belassen.

Sherlock 21. Aug 2017 08:00

AW: Drucker entfernen
 
Naja, mehr als den Treiber wirst Du in Software niemals los werden können, es sei denn Du steuerst damit eine Strahlenkanone oder so. ;)

Sherlock


Alle Zeitangaben in WEZ +1. Es ist jetzt 21:11 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