DLL içinde Veritabanı İşlemleri

Delphi'de kod yazma ile ilgili sorularınızı bu foruma yazabilirsiniz.
morphine39
Üye
Mesajlar: 35
Kayıt: 02 May 2009 04:50

DLL içinde Veritabanı İşlemleri

Mesaj gönderen morphine39 »

Selam Herkeze


Yapmak istediğim olay şu Mysql veritabanı kullanıyorum ve bu veritabanı için INSERT UPDATE gibi işlemleri bir dll içinden True/false kontrollü yapmak istiyorum.

Mysql veritabanı için zeos componentini kullanarak bağlanıyorum

DLL içindeki kod şu şekilde

Kod: Tümünü seç

library lib;
uses
  SysUtils,Classes,Windows,Messages,Variants,Graphics,Controls,Forms,Dialogs,ComCtrls,
   StdCtrls,ZDataset;

procedure Uyari(msg:AnsiString;tip:Boolean);export;
var
  islem : Word;
begin
  if tip then
    islem := MB_ICONASTERISK
  else
    islem := MB_ICONERROR;
  Application.MessageBox(lpcstr(msg),'Uyarı',islem);
end;

function Yol(app:TApplication):AnsiString;stdcall;
begin
  Result := ExtractFilePath(app.ExeName);
end;

function ZExec(z:TZQuery):Boolean;stdcall;
begin
  Result := True;
end;

exports
  Uyari,
  Yol,
  ZExec;

{$R *.res}

begin
end.
Yukarıdaki ZConnection, DB,ZAbstractRODataset, ZAbstractDataset, ZDataset
ünitlerini ekledikten sonra şu şekilde bir hata almaya başladım. bunları eklemeden önce çok rahat bir şekilde bu dll yi kullandığım exede sorun olmıyodum
Ama bu ünitleri ekledikten sonra sorun yaşamaya başladım

exeye de şu şekilde ekledim fonksiyonları

Kod: Tümünü seç

function Yol(app:TApplication):AnsiString;stdcall;external 'lib.dll';
procedure Uyari(msg:AnsiString;tip:Boolean);far;external 'lib.dll';
Aldığım hata

Resim

http://www.malicetin.com/hata.jpg

Acilen yardımcı olursanız sevinirim
morphine39
Üye
Mesajlar: 35
Kayıt: 02 May 2009 04:50

Re: DLL içinde Veritabanı İşlemleri

Mesaj gönderen morphine39 »

Arkadaşlar yardımcı olabilecek yada yol gösterebilecek varmı?
Ertugrul
Üye
Mesajlar: 136
Kayıt: 09 May 2009 12:05

Re: DLL içinde Veritabanı İşlemleri

Mesaj gönderen Ertugrul »

Oncelikle program klasorunde borlandMM (Ya da fastmm olabilir) dll'i atilmadan delphi libleri arasi string paylasilamaz. Ayrica hata programi calistirirken mi yoksa DLL de belli bir fonksiyonu cagirirken mi olusuyor? Zeoslibin D2009 (ya da D2010) surumunu kurdugunuzdan emin misiniz?
morphine39
Üye
Mesajlar: 35
Kayıt: 02 May 2009 04:50

Re: DLL içinde Veritabanı İşlemleri

Mesaj gönderen morphine39 »

Üstad program çalışırken hata veriyor. DLL de fonksiyon çağırırken sorun yok.

Bu bahsettiğiniz

//Oncelikle program klasorunde borlandMM (Ya da fastmm olabilir) dll'i atilmadan delphi libleri arasi string paylasilamaz//

Konusunu anlıyamadım. Biraz açma şansınız olabilirmi?
morphine39
Üye
Mesajlar: 35
Kayıt: 02 May 2009 04:50

Re: DLL içinde Veritabanı İşlemleri

Mesaj gönderen morphine39 »

Bide şunu da belirteyim şu an kullandığım zeos 6.6.5 Stable sürümü
Ertugrul
Üye
Mesajlar: 136
Kayıt: 09 May 2009 12:05

Re: DLL içinde Veritabanı İşlemleri

Mesaj gönderen Ertugrul »

Delphi surumunuz 2009 ya da 2010 mu? Oyle ise zeoslib desteklemiyormus.
Due to the Unicode problem with D2009 we will support D2009 in ZeosLib 7
.

Eger D2009 oncesi bir surum ise program klasorune borlandmm.dll i atip oyle deneyin.
morphine39
Üye
Mesajlar: 35
Kayıt: 02 May 2009 04:50

Re: DLL içinde Veritabanı İşlemleri

Mesaj gönderen morphine39 »

Delphi 7 kullanarak yazıyorum programı da dll dosyamı da sizin dediğiniz gibi yazdığım programın exesinin olduğu yere borlndmm.dll dosyasını attım yeniden Zeos un unitlerini dll dosyasına ekledim. programı çalıştırdığımda yeniden hata verdi??

Başka bir çözüm önerebilecekmisiniz acaba??

Yardımlarınız için çok telekkürler
morphine39
Üye
Mesajlar: 35
Kayıt: 02 May 2009 04:50

