Delphi'de DLL yazımı hakkında

Delphi'de kod yazma ile ilgili sorularınızı bu foruma yazabilirsiniz.
Cevapla
msucgun
Üye
Mesajlar: 5
Kayıt: 28 Eyl 2003 10:22
Konum: istanbul
İletişim:

Delphi'de DLL yazımı hakkında

Mesaj gönderen msucgun »

Merahaba Arkadaşlar,

İstemcisi Delphi ile Sunucu tarafı da VB ile yazılan
bir uygulama geliştiriyorum. İki uç arasında gidip
gelen XML'i sıkıştırıp açabileceğim bir dll
yazıyorum.DLL'i TurboPower'ın Abbrevia bileşenleri ile
yazıyorum.Ama dll kodu içerisinde AbZipper ve AbUnzper
birimlerinden türettiği nesneleri Create
edemiyorum.Otomatik create olur diye dll içine bir
DataModule ekledim ve AbZipper ve AbUnziper
nesnelerini buraya koydum.Modül içine sıkıştıma ve
açma için iki tane Public metod ekledim ve bunları
dll'in asıl kodunda çağırdım.Yazdığım kod şu şekilde:
-------------------------------------------------------
Zipper.pas

library Zipper;
uses
SysUtils,
Classes,
AbZipper,
AbUnzper,
UdmZip in 'UdmZip.pas' {dmZipper: TDataModule};

{$R *.res}

function
compress(FName:PChar;ZipFileName:PChar):Boolean;export;stdcall;
begin
Result:=dmZipper.compress(FName,ZipFileName);
end;

function
decompress(ZipFileName:PChar;ExtFile:PChar):Boolean;export;stdcall;
begin
Result:=dmZipper.decompress(ZipFileName,ExtFile);
end;

exports
compress,
decompress;

begin
end.
-------------------------------------------------------
UdmZip.pas

unit UdmZip;

interface

uses
SysUtils, Classes, AbUnzper, AbBase, AbBrowse,
AbZBrows, AbZipper;

type
TdmZipper = class(TDataModule)
Zip: TAbZipper;
Unzip: TAbUnZipper;
private
{ Private declarations }
public
function
compress(FName:PChar;ZipFileName:PChar):Boolean;
function
decompress(ZipFileName:PChar;ExtFile:PChar):Boolean;
{ Public declarations }
end;

var
dmZipper: TdmZipper;

implementation

{$R *.dfm}

{ TDataModule1 }

function TdmZipper.decompress(ZipFileName, ExtFile:
PChar): Boolean;
begin
with UnZip do
begin
FileName := ZipFileName;
BaseDirectory := ExtractFilePath(FileName);
ExtractFiles(ExtFile);
end;
Result:=FileExists(ExtFile);
end;

function TdmZipper.compress(FName, ZipFileName:
PChar): Boolean;
begin
with Zip do
begin
AutoSave:=True;
FileName:=ZipFileName;
AddFiles(FName,0);
end;
Result:=FileExists(ZipFileName);
end;

end.
-------------------------------------------------------

Bu kodu yazıp derlediğimde dll oluşuyor.Sıkıntı
yaşadığım noktalar şu şekilde

1-DLL'i register etmek istediğimde RegSvr32'den şu
hata dönüyor:"Zipper.dll was loaded, but the
DLLRegisterServer entry point was not found.
DLLRegisterServer may not be exported, or corrupt
version of Zipper.dll may be in memory.Consider using
PView to detect and remove it."
2-DLL metodlarını VB'de ve Delphi'de deklare edip
kullanmak istediğimde "Access Violation" hatası
alıyorum.Sanıyorum DataModule create olmuyor. Ya da
dll'i statik bağladım ve eski versiyon hafızadan
silinmedi.Statik ve dinamik bağlamayla ilgili kısa bir
bilgi verir misiniz?

