GARANTIR DESCONTO

Fórum access violation at address 000000 no win7 ? #400246

03/05/2011

0

Pessoal tenho um sistema que no xp roda que é uma maravilha, ja no win7 64 da pau, resolvi colocar o delphi 7 na maquina win7 64, e compilar o sistema pra debugar e ver o que ocorre.

Percebi que logo de cara dava pau e a mensagem access violation at address 000000

Ao debugar vi que o problema esta no select. (uso o zeos 6.6.6 stable neste programa com firebird 2.1)

Utilizo INI para acesso ao banco.

Resolvi conectar diretamente no datamodule, o zConnection funcionou normal, agora quando tento abrir o zQuery (propriedade action = true) da novamente o erro access violation at address 000000

Fui no IbExpert pra ver se poderia ter algo a ver com isso, e nada abre a conexao e as tabelas normais.

Resolvi debugar entre os codigos F7 pra ver aonde ocorria o tal erro.

Não me lembro de cabeça qual é a unidade que esta dando pau no zeos, mais parece algo semelhante com uInterbase6.pas, sei que tem algo com Interbase6 nesta unidade que esta dando problema. E ao debugar o codigo faz umas comparações com o primeiro select que tenho no oncreate para verificar o registro do sistema, então ele verifica variias vezes a mesma linha de codigo até chegar em um momento que fecha a conexao causando um UNAVAILABLE DATABASE, e quando acontece isso, entra num exception do codigo do zeos e da pau.

Achei que o problema poderia esta na versão do zeos, e resolvi, copiar e colar o datamodule em um novo projeto e neste novo projeto ele abre normal sem erros de violação de acesso, inclusive coloquei num form um dbgrid setado para o zquery e fiz das duas formas o select, diretamente pelo componente, e no aplicativo abrindo em tempo de projeto, e ambas funcionaram.

Então fiquei na estaca zero, pq não consigo localizar a fonte do erro, o pe esta acontecendo isso?

Note: Este mesmo sistema esta no WinXp sem problemas. Sem mudar nenhuma linha de codigo

Pior que no win7 compilo da pau e não roda o sistema, mais se eu der um build no mesmo ele atualiza o executavel e na minha maquina consigo roda-lo. Só não na maquina do cliente.

este negocio esta me deixando louco.

Obs: Não tenho nem o interbase e nada referente ao interbase nesta maquina que possa estar dando conflito com o firebird. Até a dll do interbase retirei do system32
Adriano Dolce

Adriano Dolce

Responder

Posts

03/05/2011

Adriano Dolce

Não consigo entender o que acontece quando vou compilar o sistema no windows 7. 64bits

O sistema é o mesmo que uso no windows xp, o delphi é o mesmo, o componente é o mesmo, o banco é o mesmo, mais não consigo compilar no win seven.

Se dou um build não mostra erro, agora fiz a conexão direta no datamodule e abriu as tabelas normal sem erro, mais o infeliz da erro quando compilo... Olhem a imagem

BANCO DE DADOS INDISPONIVEL, mais porque, sendo que esta conectado no datamodulo?

O erro aponta para este bloco do zeos entrando no exception
Não sei o que são estas diretivas pra que serve, se é para desviar do interbase, enfim não sei.

Código:
procedure CheckInterbase6Error(PlainDriver: IZInterbasePlainDriver;


  StatusVector: TARRAY_ISC_STATUS; LoggingCategory: TZLoggingCategory = lcOther;


  SQL: string = '');


var


  Msg: array[0..1024] of Char;


  PStatusVector: PISC_STATUS;


  ErrorMessage, ErrorSqlMessage: string;


  ErrorCode: LongInt;


begin


  if (StatusVector[0] = 1) and (StatusVector[1] > 0) then


  begin


    ErrorMessage:='';


    PStatusVector := @StatusVector;


    while PlainDriver.isc_interprete(Msg, @PStatusVector) > 0 do


      ErrorMessage := ErrorMessage + ' ' + StrPas(Msg);





    ErrorCode := PlainDriver.isc_sqlcode(@StatusVector);


    PlainDriver.isc_sql_interprete(ErrorCode, Msg, 1024);


    ErrorSqlMessage := StrPas(Msg);





{$IFDEF INTERBASE_EXTENDED_MESSAGES}


    if SQL <> '' then


      SQL := Format(' The SQL: %s; ', [SQL]);


{$ENDIF}





    if ErrorMessage <> '' then


    begin


      DriverManager.LogError(LoggingCategory, PlainDriver.GetProtocol,


        ErrorMessage, ErrorCode, ErrorSqlMessage + SQL);





{$IFDEF INTERBASE_EXTENDED_MESSAGES}


      raise EZSQLException.CreateWithCode(ErrorCode,


        Format('SQL Error: %s. Error Code: %d. %s',


        [ErrorMessage, ErrorCode, ErrorSqlMessage]) + SQL);


