path bulma

Delphi'de kod yazma ile ilgili sorularınızı bu foruma yazabilirsiniz.
Kullanıcı avatarı
NewMember
Üye
Mesajlar: 990
Kayıt: 29 Haz 2005 06:57
Konum: Bursa

Mesaj gönderen NewMember »

Farklı başlık açmaktansa buraya yazmayıı uygun gördüm.

Admin demişki:
ExctractFilePath(Application.ExeName);

CurrentDir - bazı durumlarda değişebiliyor, bence pek sağlıklı bir yol değil. Ama Application.ExeName her zaman tam yolu ve tam ismi verir.
Bende böyle biliyorum ancak.Bir projemde bu yol değişiyordu.Şöyleki Free Report kullanıyordum ve kullanıcıyada edit imkanı veriyordum.Kullanıcı hem raporlarda düzenleme yapabiliyor hemde bu düzenlediklerini kaydedip sonra gerek benim programıdaki bir buton vasıtasıyla direk olarak gerekse de direk free report idesinden File Open diyerek açıyordu.Ancak diyelimki kullanıcı masaüstü yada başka (programın dizininden farklı) bir dizinde free report dosyasını açarsa daha sonra başka bir forma giderse ki bu form bir database bağlantısı içierirse(Database olarak access kullanıyordum o zaman ve bağlantılarıda formun create yordamında ExtractFilePath(Application.ExeName) fonksiyonu yardımı ile yapıyordum ve Database exe ile aynı klasör içinde duruyordu) program databasei bulamıyordu.Bunuda şöyle bir hata mesajı ile veriyordu.Free report için en son hangi dizini açtıysam işte o dizinde XXXXXX.mdb dosyası bulunamadı diye hata veriyordu.Bir hafta 10 gün kadar bununla uğraştım.En sonunda free reprottan Rave reporta döndüm ve kullanıcıya edit imkanuı vermek fikrinden fedakarlık ettim.Acaba başına böyle bir şey gelen varmı?Yada bu onudaki fikriniz nedir.Ama şu kesin yani database yollarında falan bir hatra yok.Zaten naparsanız yapın free report la dizini değiştirmedikten sonra sorun çıkmıyordu.Acaba sorun free reportta mı yani çok enteresan bir durum.
Kullanıcı avatarı
webaytek
Üye
Mesajlar: 377
Kayıt: 23 Haz 2004 10:58

Mesaj gönderen webaytek »

Sadece beceremediğim için saat 06:30 dan beri rüyamda çözmeye uğraşıyorum. Lütfen yardım ederseniz Çoookkk sevineceğim.
KillTask('exeadi.exe') ile programı terminate eden bi kod kullanıyorum
Kullanmam da şart.
Uses kısmına TLhelp32 ile beraber

Kod: Tümünü seç

Function KillTask(ExeFileName: string): integer;
const
  PROCESS_TERMINATE=$0001;

var
  ContinueLoop: BOOL;
  FSnapshotHandle: THandle;
  FProcessEntry32: TProcessEntry32;
begin
result := 0;
FSnapshotHandle := CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
FProcessEntry32.dwSize := Sizeof(FProcessEntry32);
ContinueLoop := Process32First(FSnapshotHandle,FProcessEntry32);
while integer(ContinueLoop) <> 0 do
begin
    if ((UpperCase(ExtractFileName(FProcessEntry32.szExeFile)) =
         UpperCase(ExeFileName))
     or (UpperCase(FProcessEntry32.szExeFile) =
         UpperCase(ExeFileName))) then
     Result := Integer(TerminateProcess(OpenProcess(
                        PROCESS_TERMINATE, BOOL(0),
                        FProcessEntry32.th32ProcessID), 0));
    ContinueLoop := Process32Next(FSnapshotHandle,
                                  FProcessEntry32);
  end;
CloseHandle(FSnapshotHandle);
end;
Sonuç olarak exe adını kullanarak uygulamayı sonlandırmam lazım.
Şimdi gelelim bir iki tane örneğe.

Kod: Tümünü seç

function ReverseString(const AText: string): string; 
var 
  I: Integer; 
  P: PChar; 
begin 
  SetLength(Result, Length(AText)); 
  P := PChar(Result); 
  for I := Length(AText) downto 1 do 
  begin 
    P^ := AText[I]; 
    Inc(P); 
  end; 
end;


