Utilizando DLL's no Python com ctype

Com o crescimento da complexidade dos sistemas em informática, cada vez mais, programadores tendem a utilizar arquivos disponibilizados, neste caso, principalmente por empresas, onde contem informações de acesso direto a seus produtos.

Neste exemplo, utilizaremos duas das principais DLL's em uso no mercado de desenvolvimento de software coorporativo. São elas:

DllInscE32.dll: Disponibilizada pelo governo através do link: http://www.sintegra.gov.br/DLL3.zip. Sendo responsável pela verificação da validade de qualquer Inscrição Estadual existente no pais.

Inscrição Estadual é o registro do contribuinte ao cadastro do ICMS - Imposto sobre Operações relativas à Circulação de Mercadorias e Prestação de Serviços de Transporte Interestadual e Intermunicipal e de Comunicação, e assim o contribuinte passa a ter seu registro junto à Receita Estadual do seu respectivo estado.
BemaFI32.dll: Disponibilizada pela Bematech, empresa especializada em Automação Comercial, utilizada por diversos sistemas empresariais, realizando uma perfeita integração entre o hardware disponibilizado pela Bematech e os softwares que interagem com os dispositivos.

Um dos inconvenientes do uso de DLL's é o vinculo com os sistemas Windows, mas fica para uma próxima etapa o uso de ferramentas similares para o mesmo propósito.

Para iniciarmos basta copiar as DLL's apresentadas para diretório:
C:\Windows\System32.

Utilizaremos o módulo ctype do Python que é responsável por compatibilizar e possibilitar chamar funções em DLL's ou bibliotecas compartilhadas.

Em nosso primeiro exemplo estará em uso a DLL BemaFI32.dll disponibilizada pela Bematech com o intuito da Abertura da Gaveta de uma ECF - Emissor de Cupom Fiscal. Já no segundo, apresentaremos a DLLInscE32.dll contendo uma rotina muito útil para validação de Inscrição Estadual, visto que, ela aborta todos os casos possíveis de acontecer.

Obs.: Para maiores informações sobre as funções existentes nestas DLL's, favor conferir a documentação disponível pelas empresas.
Usaremos em ambos os scritps apenas um função de cada DLL, afim de , exemplificar seu uso.

Bematech_FI_VerificaEstadoGaveta(): Abre a gaveta de dinheiro de uma ECF, retornando um valor inteiro como saída da operação.

ConsisteInscricaoEstadual(inscrição, estado): Recebe como argumento a Inscrição Estadual(em string e sem pontos) e a UF – Unidade Federativa(string e maiúscula) e retorna 0 caso a inscrição for válida e 1 caso contrário.
Exemplo 1:
#!/usr/bin/env python

# AUTHOR: Jose Mauro da Silva Sandy - http://informacaocomdiversao.blogspot.com
#
# CONTACT: jmsandy _at_ gmail _dot_ com
#
# DATE: 2008-10-22
###############################################################################

import ctypes

library = ctypes.WinDLL("C:\Windows\System32\BemaFI32.dll")
ret = library.Bematech_FI_AcionaGaveta()

if ret == -27:
   print "Status da impressora diferente de 6,0,0 (ACK, ST1 e ST2)"

elif ret == -5:
   print "Erro ao abrir a porta de comunicacao"

elif ret == -4:
   print "O arquivo de inicializacao BemaFI32.ini nao foi encontrado no\
   diretorio de sistema do Windows"

elif ret == 0:
   print "Erro de comunicacao"

else:
   print "ABRIU"
Exemplo 2:
#!/usr/bin/env python

# AUTHOR: Jose Mauro da Silva Sandy - http://informacaocomdiversao.blogspot.com
#
# CONTACT: jmsandy _at_ gmail _dot_ com
#
# DATE: 2008-10-22
###############################################################################
import ctypes

lib = ctypes.WinDLL("C:\Windows\System32\DllInscE32.dll")

try: 
    estado = raw_input("Digite o estado:")
    inscricao = raw_input("Digite a inscricao(somente numeros):")

    resultado = lib.ConsisteInscricaoEstadual(inscricao,estado)

    if not resultado:
        print "Inscricao valida"

    else:
        print "Inscricao invalida"

except:
    print "Erro de conversao"

Maiores informaçoes em ctype, BemaFI32.dll e DLLInscE32.DLL,


José Mauro da Silva Sandy

2 comentários:

  Lopes

23 de outubro de 2008 às 07:42

Gostei da postagem. Mostra como é simples a utilização de DLLs em Python. Por curiosidade, acessei os 2 sites (Sintegra e Bematech) e percebi que, infelizmente, o Sintegra só disponibiliza arquivos para Windows e de forma fechada, o que é uma pena. Normalmente é bom saber como módulos de terceiros funcionam... Já a Bematech tem uma sessão de Unix. Será que a forma de importação e uso da mesma é semelhante em sistemas Unix-like, como Linux, BSD e OS X? Seria interessante que sim. No mais, gostei da abordagem e dos códigos de exemplo.
Abraço!

  Unknown

1 de julho de 2013 às 22:34

Excelente post! Estou precisando fazer o download da mfd e tratá-la!
Tem como fazer em Python ?