Ruby realmente é mais do que simplesmente programar para a web !
Eu mesmo somente decidi migrar todos os aplicativos da Object Data para Ruby em razão da linguagem ser de aplicação geral.
Nesse artigo mostrarei como acessar bibliotecas ".dll" e ".so" através da DL, biblioteca da Standard API.
Mostraremos como criar um ".so" no linux e no windows acessar um Emissor de Cupom Fiscal - ECF.
|
|
|
Conhecendo as API's de acesso a DLL
|
Incialmente devemos compreender que o acesso a DLL'S em Ruby é feito através de duas API's. A primeira é a Win32API e a segunda é a DL.
A primeira como o próprio nome diz é usada exclusivamente em ambiente Windows, já a segunda é multi-plataforma. A única diferença, nesse último caso, é que em Windows a extensão ficará ".dll" e em Linux e outros Unix ".so".
Ambas fazem parte da Standard API e podem ser acessadas no site ruby-doc.org.
|
|
|
|
Neste artigo iremos utilizar a DL por ser multi-plataforma.
Inicialmente, vamos criar nossa biblioteca em C chamada hellolib.c
|
|
#include <stdio.h>
int imprimir()
{
return printf("hello world ! \n");
}
int somar(int a, int b)
{
return a + b;
}
|
|
|
gcc hellolib.c -shared -o hellolib.so
|
|
|
Acessando através do ruby:
|
irb
irb(main):001:0> require 'dl'
=> true
irb(main):002:0>handle = DL.dlopen('./hellolib.so')
=> #<DL::Handle:0xb7ef1ad4>
irb(main):003:0> result, params = handle['somar', 'III'].call(3, 5)
=> [8, [3, 5]]
irb(main):004:0> result
=> 8
irb(main):005:0> params
=> [3, 5]
Onde 'III' é o retorno mais os parâmetros da dll. Nesse caso se espera um inteiro de retorno e são passados dois inteiros como argumento.
irb(main):006:0> result, params = handle['imprimir', 'I'].call
hello world !
=> [15, []]
Agora temos uma impressão no prompt e apenas um 'I' indicando que o valor de retorno deve ser um inteiro.
|
|
|
Efetuando uma leitura X de um 'ECF'
|
Utilizando DL agora no windows, podemos imprimir uma leitura x de uma impressora fiscal.
Nessa caso estarei usando uma impressora fiscal Elgin veja:
|
|