Ir para conteúdo
  • Cadastre-se

dev botao

Alterações no ACBr para que o Delphi XE5 pudesse compilá-lo em 64 bits.


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

Recommended Posts

  • Membros Pro

Necessidade:

Foi necessário fazermos algumas alterações nas linhas de códigos do fonte do ACBr para que o Delphi XE5 pudesse compilá-lo em 64 bits. Deste modo é possível que o Delphi XE5 compile em 32 bits e 64 bits.

 

... \Fontes\ACBrCapicom\ACBrHTTPReqResp.pas

Na linha 213:

Antes

 

Depois

{$IFDEF WIN64}lCertContext: integer;{$ENDIF}

Na linha 250:

Antes

CertContext.Get_CertContext(integer(PCertContext));

Depois

    {$IFDEF WIN32}

      CertContext.Get_CertContext(integer(PCertContext));

      {$ELSE}

      lCertContext := integer(PCertContext);

      CertContext.Get_CertContext(lCertContext);

      PCertContext := Pointer(lCertContext);

      {$ENDIF}

 

Na linha 256:

Antes

CertContext.Get_CertContext(integer(PCertContext));

Depois

    {$IFDEF WIN32}

    CertContext.Get_CertContext(integer(PCertContext));

    {$ELSE}

    lCertContext := integer(PCertContext);

    CertContext.Get_CertContext(lCertContext);

    PCertContext := Pointer(lCertContext);

    {$ENDIF}

 

... \Fontes\ACBrCapicom\JwaWinBase.pas

Nas linhas 6165 e 6165:

Antes

begin

Result := PVOID(InterlockedExchange(LONG(Target), LONG(Value)));

Depois

    {$IFDEF WIN64}

var

  lTarget, lValue: integer;

{$ENDIF}

begin

  {$IFDEF WIN64}

  lTarget := LONG(Target);

  lValue  := LONG(Value);

  Result  := PVOID(InterlockedExchange(lTarget, lValue));

  Target  := PVOID(lTarget);

  Value   := PVOID(lValue);

  {$ELSE}

  Result := PVOID(InterlockedExchange(LONG(Target), LONG(Value)));

  {$ENDIF}

 

Nas linhas 6170 e 6171:

Antes

begin

Result := PVOID(InterlockedCompareExchange(LONG(Destination), LONG(Exchange), LONG(Comperand)));

Depois

    {$IFDEF WIN64}

var

  lDestination, lExchange, lComperand: integer;

{$ENDIF}

begin

  {$IFDEF WIN64}

  lDestination := LONG(Destination);

  lExchange    := LONG(Exchange);

  lComperand   := LONG(Comperand);

  Result       := PVOID(InterlockedCompareExchange(lDestination, lExchange, lComperand));

  Destination  := PVOID(lDestination);

  Exchange     := PVOID(lExchange);

  Comperand    := PVOID(lComperand);

  {$ELSE}

  Result := PVOID(InterlockedCompareExchange(LONG(Destination), LONG(Exchange), LONG(Comperand)));

  {$ENDIF}

 

 

... \Fontes\ACBrNFe2\ACBrNFeDANFEFRDM.pas

Nas linhas 245 e 246:

Antes

iDelLen := PCardinal(Cardinal(ADelimiter) - SizeOf(Cardinal))^;

iLen := PCardinal(Cardinal(AString) - SizeOf(Cardinal))^;

Depois

    {$IFDEF WIN32}

      iDelLen := PCardinal(Cardinal(ADelimiter) - SizeOf(Cardinal))^;

      iLen := PCardinal(Cardinal(AString) - SizeOf(Cardinal))^;

    {$ELSE}

      iDelLen := PCardinal(int64(ADelimiter) - SizeOf(Cardinal))^;

      iLen := PCardinal(int64(AString) - SizeOf(Cardinal))^;

    {$ENDIF}

 

Na linha 264:

Antes

for x := 1 to PCardinal(Cardinal(Step^) - SizeOf(Cardinal))^ do

Depois

    {$IFDEF WIN32}

    for x := 1 to PCardinal(Cardinal(Step^) - SizeOf(Cardinal))^ do

     {$ELSE}

     for x := 1 to PCardinal(int64(Step^) - SizeOf(Cardinal))^ do

     {$ENDIF}

Na linha 272:

Antes

Cardinal(Step) := Cardinal(Step) + SizeOf(Cardinal);

Depois

        {$IFDEF WIN32}

      Cardinal(Step) := Cardinal(Step) + SizeOf(Cardinal);

      {$ELSE}

      int64(Step) := int64(Step) + SizeOf(Cardinal);

      {$ENDIF}

ACBrHTTPReqResp.pas

ACBrNFeDANFEFRDM.pas

JwaWinBase.pas

  • Curtir 2
Link para o comentário
Compartilhar em outros sites

  • 3 meses depois ...
  • Fundadores

Notei que a Unit "ACBrHTTPReqResp.pas", está completamente diferente da existente no Trunk2...

Não posso incorporar as sugestões...

 

Consultor SAC ACBr

Daniel Simões de Almeida
O melhor TEF, é com o Projeto ACBr - Clique e Conheça
Ajude o Projeto ACBr crescer - Assine o SAC

Projeto ACBr     Telefone:(15) 2105-0750 WhatsApp(15)99790-2976.

Link para o comentário
Compartilhar em outros sites

