domingo, 23 de setembro de 2012

Instalando Indy 10 no Delphi 7

Olá, recentemente surgiu a necessidade de consumir recursos REST utilizando o Delphi, no caso a versão XE2, mas muitos projetos ainda utilizam delphi 7. O Delphi XE2 vem com a versão 10 da biblioteca Indy, e funcionou muito bem, e quando fui testar no Delphi 7, que vem com Indy 9, surgiram vários problemas na manipulação dos códigos de retorno HTTP, e para resolver isso decidi atualizar a versão da biblioteca indy do Delphi 7, da versão 9 para a versão 10.

Para começar baixe a versão mais recente através do endereço http://indy.fulgan.com/ZIP, no momento desta publicação, a última versão disponível é o build 4782.

No Delphi 7, vá na opção Component\Install Packages, localize a biblioteca Indy conforme a imagem abaixo, e remova a biblioteca clicando no botão Remove.


Feche o Delphi, pois é preciso remover as referências do Indy 9 na pasta de instalação do delphi. Vá até a pasta onde o delphi está instalado, por padrão "C:\Program Files\Borland\Delphi7". Renomeie os arquivos do Indy adicionando o sufixo indy9, caso você queirar restaurar em outro momento, ou apague os arquivos se sentir a vontade. Deve ficar conforme segue:

  • Bin\indy70.bpl para Bin\indy70_indy9.bpl
  • Bin\indy70.map para Bin\indy70_indy9.map
  • Bin\dclindy70.bpl para Bin\dclindy70_indy9.bpl
  • Bin\dclindy70.map para Bin\dclindy70_indy9.map
  • Lib\indy.dcp para Lib\indy_indy9.dcp
  • Lib\indy.dcu para Lib\indy_indy9.dcu
  • Lib\dclindy.dcp para Lib\dclindy_indy9.dcp
  • Lib\dclindy.dcu para Lib\dclindy_indy9.dcu
  • Source\Indy para Source\Indy_9

Remova também todos os dcu's existentes dentro das pastas Lib e Lib\Debug, que tenham o nome iniciado com "id", por exemplo, "IdBaseComponent.dcu".

Descompacte o arquivo que você baixou. Dentro há uma pasta Lib e um arquivo Fulld7.bat que compila e instala para você, mais preferi fazer a instalação manualmente, para isso, é preciso compilar e instalar os seguintes pacotes, na sequência que segue:
  • IndySystem70.dpk (in Lib\System) --> Apenas Compila
  • IndyCore70.dpk (in Lib\Core) --> Apenas Compila
  • IndyProtocols70.dpk (in Lib\Protocols) --> Apenas Compila
  • dclIndyCore70.dpk (in Lib\Core) --> Compila e Instala
  • dclIndyProtocols70.dpk (in Lib\Protocols) --> Compila e Instala

Agora só falta adicionar os novos arquivos ao LibraryPath do delphi:
  • C:\Indy10\Lib\System
  • C:\Indy10\Lib\Core
  • C:\Indy10\Lib\Protocols

Era isso, agora seu Delphi 7 pode usufruir das melhorias e correção de bugs adicionadas ao Indy 10.

Qualque dúvida ou problema durante a atualização deixe um comentário.

24 comentários:

  1. Olá Fabrício,

    com suas dicas acima consegui realizar a atualização.

    Só teve 2 etapas que fiz diferente...

    - O endereço para baixar o indy10, não sei se mudou da época da postagem prá cá, mas peguei neste endereço: http://indy.fulgan.com/ZIP/

    - No momento de compilar as packages, precisei compilar e instalar a dclIndyCore70.dpk antes de compilar o IndyProtocols70.dpk, pois ele a exigiu como dependência.

    Mas fora estes 2 pequenos detalhes foi perfeito. Parabéns pelo post, foi de extrema utilidade.

    ResponderExcluir
  2. Olá Alexsandro, obrigado pelo feedback.

    O link realmente estava incorreto, já fiz a correção, obrigado.

    Quanto à sequencia de compilação dos pacotes, eu fiz o download da última versão novamente para conferir a seção Requires de cada pacote e parece estar OK.

    ResponderExcluir
  3. Ola fabricio


    Nao estou conseguindo instalar de jeito nenhum o indy10 no delphi7.. Tens como me dar um auxilio pois sempre da erro na hora de instalar.
    Desde ja obrigado

    ResponderExcluir
  4. Olá Junior, pode me adicionar no gtalk que a gente conversa.

    ResponderExcluir
  5. Fabricio, tudo bem?

    Estou tentando instalar o indy10 no delphi 7, conforme você orientou no acima, mas na hora de compilar o pacote IndySystem70.dpk está dando erros abaixo:

    [Warning] IdWship6.pas(469): Symbol 'GIdIPv6FuncsAvailable' is deprecated
    [Error] IdWship6.pas(515): Declaration expected but 'INLINE' found
    [Warning] IdWship6.pas(1213): Symbol 'GIdIPv6FuncsAvailable' is deprecated
    [Fatal Error] IdStackConsts.pas(85): Could not compile used unit 'IdWship6.pas'

    o que pode ser?
    um abraço
    William Brum/ Belo Horizonte-MG

    ResponderExcluir
  6. Isso é um bug no build do Indy. Na linha 515 da unit IdWship6.pas, substitua a diretiva inline; por {$IFDEF USE_INLINE}inline;{$ENDIF}

    ResponderExcluir
  7. Oi, estou tentando instalar os componentes Indy mas está ocorrendo esse erro quando tento compilar IndyCore70.dpk. Se puder me ajudar fico grato, estou com o update 5011 do svn.

    [Error] IdBuffer.pas(304): Undeclared identifier: 'IIdTextEncoding'

    [Fatal Error] IdBuffer.pas(400): Could not compile used unit 'IdResourceStringsCore.pas'

    ResponderExcluir
  8. Obrigado pelas dicas!

    No meu caso eu instalei o arquivo : http://www.indyproject.org/downloads/10/indy10.0.52_source.zip



    Funcionou redondo, bastando seguir a risca o seu passo-a-passo!


    []´s

    ResponderExcluir
  9. Caro Fabrício,
    Coloquei para funcionar no Windows XP, mas consegui no Windows 7.
    Tens alguma dica pra Windows 7

    ResponderExcluir
  10. Não consegui no Windows 7.
    Tem alguma dica?

    ResponderExcluir
  11. Cara vc é de mais, salvou minha vida, mto obrigada s2

    ResponderExcluir
  12. Olá,

    Consegui instalar ok no delphi 7 seguindo suas dicas.

    Porem, quando fui utilizar um projeto com a opcao de "Build with runtime packages", dá o seguinte erro:
    [Fatal Error] Required package 'indy' not found



    Deduzo que as libs dinamicas do indy nao estao sendo localizadas.
    Quando compilo sem essa opcao ativada, funciona 100%, porem estou usando um componente trial que demanda o runtime ativado.


    Tens alguma idéia do que fazer nesse caso ?
    Ou o que devo checar na instalacao para poder usar o indy nessa opcao ?


    Abraco

    ResponderExcluir
  13. Olá Leonardo,

    acredito que o problema é o pacote do indy vem dentro da pasta Borland\Delphi7\Lib apenas com o nome "indy.dcp". Se observar na imagem, o nome do pacote que o delphi adiciona por default no Runtime Packages é "indy", mais esse pacote não existe mais, o pacote recém instalado se chama IndyCore70.

    No Runtime Packages altere o nome de "indy" para "IndyCore70" que ele vai encontrar o package.

    ResponderExcluir
  14. Instaley o Indy 10 e agora em um projeto me dá o seguinte erro: Error reading IdHTTPServer1.CommandHandlers: Property CommandHandler does not exist - Tem como você me ajudar?
    Grato,
    Jeová

    ResponderExcluir
  15. Olé Jeová, essa property foi movida para a classe TIdCmdTCPServer. Se você não está utilizando CommandHandlers, pode simplesmente dar Ignore e continuar.

    ResponderExcluir
  16. boa tarde, fabricio
    Quando tento compilar aparece este erro. Tem alguma ideia?

    [Fatal Error] IndySystem70.dpk(24): Required package 'rtl' not found

    ResponderExcluir
  17. Olá,

    talvez você tenha removido acidentalmente o diretório Lib do delphi do seu Library Path.
    Adiciona o caminho $(Delphi)\Lib no seu Library Path

    ResponderExcluir
  18. Olá, baixei hoje o Indy10_5121.zip e ele está me dando o seguinte erro:

    [Error] IdURI.pas(93): Undeclared identifier: 'TIdIPVersion'

    coloquei tudo na LibraryPath, o que pode ser? será que é essa versão? tens como me passar sua versão build 4782.

    alguem já teve esse erro e sabe como resolver?

    ResponderExcluir
  19. Fabrício,

    Valeu pelo artigo foi minha referência para realizar esse processo e foi tudo certo, está rodando certinho e enviando e-mail para "smtp.office365.com" onde o indy9 não funciona para "smtp.office365.com"

    Obrigado
    André

    ResponderExcluir
  20. Estou com o mesmo erro, conseguiu resolver?

    ResponderExcluir
  21. resolvi sim, na verdade essa versão que peguei estava bugada, uns 2 dias depois saiu uma nova release que funcionou de primeira. Se quiser te mando a versão que estou utilizando. -> rui@ibs.inf.br

    ResponderExcluir
  22. Fabricio o que você indica para consumir serviços REST? Estou precisando fazer um POST e segui o exemplo nesse link:

    http://stackoverflow.com/questions/9743591/delphi-rest-api-post-sample

    procedure TForm1.Button1Click(Sender: TObject);

    var jsonToSend:TStringList;
    http:TIDHttp;
    begin
    http := TIDHttp.Create(nil);
    http.HandleRedirects := true;
    http.ReadTimeout := 5000;
    jsonToSend:=TStringList.create;
    jsonToSend.Add('{ Your JSON-encoded request goes here }');
    Memo1.Lines.Text:=http.Post('http://your.restapi.url', jsonToSend);
    jsonToSend.Destroy;
    http.Destroy;
    end;
    end.

    Mas sempre recebo HTTP/1.1 400 Bad Request., não sei se pela versão do Indy, estou utilizando a 10 no caso.

    Abs.

    ResponderExcluir
  23. Ocorreu
    uma falha: No tutorial indica que deve-se renomear alguns arquivos.
    Executado todo o procedimento, ao reiniciar o Delphi, exibe a mensagem
    da imagem abaixo. Creio que isso se deva ao fato de termos renomeado o
    arquivo de Bin\indy70.bpl para Bin\indy70_indy9.bpl. Creio também que no
    processo de instalação deveria ter criado novamente este arquivo na
    pasta (ou não???). Executei tanto o arquivo .bat como o procedimento
    manual mas não obtive êxito. Procurei o arquivo indy70.bpl na pasta na
    qual foram salvos os fontes (para copiar manualmente) e também não
    gerou.
    Percebi
    que foi criada uma pasta chamada D7, onde são gerados os DCUs e os
    BPSs. Mesmo referenciando-a no Library Path não há êxito.

    ResponderExcluir