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 :
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
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 );
II) Ensuite j'ai créé la classe Imprimer (avec, en dur pour l'instant, 1000 caractères à imprimer)
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 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 ""; } }
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 ...) ?
Partager