Ir para conteúdo
  • Cadastre-se

dev botao

Envio De Nfe Usando Thread.


carlosmarian
  • Este tópico foi criado há 3372 dias atrás.
  • Talvez seja melhor você criar um NOVO TÓPICO do que postar uma resposta aqui.

Recommended Posts

  • Moderadores

Bom dia

dá para por no finalization da unit 

foi colocado ali pra evitar problemas de não precisar em outros locais e continuar inicializado!

Consultor SAC ACBr Juliomar Marchetti
 

Projeto ACBr

skype: juliomar
telegram: juliomar
e-mail: [email protected]
http://www.juliomarmarchetti.com.br
MVP_NewLogo_100x100_Black-02.png
 

 

Link para o comentário
Compartilhar em outros sites

Bom dia

dá para por no finalization da unit 

foi colocado ali pra evitar problemas de não precisar em outros locais e continuar inicializado!

Entendi, obrigado Juliomar

Vai ser feita alguma alteração no ACBr por causa disso?

Para atualizar depois..?

 

Achei onde disparava o erro aqui, no meu caso, acontece quando vou assinar o arquivo .XML, onde lança a exception, é

na unit ACBrNFeUtil, na function AssinarMSXML, dai importei a unit ActiveX e coloquei uma chamada a CoInitialize(nil) no início, e um CoUninitialize no final:

function AssinarMSXML(XML : AnsiString; Certificado : ICertificate2; out XMLAssinado : AnsiString): Boolean;
var
 I, J, PosIni, PosFim : Integer;
 URI           : String ;
 Tipo : Integer;

 xmlHeaderAntes, xmlHeaderDepois : AnsiString ;
 xmldoc  : IXMLDOMDocument3;
 xmldsig : IXMLDigitalSignature;
 dsigKey   : IXMLDSigKey;
 signedKey : IXMLDSigKey;
begin
  CoInitialize(nil); // <--- Alterei aqui.
   if Pos('<Signature',XML) <= 0 then
   begin
      Tipo := NotaUtil.IdentificaTipoSchema(XML,I);

     // Restante do código do ACBr...

   dsigKey   := nil;
   signedKey := nil;
   xmldoc    := nil;
   xmldsig   := nil;

   Result := True;
   CoUninitialize; // <--- Alterei aqui.
end;

Não sei se essa é a solução mais correta, no aguardo da análise de vocês.

Obrigado.

Editado por Leandro Araújo
  • Curtir 1

Leandro Araújo, Analista de Sistemas.

Link para o comentário
Compartilhar em outros sites

Ok Juliomar, baixei aqui e testei, funcionou, perfeito.

Para mim também, foi necessário colocar na function ValidaMSXML, na ACBrNFeUtil:

function ValidaMSXML(XML: AnsiString; out Msg: AnsiString; const APathSchemas: string = '';
                     AModeloDF: TpcnModeloDF = moNFe; AVersaoDF: TpcnVersaoDF = ve200): Boolean;
var
  DOMDocument: IXMLDOMDocument2;
  ParseError: IXMLDOMParseError;
  Schema: XMLSchemaCache;
  Tipo,I: Integer;
  schema_filename: String;
begin
  CoInitialize(nil); // <-- Aqui...
  Tipo := NotaUtil.IdentificaTipoSchema(XML,I) ;
   
  // ...............    

  DOMDocument.schemas := Schema;
  ParseError := DOMDocument.validate;
  Result := (ParseError.errorCode = 0);
  Msg   := ParseError.reason;

  DOMDocument := nil;
  ParseError := nil;
  Schema := nil;
  CoUninitialize; // <-- Aqui...
end;

Obrigado.  :mrgreen:

Editado por Leandro Araújo

Leandro Araújo, Analista de Sistemas.

Link para o comentário
Compartilhar em outros sites

Boa tarde André,

 

Enfrentei o mesmo problema que o Carlos.

 

O erro realmente ocorre quando executado o método GetCertificado dentro de uma Thread.

A Thread necessita que o comando CoInitialize(nil) seja executado, para processar corretamente a API do ActiveX.

 

Para resolver esse problema criei uma condição de compilação, segue em anexo o fonte para ser analisado.

A solução da Vanessinha Mocellin funcionou aqui também, coloquei onde precisava as diretivas de compilação e deu certo.

Bem interessante, melhor comentar no ACBr.inc do que nos fontes né...  :mrgreen:

Bem mais dinâmico, e creio que o mais correto.

Obrigado pessoal... :)

Editado por Leandro Araújo

Leandro Araújo, Analista de Sistemas.

Link para o comentário
Compartilhar em outros sites

Ola Leandro

Eu também tive que colocar na function ValidaMSXML, no ACBrNFeUtil:

 

CoInitialize(nil); // <-- Aqui...

Tipo := NotaUtil.IdentificaTipoSchema(XML,I) ;