Re: DLL içinde Veritabanı İşlemleri

Mesaj gönderen morphine39 »

Benim anlamadıım başka programlarda nasıl oluyor da bu dll leri kullanabiliyorlar. DLL içinden sql çalıştırabiliyorlar.

Yapmak istediğim sadece sql çalıştırma işini dll içinden yapmak.

DLL ye sql komutunu göndericem DLL içinde sql çalışıp. Çalıştıysa hatasız şekilde true, çalışmadıysa yani hata verdiyse false döndürücek.
Bunu yapabileceğim başka bir yöntem biliyorsanız onu önerirseniz oda kabulum ama ben sql işlemlerimi dll içinden yapmak istiyorum
Ertugrul
Üye
Mesajlar: 136
Kayıt: 09 May 2009 12:05

Re: DLL içinde Veritabanı İşlemleri

Mesaj gönderen Ertugrul »

Madem program acilirken hata veriyor su sekilde deneyelim;

Kod: Tümünü seç

//function Yol(app:TApplication):AnsiString;stdcall;external 'lib.dll';
//procedure Uyari(msg:AnsiString;tip:Boolean);far;external 'lib.dll';   // baslarina // ekledik, dll le ilgili baska kod kalmayacak sekilde biraktik

....

procedure uyariver(msg:string;tip:boolean);
type
 TUyari = procedure(msg:string;tip:boolean);
var
  Uyari:TUyari;
  dllHandle:Cardinal;
begin
  dllHandle := LoadLibrary('dllAdi.dll');
 if dllHandle <> 0 then
 begin
   @Uyari := GetProcAddress(dllHandle, 'Uyari');
   Uyari(msg,tip);
   FreeLibrary(dllHandle);
 end;
end;


uyariver('deneme',true);
morphine39
Üye
Mesajlar: 35
Kayıt: 02 May 2009 04:50

Re: DLL içinde Veritabanı İşlemleri

Mesaj gönderen morphine39 »

Hocam verdiğiniz şekilde dll de programda çalıştı.

Ama sql çalışıp çalışmadığını denemedim açıkçası


Çok teşekkür ediyorum hocam yardımlarınız için. Kodu denedim çalıştı gayet iyi bir şekilde
ve beni bu büyük sıkıntıdan kurtardığınız için teşekkür ederim

Bu en son verdiğiniz kodun işlevini açma şansınız var mı acaba??
Ertugrul
Üye
Mesajlar: 136
Kayıt: 09 May 2009 12:05

Re: DLL içinde Veritabanı İşlemleri

Mesaj gönderen Ertugrul »

Gosterdigim sekilde DLL dinamik olarak cagiriliyor ve is bitince free ediliyor fakat program icinde surekli cagiracaginiz icin bana pek mantikli gelmiyor. Saniyorum sizdeki hatanin kaynagi DLL i cagirirken far ve/veya stdcall kullanmaniz.. Onlari kaldirip tekrar deneyin.
morphine39
Üye
Mesajlar: 35
Kayıt: 02 May 2009 04:50

Re: DLL içinde Veritabanı İşlemleri

Mesaj gönderen morphine39 »

HOCAM SİZİN GÖSTERDİĞİNİZ PROCEDURE ÖRNEĞİ İLE AYNI YOL FUNCTİONUNU YAPTIM FAKAT BU SEFER DE DLL DEKİ YOL FUNCTİONU ÇAKTI :S

Ne Yapmamı Önerirsiniz?
Ertugrul
Üye
Mesajlar: 136
Kayıt: 09 May 2009 12:05

Re: DLL içinde Veritabanı İşlemleri

Mesaj gönderen Ertugrul »

dll den yol icin stdcall ifadesini kaldirdiniz mi?
morphine39
Üye
Mesajlar: 35
Kayıt: 02 May 2009 04:50

Re: DLL içinde Veritabanı İşlemleri

Mesaj gönderen morphine39 »

Kaldırmadım hocam

hemen kaldırıp tekrar deniyorum..
morphine39
Üye
Mesajlar: 35
Kayıt: 02 May 2009 04:50

Re: DLL içinde Veritabanı İşlemleri

Mesaj gönderen morphine39 »

Hocam Kodun son hali bu


DLL

Kod: Tümünü seç

library lib;
uses
  Windows,
  Messages,
  SysUtils,
  Variants,
  Classes,
  Graphics,
  Controls,
  Forms,
  Dialogs,
  ComCtrls,
  StdCtrls,
  ZConnection,
  DB,
  ZAbstractRODataset,
  ZAbstractDataset,
  ZDataset;

procedure Uyari(msg:AnsiString;tip:Boolean);export;
var
  islem : Word;
begin
  if tip then
    islem := MB_ICONASTERISK
  else
    islem := MB_ICONERROR;
  Application.MessageBox(lpcstr(msg),'Uyarı',islem);
end;

function ZExec(sqlcode:AnsiString;con:TZConnection):Boolean;export;
var
  sorgu   : TZQuery;
  kontrol : Boolean;
