Exenin sonuna eklemek

Delphi'de kod yazma ile ilgili sorularınızı bu foruma yazabilirsiniz.
Cevapla
ikutluay
Üye
Mesajlar: 2341
Kayıt: 03 Tem 2007 10:13

Exenin sonuna eklemek

Mesaj gönderen ikutluay »

Merhaba

Resource ile exeye bilgi eklemek mümkün ama ben exenin sonuna sadece bir metin eklemek istiyorum. Burada çalışma sayısını tutacağım.

Dos zamanında yapan foksiyonum var torryde birde unite buldum ama bana gereken basit iş gören bir fonksiyon

Saygılar
Kişi odur ki, koyar dünyada bir eser. Eseri olmayanın yerinde yeller eser./Muhammed Hadimi
http://www.ibrahimkutluay.net
http://www.ibrahimkutluay.net/blog
Kullanıcı avatarı
White Rose
Üye
Mesajlar: 726
Kayıt: 06 Tem 2005 09:41
Konum: Güneyden
İletişim:

Re: Exenin sonuna eklemek

Mesaj gönderen White Rose »

ExeMod.pas dosyası vardı bu konuda forumda olması lazım
Kullanıcı avatarı
quadr
Üye
Mesajlar: 69
Kayıt: 21 Haz 2003 10:12
İletişim:

Re: Exenin sonuna eklemek

Mesaj gönderen quadr »

uniti kopyaya yazboz.pas olarak kaydet projene ekle.

yazmak için

Kod: Tümünü seç

var
  str: string;
  yz: TYazBoz;
begin
     yz := TYazBoz.Create(pchar('c:\a.exe'));
     str := 'ali-veli';
     yz.SetYazBoz(pchar(str)^, length(str));
okumak için

Kod: Tümünü seç

var
  dstr: string;
  yz: TYazBoz;
begin
  dstr := ParamStr(0);
  yz := TYazBoz.Create(dstr);
  SetLength(dstr, yz.YazBozSize);
  yz.GetYazBoz(PChar(dstr)^);
  showmessage(dstr); 
  


yazboz uniti.

Kod: Tümünü seç

unit YazBoz;

interface

type
  TYazBoz = class(TObject)
  private
    fFileName: string;     
    fOldFileMode: Integer; 
    fFile: File;           
    procedure Open(Mode: Integer);
    procedure Close;
  public
    constructor Create(const FileName: string);
    function HasYazBoz: Boolean;
    function YazBozSize: Integer;
    procedure SetYazBoz(const Data; const DataSize: Integer);
    procedure GetYazBoz(var Data);
    procedure RemoveYazBoz;
  end;

implementation

uses
  ActiveX;

type
  TYazBozFooter = packed record
    WaterMark: TGUID;
    ExeSize: LongInt;
    DataSize: LongInt;
  end;

const
  cWaterMarkGUID: TGUID =
    '{9FABA105-EDA8-45C3-89F4-369315A947EB}';
  cReadOnlyMode = 0;
  cReadWriteMode = 2;

procedure InitFooter(out Footer: TYazBozFooter);
begin
  FillChar(Footer, SizeOf(Footer), 0);
  Footer.WaterMark := cWaterMarkGUID;
end;

function ReadFooter(var F: File;
  out Footer: TYazBozFooter): Boolean;
var
  FileLen: Integer;
begin
  FileLen := FileSize(F);
  if FileLen > SizeOf(Footer) then
  begin
    Seek(F, FileLen - SizeOf(Footer));
    BlockRead(F, Footer, SizeOf(Footer));
  end
  else
    FillChar(Footer, SizeOf(Footer), 0);
    Result := IsEqualGUID(Footer.WaterMark, cWaterMarkGUID);
end;

procedure TYazBoz.Close;
begin
  CloseFile(fFile);
  FileMode := fOldFileMode;
end;

constructor TYazBoz.Create(const FileName: string);
begin
  inherited Create;
  fFileName := FileName;
end;

procedure TYazBoz.GetYazBoz(var Data);
var
  Footer: TYazBozFooter;
