ActiveDelphi - Índice do Fórum ActiveDelphi
.: O site do programador Delphi! :.
 
 FAQFAQ   PesquisarPesquisar   MembrosMembros   GruposGrupos   RegistrarRegistrar 
 PerfilPerfil   Entrar e ver Mensagens ParticularesEntrar e ver Mensagens Particulares   EntrarEntrar 

Access Violation ao abrir Query pela segunda vez.[Resolvido]

 
Novo Tópico   Responder Mensagem    ActiveDelphi - Índice do Fórum -> Delphi
Exibir mensagem anterior :: Exibir próxima mensagem  
Autor Mensagem
marcosbaixista
Profissional
Profissional


Registrado: Quinta-Feira, 18 de Março de 2010
Mensagens: 594
Localização: Maringá/PR

MensagemEnviada: Seg Set 16, 2013 1:30 pm    Assunto: Access Violation ao abrir Query pela segunda vez.[Resolvido] Responder com Citação

Boa tarde pessoal.

Estou enfrentando um grave problema em minha aplicação quando tento abrir uma ADQuery pela segunda vez.

Estou usando FireDAC com Firebird.

O código que estou usando é esse:

Código:

Function AcessoTela(Tela: Integer; Usuario: Integer): TPermissao; stdcall;
var
  Botoes: TPermissao;
  Campo: String;
  I: Integer;
begin
  IniciaDLL;
  try
     try
        SetLength(Botoes, 4);
        DadosFuncao.QryAuxiliar.Close;
        DadosFuncao.QryAuxiliar.SQL.Clear;
        DadosFuncao.QryAuxiliar.SQL.Add('SELECT * FROM FUNCAOUSU WHERE CODTELA = ' + IntToStr(Tela) + ' AND CODUSUARIO = ' + IntToStr(Usuario));
        DadosFuncao.QryAuxiliar.Open; // O Access Violation acontece quando passa por essa linha.
        for I:= 0 to 3 do begin
          case I of
            0:Campo:= 'CONSULTAR';
            1:Campo:= 'INCLUIR';
            2:Campo:= 'ALTERAR';
            3:Campo:= 'EXCLUIR';
          end;
          if DadosFuncao.QryAuxiliar.FieldByName(Campo).AsString = '' then
            Botoes[I] := 'n'
          else
            Botoes[I] := DadosFuncao.QryAuxiliar.FieldByName(Campo).AsString;
        end;
        DadosFuncao.QryAuxiliar.Close;
        Result:= Botoes;
     except
        on erro: Exception do begin
           if not TVerificaException.TrataExcception(erro) then begin
              Assert(False, '');
              TVerificaException.SalvarLog(erro);
              raise;
           end;
        end;
     end;
  finally
    Finalize(Botoes);
    FinalizaDLL;
  end;
end;


O erro só acontece quando chamo essa função pela segunda vez, na primeira ele funciona perfeitamente.

Alguém saberia me dizer porque isso ta acontecendo?

Muito obrigado a todos.


Editado pela última vez por marcosbaixista em Ter Set 24, 2013 1:55 pm, num total de 1 vez
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular
marcosbaixista
Profissional
Profissional


Registrado: Quinta-Feira, 18 de Março de 2010
Mensagens: 594
Localização: Maringá/PR

MensagemEnviada: Seg Set 16, 2013 11:04 pm    Assunto: Responder com Citação

Alguém?
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular
magnolima
Novato
Novato


Registrado: Segunda-Feira, 16 de Setembro de 2013
Mensagens: 53

MensagemEnviada: Ter Set 17, 2013 7:07 am    Assunto: Responder com Citação

O contexto do seu Try...Except está muito longo, reduza ele para ver se o problema é realmente na abertura da conexão, de repente é algum outro erro e você está sendo "engando" pelo try... Sugestão, comente os trys e veja qual é o erro real, depois devolva o try para controlá-los.

Abraços
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular
marcosbaixista
Profissional
Profissional


Registrado: Quinta-Feira, 18 de Março de 2010
Mensagens: 594
Localização: Maringá/PR

MensagemEnviada: Ter Set 17, 2013 1:38 pm    Assunto: Responder com Citação

Olá MagnoLima.

Obrigado pela ajuda.

Tentei fazer o que você sugeriu e não deu resultado.
Tentei tbm trocar os componentes de conexão pelos da paleta Interbase e ocorre o mesmo problema, o que significa que não é pal no componente.

Dentro desta DLL, tenho outras funções que acessam o mesmo componente e não ocorre erro algum, rodam normalmente sem dar problemas.
Essa função estava funcionando normalmente até dias atrás, e do nada começou a dar Access Violation quando chama ela pela segunda vez. Comportamento muito estranho.

Não sei mais o que fazer pra solucionar isso, vou ter que acabar refazendo essa DLL pelo jeito.

Se tiver mais alguma idéia, será muito bem vindo.

Obrigado amigo.
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular
cyberdisk
Colaborador
Colaborador


Registrado: Domingo, 4 de Julho de 2010
Mensagens: 2391
Localização: São José dos Campos - SP

MensagemEnviada: Ter Set 17, 2013 4:52 pm    Assunto: Responder com Citação

troque a Function por procedure que voce vai descobrir onde esta o problema

abraço
_________________
O conhecimento abre muitas portas
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular Enviar E-mail
marcosbaixista
Profissional
Profissional


Registrado: Quinta-Feira, 18 de Março de 2010
Mensagens: 594
Localização: Maringá/PR

MensagemEnviada: Ter Set 17, 2013 11:42 pm    Assunto: Responder com Citação

Olá amigo.
Mais usando Procedure eu não consigo receber o retorno, tem como fazer com procedure? Preciso chamar esse bloco de código e pegar o retorno, que é atribiudo a uma variável na tela principal.


cyberdisk escreveu:
troque a Function por procedure que voce vai descobrir onde esta o problema

abraço
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular
cyberdisk
Colaborador
Colaborador


Registrado: Domingo, 4 de Julho de 2010
Mensagens: 2391
Localização: São José dos Campos - SP

MensagemEnviada: Qua Set 18, 2013 12:30 am    Assunto: Responder com Citação

em uma procedure voce tem que passar o resultado para uma variavel global

ou então experimente deixar a IniciaDLL e a FinalizaDll fora da function para ver o resultado

abraço
_________________
O conhecimento abre muitas portas
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular Enviar E-mail
marcosbaixista
Profissional
Profissional


Registrado: Quinta-Feira, 18 de Março de 2010
Mensagens: 594
Localização: Maringá/PR

MensagemEnviada: Ter Set 24, 2013 1:54 pm    Assunto: Responder com Citação

O problema foi resolvido declarando na uses da DLL o Sharemen.

Lendo o Help do Delphi, diz que isso gerencia a memoria da DLL. Por esse motivo eu estava tendo vários erros não só com o array como também na criação do datamodule e abertura de query´s na DLL.
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular
Mostrar os tópicos anteriores:   
Novo Tópico   Responder Mensagem    ActiveDelphi - Índice do Fórum -> Delphi Todos os horários são GMT - 3 Horas
Página 1 de 1

 
Ir para:  
Enviar Mensagens Novas: Proibido.
Responder Tópicos Proibido
Editar Mensagens: Proibido.
Excluir Mensagens: Proibido.
Votar em Enquetes: Proibido.


Powered by phpBB © 2001, 2005 phpBB Group
Traduzido por: Suporte phpBB