• 0
Sign in to follow this  
paulobergo

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

Question

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!

Edited by paulobergo

Share this post


Link to post
Share on other sites

13 answers to this question

Recommended Posts

  • 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

Edited by Churc

Share this post


Link to post
Share on other 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!

Share this post


Link to post
Share on other 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!

Share this post


Link to post
Share on other sites
  • 0

Opa eheh

Paulobergo coloque o código fonte em algum site que hospede

arquivos, porque desta maneira fica dificil ajudar...

Coloque no rapidshare.com por exemplo, deixe somente o código

fonte sem .exe e sem .dll

abraço

Share this post


Link to post
Share on other sites
  • 0

Ok...

misterio.zip

Grato pela ajuda!!!

Abraços!

Share this post


Link to post
Share on other sites
  • 0

Opa

Não está fazendo download diz que não tenho acesso, acho que você

precisa compartilhar o arquivo!

abraço

Share this post


Link to post
Share on other 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:

Share this post


Link to post
Share on other 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

Share this post


Link to post
Share on other 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!

Share this post


Link to post
Share on other 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

Share this post


Link to post
Share on other 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.

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Answer this question...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Sign in to follow this