Bonjour,
Le bout de code ci-dessous permet de renommer un imprimante. Cela fonctionne bien sous XP mais sous Vista le SetPrinter génère une erreur "échec de l'appel de procédure distante 1726" puis le spooler imprimante Vista plante.
Je ne sais pas si OpenPrinter2() permet de résoudre ce problème car cette fonction n'existe pas sous mon Turbo 2006 avec XP.
Avez vous une idée ?
Merci.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53 procedure TForm1.FormCreate(Sender: TObject); var dwSpaceNeeded: DWORD; lpPrintInfo2: PPrinterInfo2; hPrinter: THandle; IndPrinter, IndPrinter2 : Integer; pd : TPrinterDefaults; begin pd.DesiredAccess := PRINTER_ALL_ACCESS; pd.pDatatype := nil; pd.pDevMode := nil; IndPrinter := Printer.Printers.IndexOf('imprimante1'); if IndPrinter >=0 then // imprimante1 existe begin // Set structure memory to nil lpPrintInfo2:=nil; // Resource protection try // Open the printer if (OpenPrinter(PChar(Printer.Printers[IndPrinter]), hPrinter, @pd)) then begin // Get required memory size GetPrinter(hPrinter, 2, lpPrintInfo2, 0, @dwSpaceNeeded); // Allocate memory lpPrintInfo2:=AllocMem(dwSpaceNeeded); // Get printer info GetPrinter(hPrinter, 2, lpPrintInfo2, dwSpaceNeeded, @dwSpaceNeeded); lpPrintInfo2.pPrinterName := PChar('imprimante2'); lpPrintInfo2.pComment := PChar('tutu'); // Set printer if not SetPrinter(hPrinter, 2, lpPrintInfo2, 0) then begin // Display error information ShowMessage('Erreur Renommage'+ SysErrorMessage(GetLastError) + inttostr(GetLastError)); end; // Close the printer Closeprinter(hPrinter); end else // if OpenPrinter begin ShowMessage('Probleme ouverture imprimante 1'+ SysErrorMessage(GetLastError) + inttostr(GetLastError)); end; finally // Free memory if assigned if Assigned(lpPrintInfo2) then FreeMem(lpPrintInfo2); end; end.
Partager