Netbios (Windows Ağı) paylaşımlarını listelemek

Örnek programın ekran görüntüsü Dört yıl kadar önce üzerinde bazı değişiklikler yaptığım ağ paylaşımlarını listeleyen bir kod. Tüm işletim sistemlerinde düzgünce çalışıyor. Bunu özellikle söyledim çünkü bu kod 98 den XP ye geçişte oldukça zamanımı aldı, o zamanlarda delphi ile daha yeni çalışmaya başlamıştım. 98 den XP ye geçişte kodda bazı değişiklikller yapmak gerekti.

Örnek programın ekran görüntüsü Dört yıl kadar önce üzerinde bazı değişiklikler yaptığım ağ paylaşımlarını listeleyen bir kod. Tüm işletim sistemlerinde düzgünce çalışıyor. Bunu özellikle söyledim çünkü bu kod 98 den XP ye geçişte oldukça zamanımı aldı, o zamanlarda delphi ile daha yeni çalışmaya başlamıştım. 98 den XP ye geçişte kodda bazı değişiklikller yapmak gerekti.

Continue reading “Netbios (Windows Ağı) paylaşımlarını listelemek”

Delphi’de Mutex Kontrolü (En doğru yöntem)

MutexMutex multithread programlarda çokça kullanılan bir mekanizma ve ayrıca hafıza nesnesinin adıdır. Mutex nesnesi tüm işletim sistemi genelinde geçerlidir ve bu Mutex’i oluşturan program (thread) sonlandığında, otomatik olarak hafızadan silinir.

Mutex’ler genellikle aynı dosyaya birden fazla thread’in (iş parçacığı) aynı anda yazmaya kalkmaması veya programınızın birden fazla kopyasının çalışmamasını kontrol etmek gibi işler için kullanılır. Program herhangi bir adla bir mutex oluşturur ve daha sonra aynı ad ile oluşturulmuş bir başka mutex olup olmadığına bakarak. Eğer aynı mutex’den varsa programın bir kopyası zaten  çalışıyor demektir.

Aşağıda oluşturulan mutex’i kontrol etmek için kullanabileceğiniz Delpi kodu yer alıyor. (Mutex oluşturma için buraya bakın)


function IsMutexExists(MutexName: String): Boolean;
 var
 vMutex: THandle;
 begin
 Result := True;
 vMutex := OpenMutex(0, True, PAnsiChar(MutexName));
 if GetLastError = ERROR_FILE_NOT_FOUND then
 Result := False;
 CloseHandle(vMutex);
 end;

Kullanımı:


if IsMutexExists('havuclu_kek') then
 begin
 ShowMessage('Program zaten çalışıyor');
 Halt;
 end;

IE (Internet Explorer)’ın Giriş Sayfası Kilidini Açmak

Bilgisayarınıza bulaşan Malware tabir edilen ve bilgisayarınızı tabiri caizse bir “mal”a çeviren zararlılar, IE (Internet Explorer)’ın giriş sayfasına kendi adresini yazar ve burayı kilitler. Böylece tarayıcıyı her açtığınızda sörfe malware’in sitesi ile başlarsınız. IE’ın giriş sayfası kilidini kaldırmak için aşağıdaki aracı kullanabilirsiniz. Ayrıca kaynak kodlarını da indirebilirsiniz.

Continue reading “IE (Internet Explorer)’ın Giriş Sayfası Kilidini Açmak”

Delphi: Canvas does not allow drawing Hatası

Canvas does not allow drawing” hatası tuval çizime izin vermiyor gibi bir anlam taşıyor. Tuval ressamların resimlerini çizdikleri yüzeye verilen ad burada ise programdaki bileşenlerin görsel kısımlarına (arabirim) karşılık geliyor.

Canvas hatası iki nedenden kaynaklanabilir. Ya çizim yapacak kaynağınız kalmamıştır ya da multithread bir programda tuvali boyamaya çalışan iki fırça birbiriyle çakışıyordur. Dediğimiz gibi bu Canvas hatası ençok multithread programlarda karşımıza çıkıyor. VCL bileşenleri thread-safe değillerdir. Bu yüzden bileşenlerin görsel özellikleriyle işlem yaparken Synchronize fonksiyonunu kullanmalısınız. Synchronize’a parametre olarak verdiğiniz alt program thread-safe olarak çalıştırılır. Yani canvas sorunu çıkartacak görsel işlemleri güvenli bir zamanda icra ettirmiş olursunuz. Aşağıdaki thread örneğini inceleyebilirsiniz.
Continue reading “Delphi: Canvas does not allow drawing Hatası”

