Ir para conteúdo
Fórum Script Brasil
  • 0

Delphi+mysql+zeos "runtime Error 216 At 1001ada7"


paulobergo

Pergunta

Oi pessoal!

Eu de novo com coisas estranhas no MySQL!!!

Mas vamos lá...

Até então, vinha com sucesso (e empolgado) com o MySQL5+XP+Apache+IIS e o Comp. Zeos...

Só que agora que passei para a parte "pesada", nas aplicações que são, em sua maioria, dll's,

comecei a receber a mensagem de erro "runtime error 216 at 1001ada7" ao sair da aplicação.

Detalhando... 99% das aplicações desktop que eu desenvolvo são dll's, como no exemplo simples

a seguir... ou seja, as janelas (form's) estão todas em dll's chamadas pela aplicação principal...

E tudo ia bem até eu cismar de substituir os componentes de bancos de dados da BDE pelos da Zeos...

A Aplicação até funciona, mas dá a mensagem de erro ao fechar... não precisa sequer abrir uma tabela

do MySQL... basta estabelecer a conexão com o servidor e pronto.

No exemplo a seguir, criei uma dll simples, que tão somente abre um form no desktop e estabelece a

conexão com o MySQL... não faz mais nada e fecha... Após a aplicação "chamadora" fechar, aparece a

mensagem...

Então:

********** Executável - aplicação principal ********** Início.
unit teste2MySQLUnit;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;

type
  TForm1 = class(TForm)
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;
  Function FazLogin(): Boolean; StdCall; External 'uMySQL4.dll';

Implementation

{$R *.dfm}

Procedure TForm1.Button1Click(Sender: TObject);
Begin
  FazLogin();
  ShowMessage('Conectou sem falha?');
  Application.Terminate;
End;
  
End.
********** Executável - aplicação principal ********** Fim.

********** Dll - arquivo principal, que define a uMySQL4.dll ***** Início
Library uMySQL4;  // uMySQL4.dpr

uses
  ShareMem,
  Classes,
  SysUtils,
  Windows,
  Forms,
  Dialogs,
  uMySQL1 in 'uMySQL1.pas' {MySQLForm};

{$R *.res}

Function FazLogin(): Boolean; Export;
Begin
  Try
    Begin
      MySQLForm  := TMySQLForm.Create(Application);
      MySQLForm.SoLogin();
    End;
  Finally
    MySQLForm.Release;
  End;
  FazLogin := True;
End;
Exports FazLogin;

Begin
End.
********** Dll - arquivo principal, que define a uMySQL4.dll ***** Final

********** Dll - unit do form, que contem o componente Zeos ****** Início
unit uMySQL1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, ZConnection;

type
  TMySQLForm = class(TForm)
    FecharButton: TButton;
    ZConn: TZConnection;
    procedure FormActivate(Sender: TObject);
    procedure FecharButtonClick(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
    Function SoLogin(): Boolean;
  end;

Var
  MySQLForm: TMySQLForm;
  sMySQLDatabase, sMySQLUser, sMySQLPass, sMySQLHostName: String;
  bMySQLLoginPrompt: Boolean;
  iMySQLPort: Integer;

Implementation

{$R *.dfm}

Function TMySQLForm.SoLogin(): Boolean;
Begin
  MySQLForm.ShowModal;
  SoLogin := True;
End;

Procedure TMySQLForm.FormActivate(Sender: TObject);
Begin
  sMySQLDatabase    := 'acmeltda';
  sMySQLUser        := 'root';
  sMySQLPass        := '1234r';
  sMySQLHostName    := 'localhost';
  iMySQLPort        := 3306;
  bMySQLLoginPrompt := False;
  With zConn do Begin
    Database := sMySQLDatabase;
    User     := sMySQLUser;
    Password := sMySQLPass;
    HostName := sMySQLHostName;
    Port     := iMySQLPort;
    LoginPrompt := bMySQLLoginPrompt;
    Connected := True;
  End;{With zConn}
End;

Procedure TMySQLForm.FecharButtonClick(Sender: TObject);
Begin
  zConn.Connected := False;
  MySQLForm.Close;
End;

End.
********** Dll - unit do form, que contem o componente Zeos ****** Fim

E' isso aí...

O que pode estar errado?

Os componentes da Zeos (Table, Queries, etc...) comportam-se extremamente bem dentro dos executáveis

mas dentro da dll provoca esse 'bug' na sáida...

Grato por qualquer ajuda!!!

Abraços!

Editado por paulobergo
Link para o comentário
Compartilhar em outros sites

13 respostass a esta questão

Posts Recomendados

  • 0

Opa

Tem alguns erros por exemplo,

TMySQLForm.Create(Application);

Você está fazendo uma referência a Aplicação mas que na verdade

na DLL ela não tem nenhum tipo de linkagem com o EXE, tem interno

mas não por nenhuma variável, como a que você está passando...

O correto era se passar nil neste caso...

também tem coisas desnecessárias ou que poderiam ser melhoradas...

Vou fazer um exemplo aqui e depois posto ele aqui...

abraço

**************************************************************

Fiz um exemplo mais ou menos baseado no seu código...

Download

Senha: scriptbrasil

Compactei também a unit FastShareMem que é uma sucessora

da ShareMem que você está usando, é mais rápida e otimizada e você

não vai precisar distribuir nenhuma DLL como aquela borndlmm.dll,

para usar basta colocar a unit FastShareMem na sua pasta Lib do

Delphi e substituir todos os ShareMem por FastShareMem

Qualquer coisa poste ai...

abraço

Editado por Churc
Link para o comentário
Compartilhar em outros sites

  • 0

Puxa vida... viver não é preciso... mas aprender é!!!

Devo ter perto de umas trezentas dll's desse tipo... todas no mesmo padrão e a maioria delas ia receber o componente da Zeos... (isto é, irão receber!)... então, foi ótimo solucionar isso!!!

Agradeço muitíssimo pela colaboração!

Abraços!

Link para o comentário
Compartilhar em outros sites

  • 0

Olá Churc!

E'... estamos de volta!

O esquema de criar as dll's do jeito que você indicou quase resolveram o problema...

Infelizmente, bastou colocar um componente zTable da Zeos para a mensagem voltar! isso acontece também com os componentes Query... tudo funciona direitinho, mas na hora de fechar, eis que surge a mensagem de "runtime error..."

Executando na IDE, aparece também esta mensagem "MySQLConn.exe raised too many consecutive exceptions: 'access violation...'"...

E o chato é que isso só acontece com os componentes da ZeosLib... com uma TQuery ou TTable da BDE (inclusive com o conector ODBC para o MySQL), tudo certo...

Ao código que você passou, eu só acrescentei isso:

Try
      Connected := True; // Removi porque aqui não tem como eu conectar...
      bIsOk := True;
    Except
      bIsOk := False;
    End;
    If bIsOk then
      Begin
        zQuery := TZReadOnlyQuery.Create(Self);
        zQuery.Connection := zConn;
        zQuery.SQL.Add('select * from dbsenha');
        Try
          zQuery.Open;
          bTableOk := True;
        Except
          bTableOk := False;
        End;
        If bTableOk then
          ShowMessage('conectou legal e abriu a query...')
        Else
          ShowMessage('conectou legal mas não abriu a query...');
        {EndIf}
        If bTableOk then
          Begin
            zQuery.Close;
            ShowMessage('Tabela Fechada!');
          End;
        {EndIf}
        ShowMessage('Destruir!');
        zQuery.Destroy;
        ShowMessage('Enfim!');
      End
    Else
      ShowMessage('olha os parametros porque não conectou!');
    {EndIf}
    ShowMessage('ok até aqui?');

Ah... no código acima, fiz a tentativa de resolver o problema criando o comp. query dinamicamente... mas isso tambem não resolveu...

Então, pessoal, novamente, grato por qualquer ajuda!!!

Abraços!

Link para o comentário
Compartilhar em outros sites

  • 0

E'... não sei porque há bloqueio para fazer o download clicando diretamente no link...

Mas acho que você consegue baixá-lo, com um ritght-click e salvar destino como...

De qualquer forma, salvei outra cópia neste link:

Link para o comentário
Compartilhar em outros sites

  • 0

Opa

Então pra mim não deu erro, porque não tem como eu fazer a conexão aqui,

o erro como você mencionou é usando o ztable e zquery, mas de qualquer

forma, você declarou fastsharemem na DLL e não declarou no EXE, para isso

vai no menu Project, View Source e declare a FastShareMem no EXE...

Isso pode ser a causa do problema mas pouco provável, se não for fica difícil

te ajudar visto que não tenho um servidor de MySQL aqui

Lembrando que a unit FastShareMem tem que ser a primeira de todas...

library bla;

uses

FastShareMem,

...

program ble;

uses

FastShareMem,

...

abraço

Link para o comentário
Compartilhar em outros sites

  • 0

Oi...

Realmente, declarar ou não a fastsharemem não faz diferença... tem mesmo alguma coisa pegando na Zeos...

Já experimentei até mesmo criar os componentes dinamicamente, mas também não adianta...

Agora, isso tudo só acontece nas dll's... nas aplicações normais (executáveis), não tem problema...

Ainda vou experimentar colocar estes componentes em outro programa agora, que vai rodar como um serviço no xp para dar acesso às tabelas do MySQL para os usuários dos programas em Clipper... vamos ver se, como serviço, os componentes da Zeos resolvem funcionar sem problemas!

Por enquanto, nas dll's, vou usando o TDatabase mesmo!

De qualquer forma, agradeço muitissimo a colaboração!!!

Abraços!

Link para o comentário
Compartilhar em outros sites

  • 0
Oi...

Realmente, declarar ou não a fastsharemem não faz diferença... tem mesmo alguma coisa pegando na Zeos...

Já experimentei até mesmo criar os componentes dinamicamente, mas também não adianta...

Agora, isso tudo só acontece nas dll's... nas aplicações normais (executáveis), não tem problema...

Ainda vou experimentar colocar estes componentes em outro programa agora, que vai rodar como um serviço no xp para dar acesso às tabelas do MySQL para os usuários dos programas em Clipper... vamos ver se, como serviço, os componentes da Zeos resolvem funcionar sem problemas!

Por enquanto, nas dll's, vou usando o TDatabase mesmo!

De qualquer forma, agradeço muitissimo a colaboração!!!

Abraços!

Opa

Então, por enquanto não está fazendo diferença porque você não esta passando

dados entre a DLL e o EXE, mas quando começar a passar vai fazer diferença sim!

Agora, vou instalar o MySQL Server aqui e testar, ai eu te posto o que houve...

abraço

Link para o comentário
Compartilhar em outros sites

  • 0
Guest --Magno --

Opa. Eu estava com o mesmo problema, meu delphi é o 2005 + mysql5 + zeos. Só de conectar o Zconnection1 e sair do aplicativo já dava o erro.

Resolvi simplesmente renomeando a libmysql5.dll(que vei junto com o componente zeos) para lybmysql.dll e copiando ela para a pasta windows\system32.

Falou.

Link para o comentário
Compartilhar em outros sites

Participe da discussão

Você pode postar agora e se registrar depois. Se você já tem uma conta, acesse agora para postar com sua conta.

Visitante
Responder esta pergunta...

×   Você colou conteúdo com formatação.   Remover formatação

  Apenas 75 emoticons são permitidos.

×   Seu link foi incorporado automaticamente.   Exibir como um link em vez disso

×   Seu conteúdo anterior foi restaurado.   Limpar Editor

×   Você não pode colar imagens diretamente. Carregar ou inserir imagens do URL.



  • Estatísticas dos Fóruns

    • Tópicos
      152k
    • Posts
      651,7k
×
×
  • Criar Novo...