{$ELSE}


      raise EZSQLException.CreateWithCode(ErrorCode,


        Format('SQL Error: %s. Error Code: %d. %s',


        [ErrorMessage, ErrorCode, ErrorSqlMessage]));


{$ENDIF}


    end;


  end;


end;


A unidade que da este pau é esta aqui
ZDbcInterbase6Utils

Olhem que eu consigo conexão normal



To ficando louco com este maudito zeos, ou win7 ou delphi 7... Pq não compila, e consequentemente não consigo instalar em computadores win7 64bits






Responder

Gostei + 0

05/05/2011

Rafael Mattos

  vc consegue acessar ele por outro programa? exemplo IBExpert?
Responder

Gostei + 0

05/05/2011

Adriano Dolce

Ola amigo, obrigado por responder....

Sim consigo conectar pelo ibexpert e dentro do datamodule.

Mais basta eu usar o F9 para que ele feche a conexão cfe imagem acima.

Se eu usar somente o BUILD do delphi, atualiza o sistema com alterações efetuadas e consigo executar o sistema com as alterações, mais por fora do delphi com o F9 não consigo, e é só neste projeto ai.
Responder

Gostei + 0

05/05/2011

Rafael Mattos

não trabalho com o ZEUS, mas ja tive, erro semelhante era com o INI, tava apontando para o GDS32.dll ao inves de apontar para fbClient.dll tanto que pelo IBExpert abria,mas meu programa não.

-----------
Da uma olhada ve na pasta desse projeto não tem uma versão de dll antiga
Responder

Gostei + 0

05/05/2011

Adriano Dolce

não trabalho com o ZEUS, mas ja tive, erro semelhante era com o INI, tava apontando para o GDS32.dll ao inves de apontar para fbClient.dll tanto que pelo IBExpert abria,mas meu programa não.

-----------
Da uma olhada ve na pasta desse projeto não tem uma versão de dll antiga
Então, eu ja tinha visto isso que vc falou amigo, inclusive tudo que era desta DLL GDS32.dll eu exclui do computador, e não resolveu, ai resolvi copiar o fbclient.dll com o nome GDS32.dll para ver se renomeando o fbclient com este nome fosse resolver, e nada ainda... Então estou com a dll fbclient na pasta system32 com o nome original e renomeado para GDS32.


Responder

Gostei + 0

05/05/2011

Rafael Mattos

mas dentro da pasta do projeto não tem?
Responder

Gostei + 0

05/05/2011

Adriano Dolce

Então, como disse enteriormente, não tenho esta dll na minha maquina, tudo que tinha referente a ela, exclui do computador, só tenho ela mais renomeada com o o nome, mais o conteudo é da fbclient.

Tenho o fbclient na pasta aonde tem o projeto, e no system32 também, alem de mais duas dll que pertence ao zeos
fbclient20.dll e a outra não me lembro de cabeça.

Obrigado amigo.
Responder

Gostei + 0

05/05/2011

Adriano Dolce

O arquivo INI que eu tenho é este aqui
[ConexaoBanco]
HostName=
Database=192.168.1.101:C:\Aldac\Motoboy\Dados\MOTOBOY.FDB
Port=3050
Password=masterkey
User=SYSDBA
Protocol=firebird-2.1

No oncreate do form principal chamo assim o INI
dm.CarregaArquivoIni;


depois dentro do datamodule estão as conexoes com o INI
//funcoes INI
//Primeiro verifica se tem o arquivo ini de conexão com o banco
//se não tiver precisa perguntar se vai ser local o remoto
procedure TDM.GravarINITableMotoboy(Ip, CaminhoDB, Porta, Pass, Userx,
  Protoc: String);
var
  Arq: TIniFile;
  NovoNome: string;
begin
  (* Cria arquivo ini *)
  NovoNome := dm.DataDirectory + 'ConexaoBanco.ini';
  if not FileExists(NovoNome) then
  begin
    Arq := TIniFile.Create(NovoNome);
    try
      Arq.WriteString('ConexaoBanco', 'HostName', IP);
      Arq.WriteString('ConexaoBanco', 'Database', CaminhoDB);
      Arq.WriteString('ConexaoBanco', 'Port', Porta);
      Arq.WriteString('ConexaoBanco', 'Password', Pass);
      Arq.WriteString('ConexaoBanco', 'User', Userx);
      Arq.WriteString('ConexaoBanco', 'Protocol', Protoc);
      //Autor: Adriano
      //Data: 22/04/2011
      //Não ha mais necessidade da linha abaixo.
      {
      if frmParametrizarBanco.bTipoConnection = True then
        Arq.WriteString('ConexaoBanco', 'Tipo Conexão', RetornaVersaoFirebird)
      else
        Arq.WriteString('ConexaoBanco', 'Tipo Conexão', RetornaVersaoFirebird);
       }
    finally
      FreeAndNil(Arq);
    end;
  end;
end;

