Boa tarde,
Estamos começando um novo projeto para implementação do PAF em C#, e estou em testes para utilizar o ACBr.NET. Verifiquei que o ACBr32.DLL não possui as funcionalidades para o Espelho MFD, então baixei os fontes do SVN e estou tentando trazer essa funcionalidade da DLL do Delphi para o ACBr.NET. O que eu fiz até o momento foi o seguinte:
Utilizando o Lazarus, eu alterei o arquivo ACBrECFDll.PAS incluindo a seguinte função:
Function ECF_EspelhoMFDArquivo( const ecfHandle: PECFHandle; const DataInicial : double; const DataFinal: double; const NomeArquivo: PChar ) : Integer ;{$IFDEF STDCALL} stdcall; {$ENDIF} {$IFDEF CDECL} cdecl; {$ENDIF} export;
var
Documentos: TACBrECFTipoDocumentoSet;
begin
Documentos := [TACBrECFTipoDocumento.docNenhum];
if (ecfHandle = nil) then
begin
Result := -2;
Exit;
end;
try
ecfHandle^.ECF.EspelhoMFD_DLL( DataInicial, DataFinal, NomeArquivo, Documentos );
Result := 0;
except
on exception : Exception do
begin
ecfHandle^.UltimoErro := exception.Message;
Result := -1;
end
end;
end;
e em seguida joguei no "Exports" o nome da função. Com isso eu consegui importar o essa função no .NET, onde executei as seguintes alterações (Utilizando o Visual Studio 2010):
No ACBrDll.cs eu incluí as seguintes linhas:
[DllImport( "ACBr32.dll", CallingConvention = CallingConvention.Cdecl )]
public static extern int ECF_EspelhoMFDArquivo( IntPtr ecfHandle, double dataInicial, double dataFinal, string nomeArquivo );
em seguida, no arquivo ACBrECF.cs, inclui as seguintes linhas:
public void EspelhoMFD( DateTime dataInicial, DateTime dataFinal, string nomeArquivo )
{
int ret = ACBrDll.ECF_EspelhoMFDArquivo( this.handle, dataInicial.ToOADate(), dataFinal.ToOADate(), ToUTF8( nomeArquivo ) );
CheckResult( ret );
}
depois dessas alterações eu tentei executar esse método no projeto ACBr.Net, alterando o arquivo MainForm.cs:
public void Ativar()
{
try
{
acbrECF.Modelo = (ModeloECF)modeloComboBox.SelectedItem;
acbrECF.Porta = (string)portaComboBox.SelectedItem;
.
.
.
WriteResp("Ativado: OK!");
acbrECF.EspelhoMFD( new DateTime( 2012, 01, 01 ), new DateTime( 2012, 01, 31 ), @"TESTE.TXT" );
WriteResp( "Gerado espelho MFD" );
}
catch (Exception exception)
{
ativarCheckButton.Checked = false;
messageToolStripStatusLabel.Text = "Exception";
descriptionToolStripStatusLabel.Text = exception.Message;
}
}
Está ocorrendo o seguinte, o sistema conecta com a impressora e ao executar o processo, a DLL da bematech gera o log de erro abaixo:
2012-08-08 15:58:29:225 - -----------------------------------------------------------------------
2012-08-08 15:58:29:227 - Bematech_FI_LeInformacoesConfiguracao
2012-08-08 15:58:29:229 - Versão BemaFI32.Dll: 6,1,0,0
2012-08-08 15:58:29:231 - Versão BemaMFD.dll: 2,1,0,0
2012-08-08 15:58:29:233 - Versão BemaMFD2.dll: 2,1,0,0
2012-08-08 15:58:29:235 - path: C:\TEMP\
2012-08-08 15:58:29:236 - Log: 1
2012-08-08 15:58:29:237 - LogDiario: 1
2012-08-08 15:58:29:239 - Status: 0
2012-08-08 15:58:29:240 - Retorno: 0
2012-08-08 15:58:29:242 - ControlePorta: 1
2012-08-08 15:58:29:243 - StatusFuncao: 0
2012-08-08 15:58:29:245 - ModeloImp: BEMATECH
2012-08-08 15:58:29:247 - ModoGaveta: 0
2012-08-08 15:58:29:248 - EmulMFD: 0
2012-08-08 15:58:29:250 - StatusCheque: 0
2012-08-08 15:58:29:252 - Porta: COM3
2012-08-08 15:58:29:253 - StatusErro: 1
2012-08-08 15:58:29:255 - TimeOutZ: 99
2012-08-08 15:58:29:257 - Impressora: 1
2012-08-08 15:58:29:258 - TimeOutGerencial: 40
2012-08-08 15:58:29:260 - CrLfVinculado: 0
2012-08-08 15:58:29:262 - Gerencial: 0
2012-08-08 15:58:29:264 - ForceWTSClient: 1
2012-08-08 15:58:29:265 - RetriesWTSCmd: 3
2012-08-08 15:58:29:267 - Software House - COO: 0
2012-08-08 15:58:29:269 - Software House - NumeroAplicativo: 0
2012-08-08 15:58:29:270 - Software House - CNPJ: 0
2012-08-08 15:58:29:272 - Software House - IE: 0
2012-08-08 15:58:29:274 - Software House - IM: 0
2012-08-08 15:58:29:276 - Software House - RazaoSocial: 0
2012-08-08 15:58:29:278 - Software House - NomeAplicativo: 0
2012-08-08 15:58:29:280 - Software House - Versao: 0
2012-08-08 15:58:29:282 - Software House - Linha1: 0
2012-08-08 15:58:29:284 - Software House - Linha2: 0
2012-08-08 15:58:29:286 - ECF - IM: 0
2012-08-08 15:58:29:288 - ECF - UF: 0
2012-08-08 15:58:29:290 - GerarRFD: 0
2012-08-08 15:58:29:292 - CalculoIcmsCupom: 0
2012-08-08 15:58:29:293 - HabilitaRFDImpMFD: 0
2012-08-08 15:58:29:295 - Retorno Bematech_FI_LeInformacoesConfiguracao: OK
2012-08-08 15:58:31:922 - -----------------------------------------------------------------------
2012-08-08 15:58:31:924 - Bematech_FI_EspelhoMFD
2012-08-08 15:58:31:926 - Parâmetros: C:\TEMP\TESTE.TXT|01/01/2012|31/01/2012|D|1|||
2012-08-08 15:58:31:928 - Bematech_FI_DownloadMFD
2012-08-08 15:58:31:930 - Parâmetros: 1|01/01/2012|31/01/2012|C:\TEMP\Download.MFD|0
2012-08-08 15:58:31:940 - Bematech_FI_ModeloImpressora
2012-08-08 15:58:31:942 - Bematech_FI_NumeroSerie
2012-08-08 15:58:44:133 - Timout finalizado e ACK não lido - Erro 003
2012-08-08 15:58:44:135 - Qtd bytes ler: 18
2012-08-08 15:58:44:138 - Qtd bytes lidos: 0
2012-08-08 15:58:44:152 - Retorno Bematech_FI_NumeroSerie: 0 - Erro de comunicacao
2012-08-08 15:58:44:155 - Retorno Bematech_FI_ModeloImpressora: 0
2012-08-08 15:58:44:157 - Retorno Bematech_FI_EspelhoMFD: -1 - Erro de execucao na funcao Bematech_FI_DownloadMFD:
Pelo que vi está faltando algumas informações como a chave privada e pública, além disso o final do log informa que está havendo um erro de comunicação, e nesse ponto eu estou empacado pois não sei exatamente o que fazer pois eu não entendo muito da sintaxe e dos comandos do Delphi, onde utilizei o comando LeituraMemoriaFiscalSerial, que está disponível no ACBr.Net, como modelo para trazer a função do Espelho de MFD para o ACBr.Net.