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 ?

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.
Merci.