Edit’in içeriğini OnChange Olayında Değiştirmek

Başlık ilk okunduğunda anlaşılabilecek türden olmadı biliyorum. Metin kutusunun içeriği değiştiğinde içeriğine müdahale etmek pek mümkün değildir (Yani OnChange yordamında  içeriği değiştirecek işlemler yapmak). OnChange olayında içeriği değiştirirseniz, oluşan değişiklikten dolayı OnChange tekrar çalıştırılır ve bu böyle sonsuza kadar devam eder. Aslında yığın (stack) dolana kadar devam eder. Yığın neden dolar derseniz, bir nevi recursive (özyineli) bir süreç başlatırsınız, yani her alt süreçten geri dönebilmek için, sürecin geri dönüş noktası (yordamın enson çağırıldığı konuma karşılık gelen bellek adresi) yığına kaydedilir ve LIFO (Last in First out) düzeniyle geri boşaltılır.

Bu tarz birşeye ihtiyaç duyduğumuzda OnChange olayı boşaltılırsa yukarıdaki gibi bir zincirleme reaksiyon başlamayacaktır. İşimiz bittiğinde de OnChange olayını eski haline geri çevirmeyi unutmamalıyız. Olayın içini boşaltmak için nil değerini kullanıyoruz. Aşağıda bir örnek yer alıyor.

procedure TForm1.Edit1Change(sender:Tobject);
begin
	// OnChange olayinin ici bosaltiliyor
	Edit1.OnChange := NIL;

	// Edit1'in icerigini degistiren kodlar burada

	// OnChange olayi yeniden yukleniyor
	Edit1.OnChange := Edit1Change;
end;

Delphi’de Scroolbar’ı Kod ile Kontrol Etmek

Delphi’nin bir scrollbar’a (kaydırma çubuğu) sahip TMemo, TListBox, TStringGrid ve TListView gibi birçok nesnesi bulunmakta. Nesnenin içindeki elemanlar nesnenin yüksekliğine sığmadığında otomatik olarak dikey bir  scroollbar oluşturulur. Bu bar ile liste içerisinde hareket edebilirsiniz. Bazen listede istediğiniz bir elemanı göstermek için kaydırma çubuğunu kontrol etmeniz gerekebilir. Aşağıdaki örneklerdeki gibi SendMessage ile nesneye mesaj göndererek listenin istediğiniz konuma kaymasını sağlayabilirsiniz.
Continue reading “Delphi’de Scroolbar’ı Kod ile Kontrol Etmek”

Delphi 7 Yardımı Windows 7’de de çalışsın

Windows 7 üzerine Delphi 7 kurduysanız F1 tuşu ile çağrılan yardım dosyasının görüntülenmediğini farkedeceksiniz. Sorun windows 7 ile beraber gelen yardım görüntüleyici programının artık eski yardım dosyası formatlarını (.hlp) desteklemiyor olması. Windows 3.1 den XP ye kadar kullanılan winhlp32.exe adındaki görüntüleyici ihtiyaçları karşılmadığı için Windows 7’ye dahil edilmemiş. Ancak microsoft’un sitesinden indirilebiliyor. Sorunu çözmek için aşağıdaki dosyayı indirerek kurabilirsiniz. İndireceğiniz .cab paketi içindeki install.cmd betiği, winhlp32.exe‘yi sisteminize kuracaktır. Dilerseniz winhlp32 programını microsoft‘dan da temin edebilirsiniz. (WGA gerektiriyor)

[Yükleme bulunamadı.]

TStringGrid Hücrelerinin Seçimini Kaldırmak

TStringGrid nesnesi varsayılan olarak seçili hücrelerini mavi renkle ışıklandırıyor bunu istemiyorsanız aşağıdaki kodu kullanabilirsiniz.

procedure TForm1.FormCreate(Sender: TObject);
var
    grRect: TGridRect;
