- Geçtiğimiz günlerde OCR için DLL çalışması yapıyordum. Aklıma bir fikir geldi, bu fikri hayata geçirdim. Sizlerle bunu paylaşmak istedim.
- Bir DLL dosya da olabilir, bir EXE dosya da, bir resim dosyası da... vb. hangi türde bir dosya olursa olsun; asıl projemiz ile birlikte yer alacak yan unsur ise ne yapıyoruz? Aynı klasörde yer alacak şekilde RAR ile paketliyoruz veya SETUP oluşturup pakete dahil ediyoruz.
- Bu yan unsur olan dosya(lar)ı RESOURCE dosyası haline getirerek çalışan EXE'nin bizzat kendisine gömmek imkanımız da var. Benim de dahil olduğum bir çoğumuz böyle de kullanıyoruz.
- Bugün DLL dosylarını paket olarak da resource olarak da eklemek istemediğimi değerlendirdim ve alternatif olabilecek bir metod düşündüm ve bu proje bu şekilde doğdu.
- Bir DLL dosyasını örnek vereyim. Vereceğimiz bir DLL dosyasını bir filestream ile byte byte okuyup bir diziye HEX kodlarını koyup, bunu UNIT haline dönüştüren basit bir proje hazırladım.
- Daha sonra siz kendi projenizde; bu UNIT'i uSES ile ekleyip içerisindeki CONST ifadeyi direkt bir FileStream'e basıp diske kaydediyor, kullanıp işi bittiğinde diskten siliyorsunuz. Projeniz de derli toplu oluyor, yanına da ek başka dosya koymuyorsunuz.
- Bu başlığın ekinde;
- (1) "File to Delphi UNIT" yazılımı,
- (2) Bu yazılım yardımı ile üretilmiş UNIT kullanılarak sonuç alınmış örnek bir proje yer almaktadır.
- Bu yazılım iki farklı dosya üretiyor.
(1) UNIT dosyası ( dosyanın binary array içeren hali )
(2) PROJE dosyası ( bu UNIT'in hangi şekilde kullanılabileceğini içeren örnek )
(1)
Kod: Tümünü seç
Unit Delphi_OCR_01;
Interface
Const
strOrjDosya = 'OCR_01.dll';
Dizi_Delphi_OCR_01 : Array [0..127487] of Byte =
(
$4D,$5A,$50,$00,$02,$00,$00,$00,$04,$00,$0F,$00,$FF,$FF,$00,$00,$B8,$00,$00,$00,$00,$00,$00,$00,$40,$00,$1A,$00,$00,$00
,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
,$00,$01,$00,$00,$BA,$10,$00,$0E,$1F,$B4,$09,$CD,$21,$B8,$01,$4C,$CD,$21,$90,$90,$54,$68,$69,$73,$20,$70,$72,$6F,$67,$72
,$61,$6D,$20,$6D,$75,$73,$74,$20,$62,$65,$20,$72,$75,$6E,$20,$75,$6E,$64,$65,$72,$20,$57,$69,$6E,$33,$32,$0D,$0A,$24,$37
...
...
,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
);
implementation
end.
Kod: Tümünü seç
// Dönüşüm Fonksiyonu //
// ------------------ //
// Kullanım (1)//
USES Delphi_OCR_01
Function Donusum( strDosyaAdi: String ): Boolean;
Var
fsDosya : TFileStream;
begin
Result := False;
Try
fsDosya := TFileStream.Create( strDosyaAdi, fmCreate );
fsDosya.Write( Dizi_Delphi_OCR_01, High( Dizi_Delphi_OCR_01)+1 );
fsDosya.Free;
Finally
Result := True;
End;
end;
// Herhangi bir dosya ise aşağıdaki şekil yeterli //
begin;
Donusum( ExtractFilePath(Application.Exename) + strOrjDosya )
end;
// Kullanım (2)//
// Dosya bir DLL ise Dynamic Yükleyip Kullanımı //
// (uses ShareMem burada önemli...)
USES ShareMem, Delphi_OCR_01
Function BizimFonk( iSayi1, iSayi2:Integer ):Boolean;
Function Donusum( strDosyaAdi: String ): Boolean;
Var
fsDosya : TFileStream;
begin
Try
fsDosya := TFileStream.Create( strDosyaAdi, fmCreate );
fsDosya.Write( Dizi_Delphi_OCR_01, High( Dizi_Delphi_OCR_01)+1 );
fsDosya.Free;
Finally
Result := True;
End;
end;
type // Kullanılacak Fonksiyon / Procedure tanımladık
TBizimType = function ( iParam01, iParam02:Integer ): Boolean; stdcall;
var
dllHand : THandle;
BizimFn : TBizimType;
strDLL : String;
begin
Result := True;
strDLL := ExtractFilePath(Application.Exename) + strOrjDosya;
Donusum( strDLL )
dllHand := LoadLibrary( PChar( strDLL ) ) ;
if dllHand <> 0 then
begin
@BizimFn := GetProcAddress(dllHand, '<"TBizimType" ile parametresi yazılan fonksiyon adı>') ;
if Assigned (BizimFn) then
begin
Result := BizimFn( iSayi1, iSayi2 );
end
else ShowMessage('DLL içerisinde istenen fonksiyonu Export edilmemiş...');
FreeLibrary(dllHand) ;
end
else ShowMessage('DLL dosyası bulunamadı veya yüklenemedi...');
if FileExists( strDLL ) then DeleteFile( strDLL );
end;