// ...............

DOMDocument.schemas := Schema;
ParseError := DOMDocument.validate;
Result := (ParseError.errorCode = 0);
Msg := ParseError.reason;

DOMDocument := nil;
ParseError := nil;
Schema := nil;
CoUninitialize; // <-- Aqui...

 

Ai funcionou

  • Curtir 1

Atenciosamente

Caetano

'Juntos podemos mais'

Link para o comentário
Compartilhar em outros sites

  • Consultores

Boa tarde a todos,

 

Juliomar, pelo que entendi, segundo o nosso amigo Leandro, devemos incluir o CoInitialize(nil) (...) CoUninitialize em:

 

ACBrNFeConfiguracoes -> function: GetCertificado

 

ACBrNFeUtil -> nas function: AssinarMSXML e ValidaMSXML

 

Mas no SVN a unit ACBrNFeUtil só tem a alteração na function AssinarMSXML.

Consultor SAC ACBr

Italo Giurizzato Junior
Ajude o Projeto ACBr crescer - Assine o SAC

Projeto ACBr

Analista de Sistemas / e-mail: [email protected] / Fone: (16) 9-9701-5030 / Araraquara-SP

Araraquara - A era dos Trólebus

Link para o comentário
Compartilhar em outros sites

  • Moderadores

Boa tarde

Acredito que seja isso mesmo Italo!

mas pelo seguinte será que setamos uma diretiva no .inc do ACBr e assim somente habilita se descomentar ela?

Consultor SAC ACBr Juliomar Marchetti
 

Projeto ACBr

skype: juliomar
telegram: juliomar
e-mail: [email protected]
http://www.juliomarmarchetti.com.br
MVP_NewLogo_100x100_Black-02.png
 

 

Link para o comentário
Compartilhar em outros sites

  • Consultores

Juliomar,

 

Se deixar como esta e não utilizar com o Thread quais os efeitos colaterais?

Consultor SAC ACBr

Italo Giurizzato Junior
Ajude o Projeto ACBr crescer - Assine o SAC

Projeto ACBr

Analista de Sistemas / e-mail: [email protected] / Fone: (16) 9-9701-5030 / Araraquara-SP

Araraquara - A era dos Trólebus

Link para o comentário
Compartilhar em outros sites

Chegaram a atualizar o svn antes ? está lá já essa alteração!

 

Sim Juliomar, vi lá a alteração, mas foi na AssinarMSXML, depois vi que era necessário também na ValidaMSXML.

 

Boa tarde a todos,

 

Juliomar, pelo que entendi, segundo o nosso amigo Leandro, devemos incluir o CoInitialize(nil) (...) CoUninitialize em:

 

ACBrNFeConfiguracoes -> function: GetCertificado

 

ACBrNFeUtil -> nas function: AssinarMSXML e ValidaMSXML

 

Mas no SVN a unit ACBrNFeUtil só tem a alteração na function AssinarMSXML.

 

É isso mesmo italojjr.

Agora se tem efeitos ou não, ai é com vocês que tem mais experiência... hahaha  :mrgreen:  

Obrigado.

Leandro Araújo, Analista de Sistemas.

Link para o comentário
Compartilhar em outros sites

  • Moderadores

Juliomar,

 

Se deixar como esta e não utilizar com o Thread quais os efeitos colaterais?

Estou a pesquisar e testar pra ver se tem algum problema!

mas ele só levanta o serviço COM com esse procedimento!

Consultor SAC ACBr Juliomar Marchetti
 

Projeto ACBr

skype: juliomar
telegram: juliomar
e-mail: [email protected]
http://www.juliomarmarchetti.com.br
MVP_NewLogo_100x100_Black-02.png
 

 

Link para o comentário
Compartilhar em outros sites

Boa tarde senhores.

Pessoal depois de atualizar voltou a dar o erro.

Foi tirado algo? pois na ultima versão que tinha baixado estava correto o uso para Thread.

 

Agradeço

Boa noite Caetano.

Atualizei hoje aqui na minha máquina de produção e está funcionando normalmente.

Inclusive observei lá nas units ACBrNFeConfiguracoes e ACBrNFeUtil e estão com as chamadas de CoInitialize e CoUninitialize para possibilitar o uso com thread.

Leandro Araújo, Analista de Sistemas.

Link para o comentário
Compartilhar em outros sites

Olá pessoal, voltei naquele mesmo erro já colocado pelo Leandro aqui.

Funciona ignorando a linha abaixo do finally da unit ACBrNFeConfiguracoes

 

if not(Assigned(Result)) then
raise EACBrNFeException.Create('Certificado Digital não encontrado!');
finally
// CoUninitialize;
end;

Atenciosamente

Caetano

'Juntos podemos mais'

Link para o comentário
Compartilhar em outros sites

Ola Leandro;