begin
    grRect.Left := -1;
    grRect.Top := -1;
    grRect.Right := -1;
    grRect.Bottom := -1;
    StringGrid1.Selection := grRect;
end;

ForceDirectories ile Dizin Ağacı Oluşturmak

Delphi‘de dizin oluşturmak için kullanılan komut CreateDir‘dir. CreateDir belirttiğiniz bir dizinde yeni bir dizin oluşturmak için kullanılır. Eğer amacınız iç içe birden fazla dizin oluşturmak ise (patika oluşturmak) bunu CreateDir’i birden fazla kullanarak yapabilirsiniz ama size tavsiyem bunun yerine ForceDirectories komutunu kullanmanız. Örneğin; D:\ sürücüsünde “Dökümanlar\Dersler\Matematik” gibi iç içe bir dizin yapısı oluşturmak istiyorsanız ForceDirectories komutunu aşağıdaki gibi kullanarak bu işi kolayca gerçekleştirebilirsiniz.

ForceDirectories('D:\Dökümanlar\Dersler\Matematik'); 


How to Gets Thread Count in a Process

Herhangi bir prosesin (işlem) bünyesinde bulunan thread (kanal) sayısını almak için aşağıdaki alt programı kullanabilirsiniz. GetCurrentProcessId çalışmakta olan programın prosess kimlik numarasını getirir. TlHelp32 ünitesini dahil etmeyi unutmayın.

implementation
uses TlHelp32;

function ThreadCount(iProcessID: DWord): integer;
var
  SnapHandle: THandle;
  ProcEntry: TProcessEntry32;
begin
  Result := 0;
  SnapHandle := CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
  if SnapHandle = 0 then Exit;
  FillChar(ProcEntry, SizeOf(TProcessEntry32), 0);
  ProcEntry.dwSize := SizeOf(TProcessEntry32);
  if Process32First(SnapHandle, ProcEntry) then
  begin
    if ProcEntry.th32ProcessID = iProcessID then
    begin
      Result := ProcEntry.cntThreads;
      Exit;
    end;
    while Process32Next(SnapHandle, ProcEntry) = true do
    begin
      if ProcEntry.th32ProcessID = iProcessID then
      begin
        Result := ProcEntry.cntThreads;
        Break;
      end;
    end;
  end;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
  Caption := inttostr( ThreadCount( GetCurrentProcessId ));
end;

Delphi’den Win32.Induc.A zararlısını temizliyoruz

Daha önce burada delphi‘ye bulaşan Induc isimli virüsten bahsetmiştik. Virüs, eğer Delphi IDE‘si yüklü ise kendini delphi’nin lib dizinindeki sysconst.dcu dosyasına ekliyor. Bu dosya tüm delphi projelerine otomatik olarak dahil edildiği için geliştirdiğiniz tüm uygulamaların exe dosyaların enfekte olmuş oluyor.

Delphi IDE’sine bulaşan bu zararlıdan kurtulmak için aşağıdaki adımları uygulayabilirsiniz:

1) C:\Program Files (x86)\Borland\Delphi7\Source\Rtl\Sys\SysConst.pas dosyasını C:\Program Files (x86)\Borland\Delphi7\Lib dizine kopyalayın.

2) C:\Program Files (x86)\Borland\Delphi7\Lib\SysConst.dcu dosyasını silin.

3) Win32Induc bulaşan uygulamanızın exe’sini silin ve yeniden derleyin.

Dikkat: bu işlemlerden sonra yeni derlenen uygulamalarda Induc yer almayacak fakat Induc’ın bulaştığı bir uygulamayı çalıştırdığınızda Delphi IDE’niz yeniden enfekte olacak. Bu yüzden Delphi çalışmalarınızı bir antivirüs yazılımı ile taratarak temizletmeniz gerekiyor.

Basit bir önlem alalım

Ne olur ne olmaz diyerek SysConst.dcu dosyanızı değişikliklere karşı korumaya almak isteyebilirsiniz, bunun için aşağıdaki adımları uygulayın.

1) C:\Program Files (x86)\Borland\Delphi7\Lib\SysConst.dcu sağ tıklayıp özellikler seçeneğine tıklayın.

2) Özellikler penceresinden salt okunur (readonly) öznetiliğini işaretleyin ve uygulayın.

