IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage Delphi Discussion :

Winspool et GetPrinter défaillants


Sujet :

Langage Delphi

  1. #1
    Membre expert

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2007
    Messages
    3 494
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Novembre 2007
    Messages : 3 494
    Points : 3 129
    Points
    3 129
    Par défaut Winspool et GetPrinter défaillants
    Bonjour à tou(te)s

    J'ai besoin de connaître l'état des imprimantes installées sur une machine. Le but est d'interdire une fonctionnalité si une imprimante nécessaire est indisponible.
    Voici mon code:

    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
     
    procedure InfosImprimante(I: Integer; memo: TMemo);
    var
      hPrinter: NativeUInt;
      Device: array[0..255] of char;
      Driver: array[0..255] of char;
      Port:   array[0..255] of char;
      hDeviceMode: NativeUInt;
      bytesNeeded: DWORD;
      pPI: PPrinterInfo6;
      retval: BOOL;
    begin
      Printer.PrinterIndex := I;
      Printer.GetPrinter(Device, Driver, Port, hDeviceMode);
      if not winspool.OpenPrinterW(Device, hPrinter, nil) then
        RaiseLastWin32Error;
      try
        retval := winspool.GetPrinterW(hPrinter, 6, nil, 0, @bytesNeeded);
        If not retval Then
          ShowMessage(SysErrormessage(GetLastError));
        GetMem(pPI, bytesNeeded);
        try
          retval := winspool.GetPrinterW(hPrinter, 6, pPI, bytesNeeded, @bytesNeeded);
          If not retval Then
            RaiseLastWin32Error;
     
          memo.Lines.Add( Printer.Printers[I] + ' = ' + IntToStr(pPI^.dwStatus));
     
        finally
          FreeMem(pPI);
        end;
      finally
        winspool.ClosePrinter(hPrinter);
      end;
    end;
    Problème: La ligne
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    retval := winspool.GetPrinterW(hPrinter, 6, nil, 0, @bytesNeeded);
    déclenche une erreur :

    [Window Title]
    test_imprimantes

    [Content]
    La zone de données passée à un appel système est insuffisante

    [OK]
    et à chaque fois, mon pPI^.dwStatus reste à 0, ce qui est normalement pas possible au regard des valeurs qui peuvent être renvoyées par l'API.

    Quelqu'un aurait une idée sur le problème ?


    Papy !

  2. #2
    Rédacteur/Modérateur
    Avatar de Andnotor
    Inscrit en
    Septembre 2008
    Messages
    5 796
    Détails du profil
    Informations personnelles :
    Localisation : Autre

    Informations forums :
    Inscription : Septembre 2008
    Messages : 5 796
    Points : 13 475
    Points
    13 475
    Par défaut
    Ce qui est somme toute assez logique puisque tu ne lui passes pas de buffer. Enfin... MS nous a habitué à certaines variantes en fonction des fonctions

    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
    winspool.GetPrinter(hPrinter, 6, nil, 0, @bytesNeeded);
     
    if bytesNeeded > 0 then
    begin
      GetMem(pPI, bytesNeeded);
     
      try
        retval := winspool.GetPrinter(hPrinter, 6, pPI, bytesNeeded, @bytesNeeded);
        If not retval Then
          RaiseLastWin32Error;
     
        memo.Lines.Add( Printer.Printers[I] + ' = ' + IntToStr(pPI^.dwStatus));
     
      finally
        FreeMem(pPI);
      end;
    end;

  3. #3
    Membre expert

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2007
    Messages
    3 494
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Novembre 2007
    Messages : 3 494
    Points : 3 129
    Points
    3 129
    Par défaut
    Evidemment, plus de messages si je ne l'affiche pas.

    Mais est-ce normal que je reçoive les réponses suivantes:

    Microsoft XPS Document Writer = 0
    HP LaserJet 200 color MFP M276 PCL 6 = 0
    Epson EPL-6200 = 0

    sachant que la HP et la laser sont des imprimantes réseau et qu'elles sont bien disponibles ??

    Je viens de tester en éteignant l'imprimante epson, ça me renvoie toujours 0 pour le statut

    J'ai aussi une imprimante à tickets installée mais qui a été débranchée, et là ça me renvoi 4096 (valeur qui parait normale)

    Faut-il tester une imprimante réseau d'une autre manière ??

Discussions similaires

  1. [Configuration] Fonction file défaillante
    Par Rodolphe_1940 dans le forum EDI, CMS, Outils, Scripts et API
    Réponses: 1
    Dernier message: 26/07/2006, 10h35
  2. syntaxe imbriquée défaillante
    Par mussara dans le forum Général JavaScript
    Réponses: 6
    Dernier message: 18/07/2006, 14h28
  3. pilotes ou périphs défaillants-mode sans échec
    Par mathieu_r dans le forum Windows Serveur
    Réponses: 6
    Dernier message: 23/03/2006, 12h10
  4. Réponses: 37
    Dernier message: 30/11/2005, 19h41
  5. CD auto executable défaillant à cause DLL introuvable
    Par khyriana dans le forum Autres Logiciels
    Réponses: 10
    Dernier message: 19/09/2005, 17h16

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo