Willian Jhonnes L. dos Santos wrote:
> Olá, galera...
> 
> Seguinte: o problema é cascudo!
> 
> Em uma determinada aplicação desenvolvida em Delphi3 tenho objetos 
> TStoredProc e TQuery manipulando informações no BD (Oracle 10g 
> Enterprise) via Oracle Client 9.0. Até aí, tudo bem. A aplicação é 
> legada e NÃO há como migrá-la para uma versão mais atual do Delphi sem 
> impactar em nosso cronograma. Digo isso para que respostas como "muda 
> pro Delphi 2007" ou "usa o ODAC", as quais não ajudam em nada, não apareçam.
> 
> Voltando ao caso, em 'n' formulários tenho objetos TQuery e TStoredProc 
> instanciados e trabalhando normalmente. Porém, em certas situações, eles 
> teimam em causar problemas. Em certas máquinas, a execução de dois 
> métodos Close em dois componentes distintos (TQuery ou TStoredProc, isso 
> independe) simplesmente encerra a aplicação! Isso sem nenhuma mensagem 
> de exceção.
> 
> Debugando a aplicação, me deparei com uma mensagem *INFORMATIVA* de 
> violação de acesso! O texto da mensagem é este:
> 
> access violation at 0x4da2ed3d: read of address 0xffaaadcc
> 83 3A 00 74 63 E8 39 10 00 00 64 8B

Praticamente certo de que alguém está tentando usar um objeto que já foi 
destruído.

> Exatamente como aparece na caixa de mensagem. Após clicar em ok, a 
> aplicação é encerrada. Em uma consulta ao google, a pesquisa pelo código 
> de erro me retornou isto [1].

Não ajuda, isso é meramente um endereço de memória.

> Alguém tem alguma idéia de como resolver (ou contornar, mesmo com POG) 
> este problema? Reitero: respostas como "muda pro Delphi 2007" ou "usa o 
> ODAC" não ajudam.
> 
> Dentre uma das tentativas, tentamos compilar a aplicação em Delphi7, mas 
> o problema persiste. Tenho a alternativa de usar o ODAC, mas, como já 
> disse, o impacto no nosso cronograma seria gigantesco, pois esta é a 
> maior de todas as nossas aplicações em produção.

Se o problema aparece em Delphi 7, então é certo que está na sua 
aplicação. Do contrário, numa hipótese muito remota, poderia ser bug da vcl.

Dica: ligue as informações de debug da sua aplicação e use as units com 
informações de debug: project | options | compiler | use debug dcu. 
Quando o erro pipocar, veja um backtrace (Ctrl+F3) e use a criatividade 
para tentar adivinhar quem está apontando para o objeto destruído.

Boa sorte.

--
Joao Morais



> Abraços e espero ter sido claro o suficiente (se não fui, me desculpem 
> e, por favor, me questionem)...
> 
> [1] - 
> http://www.google.com.br/search?hl=pt-BR&rlz=1G1GGLQ_PT-BRBR293&q=0x4da2ed3d&btnG=Pesquisar&meta=
> 

Responder a