Exe İçerisine Dosya Gömmek Delphi ile oluşturduğumuz exe dosya içerisine dosya gömme işlemi yapabiliriz. Bu işlemi resource kullanarak yapabiliriz. Böylece API tarafından bizim oluşturduğumuz farklı yapıdaki dosya yapıları kullanılabilir. Bu dosyaları kaynaklarından direkt olarak çağırabilir. Aşağıda farklı yapılardaki dosyalara erişimlere örnekler vereceğiz. Öncelikle Resource dosya oluşturmakla başlayalım. tanımlı olarak oluşturduğumuz dosyaya RESOURCES. RC adını verelim. Basit bir text dosyası olarak oluşturabiliriz. Bu dosya için bir isim, veri tipi ve dosyanın adını içerir: sample_bmp BITMAP sample. bmp sample_ico ICON sample. ico sample_cur CURSOR sample. cur sample_ani ANICURSOR sample. ani sample_jpg JPEG sample. jpg sample_wav WAVE sample. wav sample_txt TEXT sample. txt Yukarıda tipleri belirtilmiş kaynak dosyalar ve tipleri veriliyor. Dosyalar öncelikel. RES içerisinde ifade edilip daha sonra işlemi ile oluşturulan Delphi dosyasına aktarılıyor. . RC dosyamızı compile ederek. RES dosyasına çevirmemiz gerekiyor. Delphi, programımızı compile ederken bizim oluşturduğumuz. RES dosyasını okur ve ona göre embedding işlemi yapar. Resource compile işlemi için (brcc32. exe) dosyasını kullanacağız. Bu dosyayı Delphi\Bin klasöründe bulabilirsiniz. Komut satırından kolay bir kullanımı var: C:\DELPHI\BIN>brcc32 resources C:\DELPHI\BIN>brcc32 resources Borland Resource Compiler Version 5.40 Copyright 1990, 1999 Inprise Corporation. All rights reserved. Yaptığımız dosyayı projemize tanıtmak için aşağıdaki kodu kullanabiliriz: Programımıza resource dosyalarını tanıtmak için handle lardan faydalanabiliriz: Image1. Picture. Bitmap. Handle := LoadBitmap ; Icon. Handle := LoadIcon ; Screen. Cursors := LoadCursor ; Diğer kaynakları yonetmek bir miktar daha karmaşık. JPEG dosyalar ile başlayalım. Aşağıdaki function kaynak veriyi çağırmak için TResourceStream kullanıyor ve TJPEGImage nesnesine bağlanıyor. function GetResourceAsJpeg : TJPEGImage; var Stream: TResourceStream; begin Stream := TResourceStream. Create ; try Result := TJPEGImage. Create; Result. LoadFromStream ; finally Stream. Free; end; end; Fonksyonun kullanımına örnek aşağıdaki kodu örnek verebiliriz : var Jpg: TJPEGImage; begin // ... Jpg := GetResourceAsJpeg ; Image2. Picture. Bitmap. Assign ; Jpg. Free; // ... end; Exe İçerisine Dosya Gömmek (2) WAV uzantılı dosyalarını hafızadan çağırmak için pointer kullanmak gerekiyor. Text dosyaları için ise kaynağı string olarak çağırmamız gerekiyor. Bu işlemler için API ile TResourceStream kullanacağız. function GetResourceAsPointer : pointer; var InfoBlock: HRSRC; GlobalMemoryBlock: HGLOBAL; begin InfoBlock := FindResource ; if InfoBlock = 0 then raise Exception. Create(SysErrorMessage ; size := SizeofResource ; if size = 0 then raise Exception. Create(SysErrorMessage ; GlobalMemoryBlock := LoadResource ; if GlobalMemoryBlock = 0 then raise Exception. Create(SysErrorMessage ; Result := LockResource ; if Result = nil then raise Exception. Create(SysErrorMessage ; end; function GetResourceAsString : string; var ResData: PChar; ResSize: Longword; begin ResData := GetResourceAsPointer ; SetString ; end; Kullanımı da aşağıdaki gibi olur: var sample_wav: pointer; procedure TForm1. FormCreate ; var size: longword; begin... sample_wav := GetResourceAsPointer ; Memo1. Lines. Text := GetResourceAsString ; end; Exe İçerisine Dosya Gömmek (2) Wave dosyalarını kullanırken MMSystem uniti içerisinden API destekli sndPlaySound fonksyonunu kullanırız. Örneğin: procedure TForm1. Button1Click ; begin sndPlaySound ; end; Kimi kaynakları memoryden çağırarak kullanamayız. Bu kaynaklara font bilgilerini ve animated cursor örneklerini verebiliriz. Tercih edilen yöntem bu kaynakların geçici dosya olareak kaydedilip bu kaynaktan kullanılmasıdır. Aşağıda bu konu ile ilgili örnek bulunmakta: procedure SaveResourceAsFile ; begin with TResourceStream. Create do try SaveToFile ; finally Free; end; end; Temp dosya oluşturulması örneği: function SaveResourceAsTempFile : string; begin Result := CreateTempFile; SaveResourceAsFile ; end; Aşağıdaki örnek kodda oluşturulan animated cursor geçici dosyası kullanılıyor ve siliniyor. Kayıt için tani temp dosyası oluşturmak için SaveResourceAsTempFile kullanılıyor. Ve bu dosyayı kullanmak için de LoadImage fonksyonu kullanılıyor sonunda da dosya siliniyor. Ayrıca oluşacak hataların da kontrolü sağlanıyor. Bu işlemi de GetLastError ile yapıyoruz. function GetResourceAsAniCursor : HCursor; var CursorFile: string; begin CursorFile := SaveResourceAsTempFile ; Result := LoadImage(0, PChar , IMAGE_CURSOR, 0, 0, LR_DEFAULTSIZE or LR_LOADFROMFILE); DeleteFile ; if Result = 0 then raise Exception. Create(SysErrorMessage ; end; Örnek kullanım: Screen. Cursors := GetResourceAsAniCursor ; Form1. Cursor := 1; teşekkürler mete A R E

eline sağlık dostum ama istersen Result := LoadImage(0, PChar , IMAGE_CURSOR, 0, 0, LR_DEFAULTSIZE or LR_LOADFROMFILE); satırını bir daha kontrol et