none
Problemas em retornar strings da BemaFI32.dll RRS feed

  • Pergunta

  • Saudações a todos

    depois de alguns meses (120 para ser exato), estou retomando a programação de aplicativos comerciais.

    Retomando um caso para as impressoras fiscais Bematech, estou me adaptando à DLL BemaFI32.dll, que permite o retorno de informações da impressora via strings (eu uso Delphi para programar).

    Obter o retorno pelos arquivos eu faço normalmente, pois isso que se fazia no tempo na MP20FI.dll, e continua funcionando agora também, mas eu desejo utilizar as variáveis nas funções, pois é sem dúvida uma forma mais elegante.

    No entanto, quando uso esse método, o retorno (iret) volta corretamente (-1), mas não há alteração das strings:

    Segue abaixo o código que uso como teste:

    ---------------------------------------------------------
    unit Unit1;

    interface

    uses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs, StdCtrls;

    type
      TForm1 = class(TForm)
        Button1: TButton;
        Button2: TButton;
        procedure Button2Click(Sender: TObject);
        procedure Button1Click(Sender: TObject);
      private
        { Private declarations }
      public
        { Public declarations }
      end;

    var
      Form1: TForm1;

    implementation

    uses MyBemaFI32; //essa unit é a cópia das declarações em Delphi a partir do help da DLL

    {$R *.dfm}

    procedure TForm1.Button1Click(Sender: TObject);

    var iret: integer;
        NS: string;

    begin
      NS:='';
      Bematech_FI_AbrePortaSerial;
      iret:= Bematech_FI_ImprimeConfiguracoesImpressora;
      Form1.Caption:=inttostr(iret) + ' --  '+NS;
      Bematech_FI_FechaPortaSerial;
    end;

    procedure TForm1.Button2Click(Sender: TObject);

    var P:pchar;
       iret: integer;
       S: string;

    begin
       S:='******************';
       p:='******************';
       Bematech_FI_AbrePortaSerial;
       iret:= Bematech_FI_NumeroSerie(pchar(S)); // com P no lugar de pchar(S) também não funciona
      Form1.Caption:=inttostr(iret) + ' --  '+string(P)+S;
      Bematech_FI_FechaPortaSerial;

    end;

    end.
    ------------------------------------------------------------------------------------

    O Button1, funciona 100%, imprimindo as cfgs. no emulador. Mas o Button2 retorna o status 1, mas não há alteração dos '********' na string.

    Já quando acerto o BemaFi32.ini para sair em arquivos, tudo dá certo, ou seja, no arquivo as respostas estão corretas.

    o arquivo .ini está assim (parcial, inicio):

    -----------------------------------------------------------------
    ;----------------------------------------------------------------------------;
    ;                                                                            ;
    ;  BEMAFI32.INI                                                              ;
    ;  Ver 5.6.0.0 - Julho/2007                                                  ;
    ;                                                                            ;
    ;  Arquivo de inicializacao da dll BemaFI32 para as impressoras fiscais      ;
    ;  MP-20 FI II, MP-40 FI II, MP-2000 FI TH, MP-2100 TH FI, MP-3000 TH FI     ;
    ;  MP-6000 FI TH, MP-25 FI, MP-50 FI da Bematech e Y-8000 e Y-8500 da Yanco  ;
    ;                                                                            ;
    ;----------------------------------------------------------------------------;

    [Sistema]
    Porta=DEFAULT
    Path=C:\
    Status=0
    Retorno=0
    StatusFuncao=0
    ControlePorta=1
    ModeloImp=BEMATECH
    ConfigRede=0
    ModoGaveta=0
    Log=0
    LogDiario=0
    CrLfVinculado=1
    CrLfGerencial=1
    TimeOutGerencial=40
    EmulMFD=1
    StatusCheque=


    [MFD]
    Impressora=0
    StatusErro=1
    TimeOutZ=3


    [Opcional]
    Favorecido=
    Cidade=

    [SoftwareHouse]
    COO=
    NumeroAplicativo=
    CNPJ=
    IE=
    IM=
    RazaoSocial=
    NomeAplicativo=
    Versao=
    Linha1=
    Linha2=

    -------------------------------------------------

    Alguém pode me dar uma luz? Onde será que estou errando?

    Agradeço a que puder me ajudar a desenferrujar....

    Aron L. Petrucci

    sexta-feira, 26 de junho de 2009 01:38

Todas as Respostas

  • Olá Aron,

    Experimente usar a função assim:

    SetLength( NumeroSerie, 15 );
    iRetorno := Bematech_FI_NumeroSerie( NumeroSerie );

    Detalhe:

    Como vc está usando o emulador da impressora fiscal térmica, o número de série retornado será a palavra "EMULADOR", porém para vc deixar a aplicação já preparada para o uso da impressora, o ideal é que vc use a função Bematech_FI_NumeroSerieMFD que trará 20 bytes do número serial real da impressora. Esta função tbm pode ser usada no emulador para os testes.

    SetLength( NumeroSerie, 20 );
    iRetorno := Bematech_FI_NumeroSerieMFD( NumeroSerie );

    Habilte tbm no arquivo BemaFI32.ini a chave Impressora para 1, pois assim as funções que possuem a sigla MFD terão o efeito adequado.

    Ats,
    André Munhoz
    andre.munhoz@bematech.com.br

    sexta-feira, 26 de junho de 2009 13:07
  • André,

    agradeço muito pela solução do problema.

    Sua sugestão funcionou corretamente.

    Quanto à emulação MFD devo levar em conta que ainda tenho MP20FI na ativa por um bom tempo, sendo assim devo prever as duas situações..


    Grato

    Aron

    sexta-feira, 26 de junho de 2009 13:53
  • Oi Aron,

    Neste caso sim, pois as funções que possuem a sigla "MFD" somente estão disponíveis para as impressoras novas MP-25 FI (por exemplo) e térmicas.

    Ats,
    André

     

    sexta-feira, 26 de junho de 2009 18:07