Obrigada pela atenção @Daniel Simoes e @Juliomar Marchetti.

Eu não baixei as units anexadas, e sim substitui as linhas que apresentavam problema com a sugestão apresentada.

Segue meus fontes. 

Estão com alterações apenas nos trechos citados

ACBrDFeCapicomDelphiSoap.pas

ACBrNFeDANFEFRDM.pas

ACBrCTeDACTEFR.pas

JwaWinBase.pas

ACBrHTTPReqResp.pas

Jeanny Paiva Lopes

Analista de Sistemas / Desenvolvedora 

[email protected]

[email protected]
Tel.: +55 (32) 3539-5700

 

 

Link para o comentário
Compartilhar em outros sites

  • Fundadores

Consegue revisar se todos IFDEFs são realmente necessários ?

Exemplo:

  {$IFDEF WIN32}
      CertContext.Get_CertContext(Integer(PCertContext));
  {$ELSE}
      lCertContext := Integer(PCertContext);
      CertContext.Get_CertContext(lCertContext);
      PCertContext := Pointer(lCertContext);
  {$ENDIF}

aparentemente o código de 64bits compilaria também para 32 bits...

 

Consultor SAC ACBr

Daniel Simões de Almeida
O melhor TEF, é com o Projeto ACBr - Clique e Conheça
Ajude o Projeto ACBr crescer - Assine o SAC

Projeto ACBr     Telefone:(15) 2105-0750 WhatsApp(15)99790-2976.

Link para o comentário
Compartilhar em outros sites

Sim. Foi necessário.

Só encontrei este tópico pois tive erro ao compilar em 64bits, e procurei no fórum se já havia alguma ocorrência.

Atualmente surgiu a necessidade de trabalhar apenas com NFe, CTe no 64bits, podem haver mais ocorrências para demais componentes.

 

O erro que ocorre sem a diretiva:
[DCC Error] ACBrDFeCapicomDelphiSoap.pas(101): E2197 Constant object cannot be passed as var parameter.

*A principio não encontrei alternativa além do uso das diretivas.

Jeanny Paiva Lopes

Analista de Sistemas / Desenvolvedora 

[email protected]

[email protected]
Tel.: +55 (32) 3539-5700

 

 

Link para o comentário
Compartilhar em outros sites

  • Fundadores

Acho que não fui claro no meu tópico anterior...  o que desejo saber, é se podemos manter apenas o código da versão 64bits... e com isso evitar o IFDEF

  • Curtir 1
Consultor SAC ACBr

Daniel Simões de Almeida
O melhor TEF, é com o Projeto ACBr - Clique e Conheça
Ajude o Projeto ACBr crescer - Assine o SAC

Projeto ACBr     Telefone:(15) 2105-0750 WhatsApp(15)99790-2976.

Link para o comentário
Compartilhar em outros sites

Desculpe, entendi errado.

Para os arquivos abaixo, sem diretiva está compilável em 32 e 64 bits.

Já o ACBrNFeDANFEFRDM e ACBrCTeDACTEFR foi necessário manter.

ACBrHTTPReqResp.pas

JwaWinBase.pas

ACBrDFeCapicomDelphiSoap.pas

Jeanny Paiva Lopes

Analista de Sistemas / Desenvolvedora 

[email protected]

[email protected]
Tel.: +55 (32) 3539-5700

 

 

Link para o comentário
Compartilhar em outros sites

  • 1 mês depois ...
  • Fundadores

Apliquei várias modificações para a compilação em 64 bits... já está compilado em Lazarus/FPC 3 64 bits...

Ainda estou analisando as modificações de JwaWinBase.pas

Consultor SAC ACBr

Daniel Simões de Almeida
O melhor TEF, é com o Projeto ACBr - Clique e Conheça
Ajude o Projeto ACBr crescer - Assine o SAC

Projeto ACBr     Telefone:(15) 2105-0750 WhatsApp(15)99790-2976.

Link para o comentário
Compartilhar em outros sites

  • Fundadores

Em relação a JediWin32API, apliquei as seguintes modificações

Citar

- Remoção de Units não utilizadas
- Atualização de Units usadas com ultima versão do projeto Jedi-SVN (1.17)
- Ajustes para compilação em 64bits

 

  • Curtir 2
Consultor SAC ACBr

Daniel Simões de Almeida
O melhor TEF, é com o Projeto ACBr - Clique e Conheça
Ajude o Projeto ACBr crescer - Assine o SAC

Projeto ACBr     Telefone:(15) 2105-0750 WhatsApp(15)99790-2976.

Link para o comentário
Compartilhar em outros sites

  • Fundadores

Em relação a Unit ACBrNFeDANFEFRDM.pas

modifiquei as linhas:

iDelLen := PCardinal(Cardinal(ADelimiter) - SizeOf(Cardinal))^;
iLen := PCardinal(Cardinal(AString) - SizeOf(Cardinal))^;

para:

iDelLen := Length(ADelimiter);
iLen := Length(AString);

 

  • Curtir 2
Consultor SAC ACBr

Daniel Simões de Almeida
O melhor TEF, é com o Projeto ACBr - Clique e Conheça
Ajude o Projeto ACBr crescer - Assine o SAC

Projeto ACBr     Telefone:(15) 2105-0750 WhatsApp(15)99790-2976.

Link para o comentário
Compartilhar em outros sites

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