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
Delphi'de DLL yazımı hakkında
Forum kuralları
Forum kurallarını okuyup, uyunuz!
Forum kurallarını okuyup, uyunuz!
Delphi'de DLL yazımı hakkında
Mustafa Samet ÜÇGÜN
Öğrenci-Yazılım Geliştirici
Öğrenci-Yazılım Geliştirici
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 ;
Bu Procedureyi, DLL proje dosyasınada declare etmemeiz gerekiyor şu şekilde ;
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.
Bu da dinamik DLL kullanımına bir örnektir.
Umarım Yardımcı olabilmişimdir Başarılar.
Ö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;
Kod: Tümünü seç
exports Form1Yarat;
Ş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;
Umarım Yardımcı olabilmişimdir Başarılar.
Volkan KAMADAN
www.polisoft.com.tr
www.polisoft.com.tr
İ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
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
Öğrenci-Yazılım Geliştirici
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.
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
www.polisoft.com.tr