begin
  Open(cReadOnlyMode);
  try
   if ReadFooter(fFile, Footer)
      and (Footer.DataSize > 0) then
    begin
      Seek(fFile, Footer.ExeSize);
      BlockRead(fFile, Data, Footer.DataSize);
    end;
  finally
    Close;
  end;
end;

function TYazBoz.HasYazBoz: Boolean;
begin
  Result := YazBozSize > 0;
end;

procedure TYazBoz.Open(Mode: Integer);
begin
  fOldFileMode := FileMode;
  AssignFile(fFile, fFileName);
  FileMode := Mode;
  Reset(fFile, 1);
end;

function TYazBoz.YazBozSize: Integer;
var
  Footer: TYazBozFooter;
begin
  Result := 0;
  Open(cReadOnlyMode);
  try
    if ReadFooter(fFile, Footer) then
      Result := Footer.DataSize;
  finally
    Close;
  end;
end;

procedure TYazBoz.RemoveYazBoz;
var
  PLSize: Integer;
  FileLen: Integer;
begin
  PLSize := YazBozSize;
  if PLSize > 0 then
  begin
    Open(cReadWriteMode);
    FileLen := FileSize(fFile);
    try
      Seek(fFile, FileLen - PLSize - SizeOf(TYazBozFooter));
      Truncate(fFile);
    finally
      Close;
    end;
  end;
end;

procedure TYazBoz.SetYazBoz(const Data;
  const DataSize: Integer);
var
  Footer: TYazBozFooter;
begin
  RemoveYazBoz;
  if DataSize > 0 then
  begin
    Open(cReadWriteMode);
    try
      InitFooter(Footer);
      Footer.ExeSize := FileSize(fFile);
      Footer.DataSize := DataSize;
      Seek(fFile, Footer.ExeSize);
      BlockWrite(fFile, Data, DataSize);
      BlockWrite(fFile, Footer, SizeOf(Footer));
    finally
      Close;
    end;
  end;
end;

end.
Kolay gelsin.

Ayakkabıyı sefaletten
Çok sonraları tanıdım
Öyle ufuklarda mı olurmuş Allah'ım
Giyer giyer koşardım
Toprağın dostluğundan
Oyuncaklar yaptım çamurdan
Tenimin rengini aldım topraktan
Sen bakma esmerliğim sonradan...

http://www.tcct.us
ikutluay
Üye
Mesajlar: 2341
Kayıt: 03 Tem 2007 10:13

Re: Exenin sonuna eklemek

Mesaj gönderen ikutluay »

io error 32 veriyor ...
Kişi odur ki, koyar dünyada bir eser. Eseri olmayanın yerinde yeller eser./Muhammed Hadimi
http://www.ibrahimkutluay.net
http://www.ibrahimkutluay.net/blog
Kullanıcı avatarı
quadr
Üye
Mesajlar: 69
Kayıt: 21 Haz 2003 10:12
İletişim:

Re: Exenin sonuna eklemek

Mesaj gönderen quadr »

veriyi çalışan dosya üzerine yazdırmaya çalışmayın.iki ayrı dosyanız olmalı.

Ayakkabıyı sefaletten
Çok sonraları tanıdım
Öyle ufuklarda mı olurmuş Allah'ım
Giyer giyer koşardım
Toprağın dostluğundan
Oyuncaklar yaptım çamurdan
Tenimin rengini aldım topraktan
Sen bakma esmerliğim sonradan...

http://www.tcct.us
emin_as
Üye
Mesajlar: 559
Kayıt: 01 Eki 2008 10:05
Konum: izmir
İletişim:

Re: Exenin sonuna eklemek

Mesaj gönderen emin_as »

Windows çalıştırılan exe lerin değiştirilmesine izin vermez. Çalışmakta olan exeleri değiştirmeye karşı kilitler.
ikutluay
Üye
Mesajlar: 2341
Kayıt: 03 Tem 2007 10:13

Re: Exenin sonuna eklemek

Mesaj gönderen ikutluay »