Yardımcı olursanız çok sevinirim.
Saygılar ve iyi çalışmalar
Mustafa Samet ÜÇGÜN
Öğrenci-Yazılım Geliştirici
Kullanıcı avatarı
vkamadan
Kıdemli Üye
Mesajlar: 1935
Kayıt: 17 Mar 2004 03:52
Konum: Adapazarı
İletişim:

Mesaj gönderen vkamadan »

Merhaba ,
Öncelikle mesajı biraz geç farkettim.çözümü bulamadınız analaşlıan belirtmemişsiniz çünkü,
Size DLL dinamik bağlantıdan bahsetmek istiyorum örnek olsun die DLL içinde bir formu dinamk olarak çağırmaktan bahsedeceğim. (siz bunu Datamodule uyarlamakta zorlanazsınız)
unutmadan DLL içindeki herşeyi sizin create etmeniz gerekir.
Öncelikle DLL içimize Formu yaratıcı Public bir procedure yazıyoruz örnek ;

Kod: Tümünü seç

procedure Form1Yarat;
var
MyForm:TForm1;
begin
 try
  MyForm:=TForm1.create(nil);
  MyForm.ShowModal;
 finally
 MyForm.free;
end;
end;
Bu Procedureyi, DLL proje dosyasınada declare etmemeiz gerekiyor şu şekilde ;

Kod: Tümünü seç

exports Form1Yarat;
Bu kadar DLL miz kullanıma hazır, biz dışarıdan Form1Yarat Proceduresini çağırdığımızda Form Creaate edilecek ve Gösterilecek.
Şimdi Çağıracağımız Programda yapacaklarımıza b ir göz atalım.

Kod: Tümünü seç

procedure DLLCagir(Kitaplik, Prosedur: String);
var
Handle:integer;
Blok:Procedure;
begin
   Handle:=LoadLibrary(Pchar(Kitaplik));
   if Handle<>0 then
     begin
       @Blok:=GetProcAddress(Handle,Pchar(Prosedur));
       if @Blok<>nil then Blok else
         begin
           ShowMessage('HATA : Çağrılan Procedure Bulunamadı..!');
         end;
     end else
       begin
          ShowMessage('HATA : Kitaplık Dosyası Bulunamadı..!');
       end;
 end;
Bu da dinamik DLL kullanımına bir örnektir.
Umarım Yardımcı olabilmişimdir Başarılar.
Volkan KAMADAN
www.polisoft.com.tr
msucgun
Üye
Mesajlar: 5
Kayıt: 28 Eyl 2003 10:22
Konum: istanbul
İletişim:

Mesaj gönderen msucgun »

İlgilendiğiniz için teşekkür ederim Volkan Bey,

Bahsettiğiniz dll biçimi standart bir dll. Ben yazmış olduğum bu dll dosyasını VB ile yazdığım sunucu tarafında da kullanmak istiyorum yani COM dll'i olarak oluşturmam gerekiyor.Yazdığınız DLLCagir yöntemi sadece Delphi'ye özgü bir kod.VB'de nasıl kullanacağım bunu?

Saygılar ve iyi çalışmalar
Mustafa Samet ÜÇGÜN
Öğrenci-Yazılım Geliştirici
Kullanıcı avatarı
vkamadan
Kıdemli Üye
Mesajlar: 1935
Kayıt: 17 Mar 2004 03:52
Konum: Adapazarı
İletişim:

Mesaj gönderen vkamadan »

Mehaba,
VB konusunda bilgim yok. Yardımcı olamayacağım.
Ama DLL içinde herhangi bir değişiklik yapmanız gerek yok. VB ye özgün DLL yükleme fonksiyonları işinize yarayacaktır Delphiden daha kolay olacağını düşünüyorum.
Başarılar.
Volkan KAMADAN
www.polisoft.com.tr
msucgun
Üye
Mesajlar: 5
Kayıt: 28 Eyl 2003 10:22
Konum: istanbul
İletişim:

Mesaj gönderen msucgun »

Teşekkür ederim Volkan Bey. Borcum olsun:-)

Saygılar ve iyi çalışmalar
Mustafa Samet ÜÇGÜN
Öğrenci-Yazılım Geliştirici
Cevapla