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

C# Discussion :

Imprimer sur port USB (avec USBLib) - Bloqué avec l'overlapp


Sujet :

C#

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Juin 2009
    Messages
    122
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2009
    Messages : 122
    Par défaut Imprimer sur port USB (avec USBLib) - Bloqué avec l'overlapp
    Bonjour,

    On m'a demandé de pouvoir imprimer sur des petites imprimantes avec un cable USB directement. Pour cela, j'ai cherché ce qui existait et je n'ai pas trouvé d'exemple complet.

    I) J'ai donc repris une super class qui gère bien l'USB (mais pas l'impression) (USBLib). J'ai essayé de la compléter comme suit :

    Code Déclaratif : 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
     
            const int GENERIC_READ = 0x8000000;
            const int FILE_SHARE_READ = 0x1; 
            const int FILE_SHARE_WRITE = 0x2;
            const int FILE_ATTRIBUTE_NORMAL = 0x80;
            const int OPEN_ALWAYS = 0x4;
     
            const int FILE_FLAG_SEQUENTIAL_SCAN = 0x08000000;
            const int FILE_FLAG_OVERLAPPED = 0x40000000;
     
            [DllImport("kernel32.dll")]
            static extern bool WriteFile(
                IntPtr hFile, 
                byte[] lpBuffer,
                uint nNumberOfBytesToWrite, 
                out uint lpNumberOfBytesWritten,
               [In] ref System.Threading.NativeOverlapped lpOverlapped
            );
    NB : Je ne vous ai mis que ce qu'il y a de nouveau dans cette Lib pour pouvoir imprimer. J'ai trouvé ce code sur pinvoke.net

    II) Ensuite j'ai créé la classe Imprimer (avec, en dur pour l'instant, 1000 caractères à imprimer)
    Code Classe Imprimer : 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
    54
    55
            public class USBImprimer
            {
                internal string myfname;
                internal byte[] myAnArray;
     
                public USBImprimer()
                {
                    myfname = "";
                    myAnArray = null;
                }
                public string fname
                {
                    get { return myfname; }
                }
     
                public byte[] AnArray
                {
                    get { return myAnArray; }
                }
     
                // string fname, byte[] AnArray
                public string Print()
                {
                    IntPtr fHandle;
                    bool fSuccess;
                    uint lBytesWritten;
                    uint BytesToWrite;
     
                    myfname = fname;
                    myAnArray = AnArray;
     
                    //BytesToWrite = AnArray.Length + 1;
                    BytesToWrite = 1000;
     
                    // Overlapp (chinois)
                    System.Threading.NativeOverlapped olWrite = new System.Threading.NativeOverlapped();
     
                    // fHandle = CreateFile(fname, GENERIC_READ | GENERIC_WRITE, FILE_SHARE_READ | FILE_SHARE_WRITE, IntPtr.Zero, OPEN_ALWAYS, FILE_ATTRIBUTE_NORMAL | FILE_FLAG_SEQUENTIAL_SCAN | FILE_FLAG_OVERLAPPED, IntPtr.Zero);
                    fHandle = CreateFile(fname, GENERIC_WRITE, FILE_SHARE_WRITE, IntPtr.Zero, OPEN_ALWAYS, FILE_ATTRIBUTE_NORMAL, IntPtr.Zero);
     
                    if (fHandle.ToString() != INVALID_HANDLE_VALUE.ToString())
                    {
                        fSuccess = WriteFile(fHandle, AnArray, BytesToWrite, out lBytesWritten, ref olWrite);
                        //if (fSuccess == true)
                        //{
                        //    fSuccess = FlushFileBuffers(fHandle);
                        //}
                        //else
                        //{
                        //    fSuccess = CloseHandle(fHandle);
                        //}
                    }
                    return "";
                }
            }
    III) Pour finir, j'appele la fonction dans un formulaire en mettant pour l'instant une chaine de 1000 caractères de 1 et 2 :
    Code Test dans formulaire : 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
    Using USBLib;
    MaFonctionQueVousPouvezMettreDansUnBouton{
                    USB.USBHub Hub = host.GetRootHub();
                    foreach (USB.USBPort port in Hub.GetPorts())
                    {
                        USB.USBDevice device = port.GetDevice();
                        if (port.IsDeviceConnected == true)
                        {
                            string manuf = device.Manufacturer;
                            if (manuf == "MaMarque")
                            {
                                pathMaMarque = device.DeviceHubDevicePath;
                                pMaMarque = pnumb;
                                bMaMarque = true;
     
                                char cCommand1, cCommand2, cTermChar;
                                byte[] cAllCommand = new byte[1000];
                                for(int i = 0; i<500;i+=2)
                                {
                                    cAllCommand[i] = Convert.ToByte('1');
                                    cAllCommand[i + 1] = Convert.ToByte('2');
                                }
                                cAllCommand[999] = Convert.ToByte('\n');
     
     
                                USB.USBImprimer Pool = new USB.USBImprimer();    
                                Pool.myAnArray = cAllCommand;
                                Pool.myfname = pathMaMarque;
                                Pool.Print();
     
                            }
                        }
                    }
    }

    Le problème sur lequel je bute pour l'instant se trouve dans le § II) où fSucces me renvoi false. Autrement dit, j'ai bien un handle (mais est-ce le bon ?) et quand j'essaye d'envoyer une impression j'ai pas de retour de valeur sur lByteWritten.

    Il y a pour cela au moins une raison (et j'imagine qu'il y en a d'autres malheureusement), c'est ce qui concerne l'overlapp (§ II) ou j'ai mis entre parenthèses que c'est du chinois pour moi).

    Est-ce que l'un de vous pourrait me confirmer que le problème est dans l'overlapp ou dans autre chose que je n'aurais pas vu (buffer, fermeture handle, etc ...) ?

  2. #2
    Membre confirmé
    Profil pro
    Inscrit en
    Juin 2009
    Messages
    122
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2009
    Messages : 122
    Par défaut
    Comme j'ai conscience que le sujet n'est pas forcément très simple à appréhender, je vous ai mis ci dessous deux choses qui pourront faciliter votre aide :

    - Tout d'abord, quelqu'un qui a eu un problème similaire, avec plus de succès apparament puisque lui semble y être arrivé. Sujet sur Dreamcode.net

    - Ensuite, je vous mets le code source complet que j'ai fait sur ce sujet. Vous pouvez le télécharger ici.

    Je suis ouvert à toute(s) suggestion(s) constructive(s) et je remercie par avance tout ceux qui auront pris du temps pour m'aider. Là je suis vraiment bloqué, et je ne sais plus trop quoi faire.

Discussions similaires

  1. imprimer sur une imprimante bluetooth ou wifi avec du javascript
    Par cotede2 dans le forum Général JavaScript
    Réponses: 7
    Dernier message: 15/05/2009, 13h11
  2. Réponses: 5
    Dernier message: 12/06/2007, 17h52
  3. Envoyer une trame sur port USB
    Par Bocci dans le forum VB 6 et antérieur
    Réponses: 1
    Dernier message: 15/03/2007, 21h07
  4. Compatibilité clé usb 2.0 sur port usb 1.0 de mon portable?
    Par coubi64 dans le forum Périphériques
    Réponses: 2
    Dernier message: 22/10/2003, 18h57
  5. [TP]Impression sur port USB
    Par haypo dans le forum Turbo Pascal
    Réponses: 3
    Dernier message: 18/07/2003, 11h09

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