Ir para conteúdo
  • Cadastre-se

dev botao

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

Recommended Posts

Postado (editado)

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.

Postado (editado)

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.

Postado (editado)

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.

Postado

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'

  • Consultores
Postado

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 / Araraquara-SP

Araraquara - A era dos Trólebus

Postado

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.

Postado

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

Atenciosamente

Caetano

'Juntos podemos mais'

Postado

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.

Postado

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

Atenciosamente

Caetano

'Juntos podemos mais'

Postado

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'

Postado

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.

Postado

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'

Postado

Bom dia a todos,

 

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

Pra mim deu certo de primeira.

Não lembro, mas talvez eu tenha dado um build sim.

Obrigado. 

:)

Leandro Araújo, Analista de Sistemas.

  • 2 meses depois ...
Postado

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é.

  • 1 mês depois ...
Postado

Boa tarde!

estava com o mesmo problema OLeSysError with message 'CoInitialize não foi chamado'. ao tentar cancelar uma NFSe provedor betha, ai fiz a modificação da Vanessinha e funcionou, porém verifiquei que a alteração dela não foi subida

no SVN, tem algum motivo?

 

Obrigado.

  • Este tópico foi criado há 3532 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.