benim yapmam gereken bu ama. sağlık olsun. başka bir yol bulacağız.
Kişi odur ki, koyar dünyada bir eser. Eseri olmayanın yerinde yeller eser./Muhammed Hadimi
http://www.ibrahimkutluay.net
http://www.ibrahimkutluay.net/blog
Kullanıcı avatarı
Murat DİCLE
Kıdemli Üye
Mesajlar: 702
Kayıt: 19 Nis 2006 04:12
Konum: İstanbul
İletişim:

NTFS Alternate Data Streams (ADS)

Mesaj gönderen Murat DİCLE »

Selamlar,

Aşağıdaki kodlar sanırım tam istediğin kodlar. EXE çalışırken yazılıyor. Aslına bakarsanız EXE'nin arkasına eklemiyor. Windows bunun için ayrı bir dosya sistemi kullanıyor. Windows'un NTFS Alternate Data Streams (ADS) 'dir. Detaylı bilgi için tıklayınız.

** Ancak hiç deneme ihtiyacı duymadım, EXE yi bir başka PC ye kopyalayınca bilgilerde kopyalanıyor mu hiç bilmiyorum.

Windows XP, Vista ve Win7 de bunlar çalışır. Windows bir programı çalıştırmadan önce Zone.Identifier 'e bakar. Eğer Zone=3 ise bu dosya internetten gelmiştir. Zaten bu dosyayı çift tıklarsanız, Windows bu programın internetten geldiğini belirten bir onay penceresi çıkartacaktır.

Bir örnek:

Kod: Tümünü seç

C:\>more < inettengelen.exe:Zone.Identifier
yazdığımızda, ADS oluşturulmamışsa File not found mesajını alırız. Eğer Zone.Identifier varsa bize bilgileri gösterir:

Kod: Tümünü seç

[ZoneTransfer]
ZoneId=3
gibi bir şey karşımıza çıkar. Bilgi olsun diye diğer ZoneId 'lerin anlamlarını da veriyorum.

Kod: Tümünü seç

Zone= -1  //NoZone
Zone= 0 //MyComputer
Zone= 1 //Intranet
Zone= 2 //Trusted
Zone= 3 //Internet
Zone= 4 //Untrusted
Ben örneğimde IniFile ile bilgilere ulaşıp yazdım. Ama dilerseniz AssignFile, Reset, Rewrite vb. komutlarla da ulaşabilirsiniz. İhtiyacınız olduğunu düşündüğüm kodlar aşağıdadır. Umarım faydalı olur.

Kod: Tümünü seç

Uses Windows, Forms, SysUtils, IniFiles;
.
.
.
procedure TForm1.FormCreate(Sender: TObject);
var
   ini : TIniFile;
   fn  : string;
   d   : TDate;
   i   : Integer;
begin
   fn := Application.ExeName + ':gizlibilgiler';

   ini := TIniFile.Create(fn);

   if not ini.SectionExists('lisans') then
      begin
         // ilk defa kuruluyor ve gizli bilgileri oluşturuyoruz.
         ini.WriteDate('lisans', 'ilkkurulum', Now);
         ini.WriteDate('lisans', 'sonkullanimtarihi', Now + 15); // 15 gün
         ini.WriteInteger('lisans', 'calistirmasayisi', 1);
         ini.WriteString('lisans', 'lisanssahibi', 'murat dicle');
      end
   else
      begin
         d := ini.ReadDate('lisans', 'sonkullanimtarihi', StrToDate('01.01.2000'));
         if (Now - d) > 15 then Halt(0); // Son kullanım tarihini geçmiş.
         i := ini.ReadInteger('lisans', 'calistirmasayisi', 1);
         i := i + 1;
         ini.WriteInteger('lisans', 'calistirmasayisi', i);
      end;

   FreeAndNil(ini);
end;
Şimdi de kontrol edelim

Kod: Tümünü seç

C:\projeler>more < form1.exe:gizlibilgiler
ya da

Kod: Tümünü seç

C:\projeler>notepad form1.exe:gizlibilgiler
Sonuç:

Kod: Tümünü seç

[lisans]
ilkkurulum=03.11.2011
sonkullanimtarihi=18.11.2011
calistirmasayisi=2
lisanssahibi=murat dicle
Cevapla