Você tentou atualizar e compilar os pacotes novamente. Pra  mim também estava correto, ai atualizei ontem e ai voltou a ocorrer o erro.

Agradeço

 

Depois da atualização no SVN aqui funcionou corretamente.

Observei nas duas units e as alterações estão lá.

Não precisei compilar os pacotes novamente, na realidade, quando compilo minha aplicação os .dcu são novamente gerados, inclusive dos fontes do ACBr, certo?

 

Olá pessoal, voltei naquele mesmo erro já colocado pelo Leandro aqui.

Funciona ignorando a linha abaixo do finally da unit ACBrNFeConfiguracoes

 

if not(Assigned(Result)) then

raise EACBrNFeException.Create('Certificado Digital não encontrado!');

finally

// CoUninitialize;

end;

 

Não tive mais necessidade de comentar a chamada a CoUninitialize, já que foi corrigido.

Creio que não seja bom comentar essa chamada do método, não entendo muito bem e quais os impactos, mas por algum motivo, sei lá, liberação de memória, recursos, objetos COM etc, acredito eu que não seria legal ocultar essa linha.
Teria que verificar com os mantenedores do ACBrNF-e.

Leandro Araújo, Analista de Sistemas.

Link para o comentário
Compartilhar em outros sites

Ok. Leandro, mas a unica forma de eu resolver isso foi comentando.

Eu baixei todo Acbr novamente e compilei e instalei novamente com o ACBrInstall, pra ter certeza mas o erro voltou a ocorrer. Então o jeito foi apelar por comentar a linha.

Atenciosamente

Caetano

'Juntos podemos mais'

Link para o comentário
Compartilhar em outros sites

  • Consultores

Bom dia a todos,

 

Por favor atualizem todos os fontes de todas as pastas e compile a aplicação com a opção Build.

  • Curtir 1
Consultor SAC ACBr

Italo Giurizzato Junior
Ajude o Projeto ACBr crescer - Assine o SAC

Projeto ACBr

Analista de Sistemas / e-mail: [email protected] / Fone: (16) 9-9701-5030 / Araraquara-SP

Araraquara - A era dos Trólebus

Link para o comentário
Compartilhar em outros sites

  • 2 meses depois ...

Bom dia a todos,

 

Por favor atualizem todos os fontes de todas as pastas e compile a aplicação com a opção Build.

Boa tarde 

Fiz atualização hoje (28/11/2014 release 7873) do ACBR e ao testar a manifestação do destinatário, encontrei um problema na unit ACBrNFeConfiguracoes.pas na função GetCertificado, ao processar a consulta e manifestação com 2 certificados de empresas diferentes ocorre rejeição 213 Rejeição: CNPJ-Base do Emitente difere do CNPJ-Base do Certificado Digital , a rejeição ocorre ao processar a segunda empresa (certificado) .

... para cada empresa processada são definidas as configurações de certificado da empresa, conforme código abaixo:

 

  aNFe.Configuracoes.WebServices.Visualizar   := False;
  aNFe.Configuracoes.Geral.PathSalvar         := aDIRTemp;
  aNfe.Configuracoes.Certificados.NumeroSerie := aCertificadoSerie;
  aNFe.Configuracoes.Certificados.GetCertificado;
  aNfe.Configuracoes.WebServices.UF           := aUFProc;
  aNFe.Configuracoes.WebServices.Ambiente   := taProducao;
  aNFe.Configuracoes.Geral.FormaEmissao     := teNormal;

Para resolver o problema alterei a unit ACBrNFe2/ACBrNFeConfiguracoes, comentei o código abaixo na função GetCertificado :

//if (PCertCarregado <> nil) and (NumCertCarregado = FNumeroSerie) then
//   Result := PCertCarregado
//else ...

... também notei que na função GetCertificado as variáveis (interfaces) estão com o mesmo nome da unit ACBrNFeUtil.pas 

var  Store : IStore3; Certs : ICertificates2; Cert : ICertificate2; PrivateKey : IPrivateKey;

 

Sugiro revisar e disponibilizar a alteração para a comunidade.

abraço

André.

Link para o comentário
Compartilhar em outros sites

  • 1 mês depois ...
  • Este tópico foi criado há 3372 dias atrás.
  • Talvez seja melhor você criar um NOVO TÓPICO do que postar uma resposta aqui.

Crie uma conta ou entre para comentar

Você precisar ser um membro para fazer um comentário

Criar uma conta

Crie uma nova conta em nossa comunidade. É fácil!

Crie uma nova conta

Entrar

Já tem uma conta? Faça o login.

Entrar Agora
×
×
  • Criar Novo...

Informação Importante

Colocamos cookies em seu dispositivo para ajudar a tornar este site melhor. Você pode ajustar suas configurações de cookies, caso contrário, assumiremos que você está bem para continuar.

The popup will be closed in 10 segundos...