procedure TDM.CarregaArquivoIni;
var
  Porta, CaminhoDB: String;
  Arq: TIniFile;
  ListaAtributos: TStrings;
  i: Integer;
  NovoNome: string;
begin
  //Se não tiver gravado o INI no diretorio então cria o INI
  (* Cria arquivo ini *)
  NovoNome := dm.DataDirectory + 'ConexaoBanco.ini';
  if not FileExists(NovoNome) then
  begin
    Arq := TIniFile.Create(NovoNome);
    try
      MeuIP := IdIPWatch1.LocalIP;  //busca o IP da maquina
      Application.CreateForm(TfrmParametrizarBanco, frmParametrizarBanco);
      if frmParametrizarBanco.ShowModal = mrOk then
         GravarINITableMotoboy('', //Nome do computador
                        frmParametrizarBanco.edtCaminhoBanco.Text, //Caminho do banco
                        frmParametrizarBanco.edtPorta.Text,
                        frmParametrizarBanco.edtsenha.Text,
                        frmParametrizarBanco.edtUser.Text,
                        frmParametrizarBanco.cbProtocolo.Text);

    finally
      FreeAndNil(Arq);
    end;
  end;

  //Lista e carrega o INI no sistema
  ListaAtributos := TStringList.Create;
  CaminhoINI := dm.DataDirectory + 'ConexaoBanco.ini';
  //Se existe o INI então conecta
  if not FileExists(CaminhoINI) then
    raise Exception.Create('Atenção! Não foi criado o arquivo CONEXAOBANCO.INI')
  else
  begin
    (* Le o arquivo INI *)
    Arq := TIniFile.Create(CaminhoINI);
    Arq.ReadSectionValues('ConexaoBanco', ListaAtributos);
    sHostName  := Arq.ReadString('ConexaoBanco','HostName','');
    sDatabase  := Arq.ReadString('ConexaoBanco','Database','');
    sPort      := Arq.ReadString('ConexaoBanco','Port','');
    sPassword  := Arq.ReadString('ConexaoBanco','Password','');
    sUser      := Arq.ReadString('ConexaoBanco','User','');
    sProtocol  := Arq.ReadString('ConexaoBanco','Protocol','');
    sLocal     := Arq.ReadString('ConexaoBanco','Tipo Conexão','');
    if sLocal = '(LOCAL)' then
      bLocal := True
    else
      bLocal := False;
  end;
  Arq.Free;
  ListaAtributos.Free;
end;


Depois de ler eu faço uma conexao com a rede atraves de uma procedure
{$IFDEF FULLVERSION}
  {Criando a conexão com o banco}
  AUXConexao:= 1;
  try
    case AUXConexao of
      1: ConectarDataBase;
    end;
   except
     on E: Exception do
       begin
          Raise Exceptio.Create('Erro!' +  e.Message);
          application.terminate;
          exit;
       end;
   end;
  //Se passar pelo ConectarDataBase então faço um select para verificar a chave do sistema
  try
    with dm.registrocliente do
    begin
      Close;
      sql.Clear;
      sql.Text := ' SELECT * FROM registro ';
      Open; <= Mais esta parando aqui e da o erro da imagem acima UNAVAILABLE DATABASE.
      //Ne não tiver registro então abre o form para cadastrar um novo registro
      if IsEmpty then
        ChamaForm(TfrmRegistroCliente, frmRegistroCliente);
    end;
  except
    on E:Exception do
      raise exception.Create(e.Message);
  end;

  {$ENDIF}


A procedure ConectarDatabase é esta aqui
procedure TFRMPRINCIPAL.ConectarDataBase;
begin
  with dm.connection do
  begin
    Database := dm.sDatabase;
    User     := dm.sUser;
    Password := dm.sPassword;
    Protocol := dm.sProtocol;
    Connect;
  end;
end;


O que o zConnection recebe nestas propriedades são
Database := '192.168.1.101:C:\Aldac\Motoboy\Dados\MOTOBOY.FDB'
User := 'SYSDBA'
Password := 'masterkey'
Protocol := 'firebird-2.1'

É isso que o debug mostra ai passa pelo connect e entra no select abaixo cfe mostro no codigo acima.

Na hora do open para abrir a tabela da o erro.

Debuguei com F7 para ver até aonde ia o erro, e caiu na unidade do zeos, ai são varias classes do zeos que chama outra classe e assim vai.

Reparei no bloco do zeos que ele passa diversas vezes por aquiele mesmo local trazendo valor na variavel SQL do codigo do zeos, até chegar o momento que cai a conexao do o banco e da o erro.

Minhas suspeitas recaem ao zeos em ambiente 64 bits, pois compilei no win xp sp3 e funciona, depois compilei o memso projeto no win 7 32bits e funciona também, ja no win 7 64 bits esta dando pau.

Obrigado amigo.


Responder

Gostei + 0

Utilizamos cookies para fornecer uma melhor experiência para nossos usuários, consulte nossa política de privacidade.

Aceitar