Uygulamanın veya Dosyanın üzerindeki kilidi açmak...

Delphi'de kod yazma ile ilgili sorularınızı bu foruma yazabilirsiniz.
Cevapla
Kullanıcı avatarı
webaytek
Üye
Mesajlar: 377
Kayıt: 23 Haz 2004 10:58

Uygulamanın veya Dosyanın üzerindeki kilidi açmak...

Mesaj gönderen webaytek »

Yakın zamanda bu işi yaptığını öğrendiğim; bedava bir program olan Unlocker adlı programın kullandığı özellik lazım oldu...
Programın özelliği şu : windows'un veya diğer uygulamaların kullanmak üzere açıp da dışarıdan müdahele edilmesini istemedikleri için kilitledikleri dosyaların kilidini kaldırmak ve erişilebilir hale getirmek...

Benim isteğim şu... Uygulamam üzerinde açıp kullandığım ama henüz ".free" etmediğim için kilitli olan dosyaların kilidini isteğim zaman açmak istiyorum. bunun için bildiğiniz bi yöntem var mı... KOLAY GELSİN
Kullanıcı avatarı
mrmarman
Üye
Mesajlar: 4741
Kayıt: 09 Ara 2003 08:13
Konum: İstanbul
İletişim:

Mesaj gönderen mrmarman »

- Yanlış hatırlamıyorsam, bahsettiğim program çalışan kilitli tutan yani kullanan projeyi sonladırıp öyle kaldırıyordu. Senin istediğin ise başka bir şey. Yoksa kendi programının ipini çekersin olur biter.. :lol: :lol:

- Şaka bir yana, açtığın dosyalar hakkında bilgi verirsen daha kolay cevap verebiliriz.

- Yani projen ile dahili bir açma kullanma yapıyorsun yoksa, harici bir programı parametrelerle açıp bir dosyayı yönlendirip onu mu yönetiyorsun vs.

- Örneğin projende bir procedure içerisinde bir FileStream açmışsan onu herhangi bir procedure içinde kapatman gerekirse ya erişim için global ya da bazı fonksiyonlar ile bulunabilir olması lazım. Bir de projenin stabilitesini etkilememesi için her seferinde If Assigned(hjhk) gibi kontroller zinciri lazım.
Resim
Resim ....Resim
Kullanıcı avatarı
webaytek
Üye
Mesajlar: 377
Kayıt: 23 Haz 2004 10:58

Mesaj gönderen webaytek »

@mrmarman ilgine teşekkür ederim.
Önce düzeltme yapmam lazım ki... Kilit Açma işine yarayan bu program'ın 2.ci işlevi ; eğer program dosya üzerindeki kilidi kaldırılamaz ise sonlandırma yapmak üzerine...
Esas işlevi Windows veya diğer uygulamalarca Erişimine İzin verilmeyen dosyalara ait erişim kilidini kaldırması...
Olay şu ki...
Unlocker Öncesi MSDOS Komut Penceresi Görüntüsü...

Kod: Tümünü seç

C:\Documents and Settings\User\Local Settings\Temp>del *.*
C:\Documents and Settings\User\Local Settings\Temp\*.*, Emin misiniz (E/H)? e
C:\Documents and Settings\User\Local Settings\Temp\fb_1816.lck
Dosya başka bir işlem tarafından kullanıldığından bu işlem dosyaya erişemiyor.
C:\Documents and Settings\User\Local Settings\Temp\Perflib_Perfdata_1018.dat
Dosya başka bir işlem tarafından kullanıldığından bu işlem dosyaya erişemiyor.
C:\Documents and Settings\User\Local Settings\Temp\Perflib_Perfdata_718.dat
Dosya başka bir işlem tarafından kullanıldığından bu işlem dosyaya erişemiyor.
C:\Documents and Settings\User\Local Settings\Temp\~DF2B4D.tmp
Erişim engellendi.
C:\Documents and Settings\User\Local Settings\Temp\~DFA9B3.tmp
Erişim engellendi.
C:\Documents and Settings\User\Local Settings\Temp\~DFB6E1.tmp
Erişim engellendi.
C:\Documents and Settings\User\Local Settings\Temp\~DFDBDD.tmp
Erişim engellendi.
C:\Documents and Settings\User\Local Settings\Temp\~DFEA63.tmp
Erişim engellendi.
C:\Documents and Settings\User\Local Settings\Temp\~DFEA78.tmp
Erişim engellendi.
Unlocker Sonrası MSDOS penceresi görünümü :

Kod: Tümünü seç

C:\Documents and Settings\User\Local Settings\Temp>del *.*
C:\Documents and Settings\User\Local Settings\Temp\*.*, Emin misiniz (E/H)? e

Yani programın yaptığı şu : Dosyalara erişimi olan programla arasındaki bağlantıyı kopartıyor ve erişim izni otomatik olarak alınmış oluyor...