if pos('\',ProgExe) <> 0 then //path varsa.
        begin
        ProgExe:=copy(ProgExe,pos('exe.',ProgExe),pos('\',ProgExe)-pos('exe.',ProgExe));  //  7ihpleD\dnalroB\seliF margorP\:C  şekline gelir.
        ProgExe := copy(ProgExe,pos('exe.',ProgExe),length(ProgExe));
        end;
ProgExe:=reversestring(ProgExe);
Try KillTask(ProgExe); Except showmessage('Hata !') End;
ProgExe için
:idea: C:\PROGRA~1\A4Tech\Keyboard\Ikeymain.exe bunu Ikeymain.exe olarak döndürüyor. OK
:idea: "C:\Program Files\Kaspersky Lab\Kaspersky Anti-Virus Personal\kav.exe" /minimize bunu kav.exe olarak döndürüyor. OK
:idea: "C:\Program Files\Kaspersky Lab\Kaspersky Anti-Hacker\KAVPF.exe" /silence bunu KAVPF.exe olarak döndürüyor. OK
:idea: q:\YeDeK2\Belgelerim\Office\Delphi\WebAytek Hatırlatıcı\WebAytek Reminder & Shutter.exe bunu WebAytek Reminder & Shutter.exe olarak döndürüyor OK.
:idea: C:\Program Files\Microsoft Office\OFFICE11\OUTLOOK.EXE bunu \OUTLOOK.EXE olarak döndürüyor. asıl istediğim OUTLOOK.EXE olarak dndürmesi
:idea: RUNDLL32.EXE TWEAKUI.CPL,TweakMeUp bunu maalesef RUNDLL32.EXE TWEAKUI.CPL,TweakMeUp şekilde dönüştürüyor. - istediğim RUNDLL32.EXE şekline döndürmesi.
:idea: RUNDLL32.EXE C:\WINDOWS\System32\NvMcTray.dll,NvTaskbarInit bunu da \NvMcTray.dll,NvTaskbarInit şekilde dönüştürüyor. - istediğim RUNDLL32.EXE şekline döndürmesi.
:idea: nwiz.exe /install bunu nwiz.exe /install olarak döndürüyor. istediğim nwiz.exe olarak döndürmesi.
:idea: "C:\Program Files\MSN Messenger\MsnMsgr.Exe" /background bunu da \MsnMsgr.Exe" /background olarak döndürüyor. isteğim - MsnMsgr.Exe olarak döndürmesi.
Yani durum şu - herhangi bir path içinde bulunan (tamyolu) xxx.exe adının çekip çıkartılabilmesi. xxx.exe exe adı değiştiği gibi yazım şekilleri de değişiyor. O yüzden ortak bi formül bulamadım.
yardımcı olursanız sevinirim. KOLAY GELSİN
Kullanıcı avatarı
ofenX
Üye
Mesajlar: 397
Kayıt: 09 Nis 2005 10:24
Konum: Diyarbakır
İletişim:

Mesaj gönderen ofenX »

Merhaba,
Eğer parametreler sizin işinizi bozuyorsa. \ tan sonraki ilk .exe den sonrakileri sildirirsiniz. İşinizi görmüş olur.
webaytek yazdı:
function ReverseString(const AText: string): string;
var
I: Integer;
P: PChar;
begin
SetLength(Result, Length(AText));
P := PChar(Result);
for I := Length(AText) downto 1 do
begin
P^ := AText;
Inc(P);
end;
end;



bu kısmı ters yazması için mi yazmışsınız. Onun içinse zaten reversestring(); diye bir delphi fonksiyonu var. Sadece uses a strutils i ekleyeceksiniz.

Yukarıdaki fikri özetleyecek olursak. Uses a strutils i ekledikten sonra aşağıdaki kodu deneyin.

Kod: Tümünü seç

procedure TForm1.Button1Click(Sender: TObject);
var
a:string;

begin
          a:='C:\Program Files\MSN Messenger\MsnMsgr.Exe /background';
         a:=uppercase(reversestring(a));

         delete(a,1,pos('EXE.',a)-1);

           a:=reversestring(a);

           a:=extractfilename(a);
              showmessage (a) ;

end;


Kolay gelsin.
Kullanıcı avatarı
webaytek
Üye
Mesajlar: 377
Kayıt: 23 Haz 2004 10:58

Mesaj gönderen webaytek »

sizin dediğiniz yolla yapınca felaketler oldu :D
Eğer parametreler sizin işinizi bozuyorsa. \ tan sonraki ilk .exe den sonrakileri sildirirsiniz. İşinizi görmüş olur.
maalesef benim işimi hertürlü giriş bozuyo örneğin - " , / , \ 3 tane virgülle ayrılmış düşman var.
O döndürme işlemi bana en mantıklı geleni. ancak burada da bazı durumları kontrol edemiyorum.

string'i terse çevirdim çünkü .exe ye kadar olan bölümü alınca 2 ihtimal söz konusu ya "boşluk" ya da "\" boşluk olanlar parametre de olabilir veda dosya adı olabilir : örneğin : c:\WebAytek DersTakip.exe
aradaki boşluğa göre iz sürünce DersTakip.exe olarak alıyor
sadece WebAytek DersTakip.exe olarak girilen girişi de kısıtlayacak bir bölüm olmuyor. Yani yukarı tükürsem bıyık aşağı tükürsem sakal.
başında " olan girişleri kontrol etmek nispeten işimi zorlaştırıyor. Bence yapılacak en iyi şey şu :
1 - / ve " işaretlerini tamamen sildirmek
2 - geri kalan yazıyı tersten yazdırıp exe. den sağdaki en yakın \ işaretinden öncesini değişkene atmak ve yeniden tersten yazdırmak
3 - sonra da exe den sonraki bölümleri silmek.
böylece tüm dertlerim biter gibi geliyor. Yardımcı olursanız çok sevinirim.
Kullanıcı avatarı
ofenX
Üye
Mesajlar: 397
Kayıt: 09 Nis 2005 10:24
Konum: Diyarbakır
İletişim:

Mesaj gönderen ofenX »

Merhaba,
webaytek yazdı:sizin dediğiniz yolla yapınca felaketler oldu :D
Eğer parametreler sizin işinizi bozuyorsa. \ tan sonraki ilk .exe den sonrakileri sildirirsiniz. İşinizi görmüş olur.
Size öncelikle bir şey soracağım. Size verdiğim örneği alıp denediniz mi?
Eğer denemediyseniz, size şunu söyleyeyim. Verdiğiniz örneklerden OK lemediklerinizin hepsini denedim. Hepsi de istediğinizi veriyor.

Nerede karıştığını bana söyleyebilir misiniz? Ona göre kurgumuzu geliştirelim.

Kolay gelsin.
Kullanıcı avatarı
ofenX
Üye
Mesajlar: 397
Kayıt: 09 Nis 2005 10:24
Konum: Diyarbakır
İletişim:

Mesaj gönderen ofenX »

Ha bu arada söylemeyi unuttum. Eğer uses kısmına strutils i eklemişseniz. benim kullandığım reversestring ile sizin kendi yaptığınız reversestring bir birine karışmış olabilir.
Benim örneğimi boş bir formda deneseniz daha iyi olur.

Kolay gelsin.
Kullanıcı avatarı
webaytek
Üye
Mesajlar: 377
Kayıt: 23 Haz 2004 10:58

Mesaj gönderen webaytek »

Kod: Tümünü seç

if pos(':',ProgExe) = 0 then
        begin
        ProgExe:=lowercase(ProgExe);
        delete(ProgExe,pos('.exe',ProgExe)+4,length(ProgExe));
        end
else
        begin
        ProgExe:=lowercase(ProgExe);
        delete(ProgExe,pos('.exe',ProgExe)+4,length(ProgExe));
        ProgExe:=ReverseString(ProgExe);
        ProgExe:=copy(ProgExe,1,pos('\',ProgExe)-1);
        ProgExe:=ReverseString(ProgExe);
end;
Şu ana kadarki tüm sorunlarımı aştım ancak tek bi derdim kaldı.
Sadece Rundll32.exe c:\windows\system\nvcpl.dll,NvStartup tarzı girişleri kontrol edemiyorum. yukarıda 2 kategori dersek bu 2. kategoriye giriyor. bunda da : 15. karakter. ancak bu bir hataya sebebiyet veriyor. bu kod haklı olarak RUNDLL32.EXE TWEAKUI.CPL,TweakMeUp girişinde başarılı ancak RUNDLL32.EXE C:\WINDOWS\System32\NvMcTray.dll,NvTaskbarInit girişinde başarısız. bunu da dinamik bi çözüme bağlayabilirsek çoook sevineceğim.
Kullanıcı avatarı
ofenX
Üye
Mesajlar: 397
Kayıt: 09 Nis 2005 10:24
Konum: Diyarbakır
İletişim:

Mesaj gönderen ofenX »

webaytek yazdı:Şu ana kadarki tüm sorunlarımı aştım ancak tek bi derdim kaldı.
sizin tüm dertlerinizin çaresi toplu olarak aşağıdaki kod.

Kod: Tümünü seç


procedure TForm1.Button1Click(Sender: TObject);
var
a:string;

begin
          a:='C:\Program Files\MSN Messenger\MsnMsgr.Exe /background';
         a:=uppercase(reversestring(a));

         delete(a,1,pos('EXE.',a)-1);

           a:=reversestring(a);

           a:=extractfilename(a);
              showmessage (a) ;

end; 

ama bu başlıkta ofenX in tüm mesajları herhalde sizin için filtrelenmiş o yüzden göremiyorsunuz. :lol: :lol: :lol:

Kolay gelsin.
Kullanıcı avatarı
webaytek
Üye
Mesajlar: 377
Kayıt: 23 Haz 2004 10:58

Mesaj gönderen webaytek »

@ofenX sana kastım var mesajlarını okumuyor + değerlendirmiyorum demeyi çok isterdim ancak sizin verdiğiniz kodu denediğim için
sizin dediğiniz yolla yapınca felaketler oldu
dedim. zaten.
sadece extractfilename(a) bölümünü dikkate almamışım. yardımlarınızdan dolayı çok teşekkür ederim @ofenX - ayrıca kusura bakma lütfen :D
Cevapla