Fórum access violation at address 000000 no win7 ? #400246
03/05/2011
0
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
Curtir tópico
+ 0Posts
03/05/2011
Adriano Dolce
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
Gostei + 0
05/05/2011
Rafael Mattos
Gostei + 0
05/05/2011
Adriano Dolce
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.
Gostei + 0
05/05/2011
Rafael Mattos
-----------
Da uma olhada ve na pasta desse projeto não tem uma versão de dll antiga
Gostei + 0
05/05/2011
Adriano Dolce
-----------
Da uma olhada ve na pasta desse projeto não tem uma versão de dll antiga
Gostei + 0
05/05/2011
Rafael Mattos
Gostei + 0
05/05/2011
Adriano Dolce
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.
Gostei + 0
05/05/2011
Adriano Dolce
[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.
Gostei + 0
Clique aqui para fazer login e interagir na Comunidade :)