Bir önlem daha alalım (gözümüz çıkmaz umarım)

Dosyayı Saltokunur yaptık ama virüs yine de bu izni kaldırıp üzerine  yazabilir diyorsanız çok sağlıklı düşünüyorsunuz demektir.  Windows kullanıcı hesabınızın bu dosya üzerindeki öznitelikleri değiştirme yetkisini de kaldırabilirsiniz. Bunun için aşağıdaki adımları uygulayın.

1) C:\Program Files (x86)\Borland\Delphi7\Lib\SysConst.dcu sağ tıklayıp özellikler seçeneğine tıklayın.

2) Güvenlik sekmesine gelin, Administrators (hesabınızın üye olduğu gurup)’ı seçip Gelişmiş düğmesine tıklayın.

3) Açılan Gelişmiş Güvenlik Ayarları penceresinden, Administrators‘i seçip İzinleri Değiştir düğmesine tıklayın.

4) Açılan yeni pencereden, Administrators‘i seçip Düzenle düğmesine tıklayın.

5) Açılan İzin Girdisi penceresindeki izinler listesinden, Öznitelikleri yaz isimli izine ait İzin Verme onay kutusunu işaretleyin.

6) Açık olan tüm pencerelerin Tamam düğmelerine tıklayarak kapatın.


Bu son adımda yaptığımız ayarlara ait ekran görüntüsü aşağıdaki gibi bir şey:

SysConst.dcu dosyasının izinlerini ayarlamak

e-Okul PHP Script’i ve Delphi Programı

Daha önce PHP’de yazdığım yarım kalmış bir e-okul projesinden bahsetmiş ve kodlarını paylaşmıştım. Paylaşımın delphi ayağına ait programı henuz bulabildim. Onuda buradan paylaşacağım. Program kısca; Bilsa Karma programının mdb biçimindeki veritabanlarından not ve devamsızlık bilgilerini alarak script’in kullanabileceği MySQL veribanına aktarıyor. Program temel görevleri yerine getiriyor fakat üzerinden bir hayli zaman geçtiği için eksiklikleri/hataları nelerdi konusunu hatırlayamıyorum.

[Yükleme bulunamadı.]

Programı derleyip çalıştırmayı deneyecekler için;

  1. Ana form üzerinde Ayarlar düğmesinden script’in bulunduğu URL’yi yazın
  2. Kullanıcı adı olarak script’in config.php dosyasındaki DBUpdateUsername ve DBUpdatePassword değerlerini kullanın.
  3. Data dizinine okul veritabanlarının saklandığı “1”,”2″.. ismindeki klasörler ile OGRSIFRE.MDB ve STARTUP.MDB isimli veritabanlarını kopyalayın veya Gözat düğmesi ile Karma’nın yüklü olduğu ana dizini gösterin.

Continue reading “e-Okul PHP Script’i ve Delphi Programı”

W32/Induc virüsü Delphi’ye bulaşıyor

Delphi’nin Syscons.dcu veya sysconst.pas dosyasına bulaşan bir virüs peydah oldu.

Kaspersky’da adlandırması Win32.Induc.a olarak geçiyor, kendisini sysconst.pas’a include etmek sureti ile bulaşıyor.

Böylelikle her derlemede exe içerisinde virüscük de yaşamaya devam ediyor.

Bu durumda önce virüs temizliği sonra mutlaka delphi’ı kaldırıp tekrar kurmak lazım (ben öyle yaptım).

Evet ne yazıkki sisteminizde hiç virüs olmasa da kullandığınız ücretsiz full open source komponentler de ne yazıkki virüse neden olabiliyor.

Her yüklediğimiz yeni komponeneti bir de kod kontrolünden geçirmek lazım sanırım.

Virüslü olup olmadığınız anlamak için sysconst.pas içinde aşağıdaki kodlar var mı yok mu bakmak gerekiyor. Tabi bu sadece bu türün bir türevi ise dışarıdan aldığımız her komponenti incelemek de şart.

Delphi 4-7 geliştirme ortamına bulaşan virüs varyantının kodları aşağıdaki gibi.

Continue reading “W32/Induc virüsü Delphi’ye bulaşıyor”