begin

  sorgu := TZQuery.Create(nil);
  with sorgu do
  begin
    Connection := con;
    Close;
    SQL.Clear;
    SQL.Add(sqlcode);
    try
      ExecSQL;
      kontrol := True;
    except
      kontrol := False;
    end;
    Close;
    Free;
  end;
  Result := kontrol;

end;

exports
  Uyari,
  ZExec;

EXE

Kod: Tümünü seç

unit UANA;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, Menus, ExtCtrls, Buttons, StdCtrls, XPMan, CCR.XPMenuBar, jpeg,
  ActnList, DB, ZAbstractRODataset, ZAbstractDataset, ZDataset, ZConnection;

type
  TFrmAna = class(TForm)
    MainMenu1: TMainMenu;
    Cari1: TMenuItem;
    Kasa1: TMenuItem;
    ek1: TMenuItem;
    Senet1: TMenuItem;
    Personel1: TMenuItem;
    Banka1: TMenuItem;
    Stok1: TMenuItem;
    Ajanda1: TMenuItem;
    Notlar1: TMenuItem;
    Raporlar1: TMenuItem;
    Ayarlar1: TMenuItem;
    Hakknda1: TMenuItem;
    Hakknda2: TMenuItem;
    Kapat1: TMenuItem;
    XPManifest1: TXPManifest;
    CariHesaplar1: TMenuItem;
    Action: TActionList;
    CariHesaplar: TAction;
    baglan: TZConnection;
    sorgu: TZQuery;
    con_ctrl: TZConnection;
    procedure CariHesaplarExecute(Sender: TObject);
    procedure Kapat1Click(Sender: TObject);
    procedure FormCreate(Sender: TObject);
    procedure Kasa1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
    procedure Uyari(msg:string;tip:boolean);
    function ConCtrl:Boolean;    
  end;

var
  FrmAna: TFrmAna;

implementation

uses UCari;

{$R *.dfm}

function SQLExec(sqlcode:String;con:TZConnection):Boolean;
type
  TZexec = function(sqlcode:AnsiString;con:TZConnection):Boolean;
var
  ZExec:TZexec;
  dllHandle:Cardinal;
  kontrol : Boolean;
begin
  dllHandle := LoadLibrary('lib.dll');
if dllHandle <> 0 then
begin
   @ZExec := GetProcAddress(dllHandle, 'ZExec');
   kontrol:=ZExec(sqlcode,con);
   FreeLibrary(dllHandle);
   Result := kontrol;
end;
end;

function TFrmAna.ConCtrl:Boolean;
var
  ayar : TStringList;
begin
  ayar  := TStringList.Create;
  ayar.LoadFromFile(ExtractFilePath(Application.ExeName)+'\data.dll');
  with con_ctrl do
  begin
    HostName  := ayar.Strings[0];
    User      := ayar.Strings[1];
    Password  := ayar.Strings[2];
    Database  := ayar.Strings[3];
    Catalog   := ayar.Strings[3];
    Port      := StrToInt(ayar.Strings[4]);
    Protocol  := ayar.Strings[5];
    try
      Connect;
      Result := True;
    except
      Result := False;
    end;
    Disconnect;
  end;
  ayar.Free;
end;

procedure TFrmAna.Uyari(msg:string;tip:boolean);
var
  islem : Word;
begin
  if tip then
    islem := MB_ICONASTERISK
  else
    islem := MB_ICONERROR;
  Application.MessageBox(lpcstr(msg),'Uyarı',islem);
end;

procedure TFrmAna.CariHesaplarExecute(Sender: TObject);
var
  f : TFrmCari;
begin
  f := TFrmCari.Create(Self);
  f.Show;
end;

procedure TFrmAna.Kapat1Click(Sender: TObject);
begin
  Close;
end;

procedure TFrmAna.FormCreate(Sender: TObject);
var
  ayar : TStringList;
begin

  //Veritabanı Ayarları Yükleniyor

  ayar := TStringList.Create;
  ayar.LoadFromFile(ExtractFilePath(Application.ExeName)+'\data.dll');
  with baglan do
  begin
    HostName  := ayar.Strings[0];
    User      := ayar.Strings[1];
    Password  := ayar.Strings[2];
    Database  := ayar.Strings[3];
    Catalog   := ayar.Strings[3];
    Port      := StrToInt(ayar.Strings[4]);
    Protocol  := ayar.Strings[5];
    try
      Connect;
    except
      Uyari('Veritabanına Bağlanılamadı.Lütfen Ayarlarınızı Kontrol Edin Yada Sistem Yöneticiniz İle Temasa Geçin',False);
      Close;
    end;
    
  end;

end;

procedure TFrmAna.Kasa1Click(Sender: TObject);
begin
  if SQLExec('SELECT * FROM birimler',baglan) then
    ShowMessage('Selam')
  else
    ShowMessage('Hata');
end;

end.

Hocam kasa1.click layında sqlExec fonksiyonunu kullandığım yer bu sefer de fonksiyon falan gayet normal çalışıyor. ama çalıştıktan sonra sistemi kitliyor yada hata veriyor..

Acaba diyorum bellekten mi silemiyor?? Yanlış mı düşünüyrum hocam??
Cevapla