Benim programlarımda da mesela DB.MDB dosyasına sürekli bağlı olduğu halde yedek aldırmak isteğim üzerine doğal olarak sorunla karşılaşıyorum... ve bu sorunu aşabilmem için de programı sonlandırmaya veya tabloyu free etmeye pek niyetli diilim açıkçası... :-D YARDIMLARINIZ İÇİN ŞİMDİDEN TEŞEKKÜR EDERİM
Kullanıcı avatarı
mrmarman
Üye
Mesajlar: 4741
Kayıt: 09 Ara 2003 08:13
Konum: İstanbul
İletişim:

Mesaj gönderen mrmarman »

- Benim için yabacı bir konu ama Google amcadan senin için aradım ve bulduğum sonuçları paylaşayım.

- Ref : LockFile and LockFileEx Api Functions

- Buradaki kod ve örnek şunun üzerine... (test edilmemiş)

- İki adımda yapılan örnekteki işlemde, ilk adım olarak dosyanın ilk 1024 bytlık kısmı kilitliyormuş. Ondan sonraki adımda da akip eden ikinci 1024 bytelık kısmını. Sonra şöyle de eklemiş. Dilersen bir çırpıda 2048 byte kilitleyebilirsin ama durumu örnekli olarak açıklamak için böyle bir uygulama yapmış. Yani bir dosyanın dilediğin parçalarını kilitleme yeteneği varmış.

- Bir de LockFileEx varmış ki bu da benzeri bir işlemi a-senkron şekilde gerçekleştiriyormuş (asenkron kelime anlamını biliyoruz ama buradaki işlemde her ne demekse anlamadım).
@Marcel van Brakel yazdı:Here's an example that locks the first two 1024 byte sections of a file
(not tested). For demonstrational purpose the code performs the locking
in two steps, first it locks the first 1024 bytes and then it locks the
second 1024 bytes. Of course you could combine this into a single call
to lock the first 2048 bytes but it serves to demonstrate that you can
lock multiple regions independently.

Kod: Tümünü seç

const 
  Access = GENERIC_READ or GENERIC_WRITE; 
  Share = FILE_SHARE_READ of FILE_SHARE_WRITE; 
  Name = 'myfile.txt'; // must be > 1024 byte 
var 
  F: THandle; 
begin 
  // open a file with read/write access and allow other threads to 
  // read/write as well (why else use locking in the first place) 
  F := CreateFile(PChar(Name), Access, Share, nil, OPEN_EXISTING, 0, 0); 
  if F <> INVALID_HANDLE_VALUE then 
  try 
    // lock first 1024 bytes of the file (0,0) to (1024,0) 
    if LockFile(F, 0, 0, 1024, 0) then 
    try 
      if LockFile(F, 1024, 0, 1024, 0) then 
      try 
        .. use locked region (1024..2048) here .. 
        .. use locked region (0..1024) here .. 
      finally 
        UnlockFile(F, 1024, 0, 1024, 0);       
      end; 
      .. use the locked region (0..1024) here .. 
    finally 
      // unlock the same region 
      UnlockFile(F, 0, 0, 1024, 0); 
    end; 
  finally 
    CloseHandle(F); 
  end; 
end; 
LockFileEx is the asynchronous version of LockFile and it's usage is
similar. Just apply what you already know about asynchronous file IO an
combine it with the example above...
- Şimdi de veritabanı cephesindeki durumu ifade etmek için TeamB'den bir soru cevap ilişkisi...

- Ref : LockFile function?
@ Rick Rogers (TeamB) | Fenestra Technologies yazdı:> Any idea why locks are not described even at the DB
> record level in Delphi help?


Because LockFile is a low-level API file locking mechanism that you
would NEVER EVER use with databases, since locking is one of the
primary high-level functions of a database engine, with which
programmers should never interfere.

You can use all (or nearly all) of the routines described in the
Windows API help file, and none of these are described in the Delphi
help file. Delphi is very powerful, and gives you unfettered access to
the API, so to do lower-level things like this you will need to
familiarize yourself with both Delphi and the API.


- Yani kesinlikle ve kesinlikle veritabanı için kullanmayın diyor... Benden bu kadar. Araştırma başlangıç noktan olsun diye yazdım bunları.. Çalışmalarında başarılar...
Resim
Resim ....Resim
Kullanıcı avatarı
webaytek
Üye
Mesajlar: 377
Kayıt: 23 Haz 2004 10:58

Mesaj gönderen webaytek »

bu iyiliği bu devirde baba oğluna yapmaz valla. Apilerle yapılabileceği hiç aklıma gelmemişti aslında... Hele dosyanın parti parti kilitlenebileceği hiiiiçç aklıma gelmezdi... Bilgi yeterli. ben de cevabımı aldım ama sonuca ulaşmış değilim... Eğer çözüm bulabilirsem sizinle paylaşacağım. @mrmarman accaayip teşekkür ediyorum. BAŞARILAR DİLERİM
Cevapla