Delphi: "Invalid argument to date encode" hatasını gidermek

TIdHttp içinde aniden peydahlanan bu sorun kodun ele aldığı tarih bilgisinin, daha doğrusu tarih formatının önceden varsayıldığı gibi olmamasından kaynaklanıyor. Aslında bu sorunun çözümü için google‘da birkaç farklı yol bulunsa da kod yamalamayı gerektirdiği için bunları tavsiye edemiyorum.

Belirsiz bir nedenden dolayı süpriz olarak ortaya çıkan bu sorunu kütüphaneleri yamalayarak çözmek pek mantıklı değil. Delphi’nin kütüphaneleri eğer güncel bir versiyonunu kullanıyorsanız muhtemelen böcek/kod satırı oranı iyi bir düzeydedir ve sizin yapacağınız müdahalelerin bu oranı artırma potansiyeli yüksek.

Çözüm olarak bilgisayarınızı yeniden başlatıp hatayı tekrar kontrol edin. Sorun muhtemelen yüklediğiniz bir programın windows’un kararlılığını bozduğu geçici bir durumdur.

Başka bir çözüm de Windows’un denetim masasındaki Bölge ve Dil Seçenekleri simgesinden geçerli tarih formatı ayarlarınızın normal olup olmadığına bakın.

Related Blogs

Delphi ile web sayfasının ekran görüntüsünü almak

About.com birçok konuda olduğu gibi Delphi‘de yazılım geliştirme konularıyla ilgili yazılar yayınlıyor. Makaleler ve çeşitli kod örneklerinden oluşan yazılar ele aldığı konuların kullanışlılığı ve anlatımındaki yalınlık ile akılda kalıyor. Aşağıda, benim de zamanında çok aradığım ve bazılarının işine yarayabilecek, web sitelerinin ekran görüntüsünü çekmek için bir kod yer alıyor. Kod TWebBrowser nesnesi ile taranan sayfaların ekran görüntüsünü kaydetmek için kullanılıyor.

About.com birçok konuda olduğu gibi Delphi‘de yazılım geliştirme konularıyla ilgili yazılar yayınlıyor. Makaleler ve çeşitli kod örneklerinden oluşan yazılar ele aldığı konuların kullanışlılığı ve anlatımındaki yalınlık ile akılda kalıyor. Aşağıda, benim de zamanında çok aradığım ve bazılarının işine yarayabilecek, web sitelerinin ekran görüntüsünü çekmek için bir kod yer alıyor. Kod TWebBrowser nesnesi ile taranan sayfaların ekran görüntüsünü kaydetmek için kullanılıyor.
Continue reading “Delphi ile web sayfasının ekran görüntüsünü almak”

Delphi’de access violation hatalarını gidermek

Access violation hatası belleğin işlem yapılan konumunun okunamamasından veya yazılamamasından kaynaklanır. Hata mesajında hataya neden olan kodun segment ve ofset adresleri bildirildiğinden programcının hatanın yerini tespit etmesi zordur. Benzer sorunlar sıfıra bölme (zero division) ve yığın taşması (stack overflow) gerçekleştiğinde de olur.

Delphi programlarında bu tür sorunlara neden olan kod satırlarını tespit münkündür. Bunun için Project->Options…->Linker ekranındaki Map file ayarı Detailed olarak ayarlanır. Bundan sonra her derleme işleminde uzantısı map olan bir bellek harita dosyası oluşturur.

Bu dosyada program  kod satırlarınıa karşılık gelen makina kodlarının ofset adresleri yer alır. Böylece hatanın oluştuğu bellek adresinin hangi kod satırına karşılık geldiği bulunabilir.

Hatalı kod satırını daha düzgün ve ayrıntılı olarak raporlayabilmek için uLkStackTrace class’ını kullanabiliriz. uLkStackTrace Mozilla lisansıyla dağıtılan bir SourceForge.net projesi.

uLkStackTrace sınıfınınkullanıldığı örnek proje dosyasını aşağıdaki bağlantı ile indirebilirsiniz:

UnhandledExceptions_DelphiSourceCode.rar (~241KB)<

