msdn27_capa.jpg

Clique aqui para ler todos os artigos desta edição

 

Imprimindo em impressoras matriciais com .NET

Carlos Dos Santos

Este artigo discute

Este artigo usa as seguintes tecnologias

·        Impressão matricial;

·        Programação com API.

·        Visual Studio 2003, C#.

 

Em tempos de impressoras jato de tinta e laser, ainda temos a necessidade de imprimir nas boas e velhas impressoras matriciais, seja por economia ou por necessidade, já que para emitir notas fiscais, elas são consideradas a opção mais econômica.

O problema

O Microsoft .NET Framework não dispõe de uma classe nativa para acessar a porta da impressora diretamente (LPT), e para quem já tentou abrir a porta como se fosse um arquivo, deve ter tido uma grande decepção, pois o ambiente gerenciado não permite acesso direto ao hardware.

Na versão 2.0 do Microsoft .NET Framework, a porta serial ganhou uma classe para acesso, mas a porta paralela ainda não tem acesso nativo. Então como resolver o problema? Como fazer minha aplicação imprimir direto na porta paralela, estando em um ambiente gerenciado?

A solução

Como o Microsoft .NET Framework não permite acesso diretamente à porta paralela (LPT1, LPT2), teremos que usar duas funções da API do Windows que permitem a abertura e fechamento da porta, sendo elas: CreateFileA() e CloseHandle(), que serão declaradas em nossa classe da seguinte maneira:

 

using System.Runtime.InteropServices;

...

...

[DllImport("kernel32.dll",EntryPoint="CreateFileA")]

static extern int CreateFileA(string lpFileName,int dwDesiredAccess, int dwShareMode,

                                   int lpSecurityAttributes,

                                   int dwCreationDisposition, int dwFlagsAndAttributes,

                                   int hTemplateFile);

           

[DllImport("kernel32.dll",EntryPoint="CloseHandle")]

static extern int CloseHandle(int hObject);

 

Dica: Através da diretiva DllImport, podemos acessar rotinas presentes em DLLs, tais como a Kernel32.dll, onde estão algumas das rotinas que controlam as funcionalidades do Windows. Essa é uma boa dica se você precisa acessar alguma funcionalidade presente em uma DLL, e não tiver uma interface pronta em .NET. Para fazer isso você deverá conhecer os métodos presentes na DLL.

Criando uma classe para impressão

Agora que já temos as funções para acessar a porta da impressora, vamos criar uma classe chamada ImprimeTexto, onde iremos colocar as funcionalidades para a impressão em modo texto. Para criar uma classe usando o Visual Studio, siga os passos a seguir (para este exemplo estamos usando o Visual Studio 2003, mas isso poderá ser feito também no Visual Studio 2005).

Adicione uma nova classe e dê o nome de ImprimeTexto.cs (menu Project/Add Class), conforme a Figura 1. Agora com a classe criada, faça as modificações de acordo com as listagens seguintes. Na Listagem 1 temos a definição da classe, com as variáveis internas e as funções da API do Windows. A Tabela 1 descreve as variáveis utilizadas no código.

 

image002.jpg

Figura 1. Criando uma classe para impressão de texto

Listagem 1. Código da classe ImprimeTexto

public class ImprimeTexto

{

    private int GENERIC_WRITE = 0x40000000;  

    private int OPEN_EXISTING = 3;                     

    private int FILE_SHARE_WRITE = 0x2;             

    private string sPorta;                                     

    private int hPort;                                 ...

Quer ler esse conteúdo completo? Tenha acesso completo