Örnek projede de görüleceği üzere, sınıfın kullanılmasından kısaca bahsetmek  gerekirse;

  • Uses bloğuna uLkStackTrace unit ismini ekleyin.
  • İstisnaları ekrana veya bir dosyaya rapor edecek bir prosedür hazırlayın.
  • LkExceptionReporter yordamına bu prosedürü atayın.
  • Rapor prosedürünü Form.Create‘in başına yazmayı unutmayın.

Access violation hatası belleğin işlem yapılan konumunun okunamamasından veya yazılamamasından kaynaklanır. Hata mesajında hataya neden olan kodun segment ve ofset adresleri bildirildiğinden programcının hatanın yerini tespit etmesi zordur. Benzer sorunlar sıfıra bölme (zero division) ve yığın taşması (stack overflow) gerçekleştiğinde de olur.

Delphi programlarında bu tür sorunlara neden olan kod satırlarını tespit münkündür. Bunun için Project->Options…->Linker ekranındaki Map file ayarı Detailed olarak ayarlanır. Bundan sonra her derleme işleminde uzantısı map olan bir bellek harita dosyası oluşturur.

Bu dosyada program  kod satırlarınıa karşılık gelen makina kodlarının ofset adresleri yer alır. Böylece hatanın oluştuğu bellek adresinin hangi kod satırına karşılık geldiği bulunabilir.

Hatalı kod satırını daha düzgün ve ayrıntılı olarak raporlayabilmek için uLkStackTrace class’ını kullanabiliriz. uLkStackTrace Mozilla lisansıyla dağıtılan bir SourceForge.net projesi.

uLkStackTrace sınıfınınkullanıldığı örnek proje dosyasını aşağıdaki bağlantı ile indirebilirsiniz:

UnhandledExceptions_DelphiSourceCode.rar (~241KB)<

Örnek projede de görüleceği üzere, sınıfın kullanılmasından kısaca bahsetmek  gerekirse;

  • Uses bloğuna uLkStackTrace unit ismini ekleyin.
  • İstisnaları ekrana veya bir dosyaya rapor edecek bir prosedür hazırlayın.
  • LkExceptionReporter yordamına bu prosedürü atayın.
  • Rapor prosedürünü Form.Create‘in başına yazmayı unutmayın.

Continue reading “Delphi’de access violation hatalarını gidermek”

İyi yazılım 10 yıl alır, buna alışın.

Şu tabloya bir göz atın:

İyi yazılım On Yıl Alır, Buna Alışın

Bu tablo, Lotus Notes workgroup yazılımının piyasaya ilk çıkarıldığı tarih olan 1989’dan 2000 yılına kadar kaç yerde kurulu olduğunu göstermektedir. Aslında Notes 1.0 sürümü çıkarıldığında beş yıldan beri geliştirilmekte idi. Notes’un yeterli kaliteye erişmesi ve kullanıcıların satın almaya başlaması için geçen sürenin uzunluğuna dikkatinizi çekmek isterim. Gerçekten de 1984 yılında ilk kod satırının yazılmaya başlaması ile yukarıdaki eğrinin yükselen kısmına erişmesi için tam 11 yıl geçmesi gerekmiştir. Bu süre boyunca Ray Ozzie ve kadrosu St Barts’da buzlu viski içmiyorlardı. Nefes almaksızın kod yazıyorlardı.

Şu tabloya bir göz atın:

İyi yazılım On Yıl Alır, Buna Alışın

Bu tablo, Lotus Notes workgroup yazılımının piyasaya ilk çıkarıldığı tarih olan 1989’dan 2000 yılına kadar kaç yerde kurulu olduğunu göstermektedir. Aslında Notes 1.0 sürümü çıkarıldığında beş yıldan beri geliştirilmekte idi. Notes’un yeterli kaliteye erişmesi ve kullanıcıların satın almaya başlaması için geçen sürenin uzunluğuna dikkatinizi çekmek isterim. Gerçekten de 1984 yılında ilk kod satırının yazılmaya başlaması ile yukarıdaki eğrinin yükselen kısmına erişmesi için tam 11 yıl geçmesi gerekmiştir. Bu süre boyunca Ray Ozzie ve kadrosu St Barts’da buzlu viski içmiyorlardı. Nefes almaksızın kod yazıyorlardı.
Continue reading “İyi yazılım 10 yıl alır, buna alışın.”