winexec ile program açınca sorun oluyor.

Delphi'de kod yazma ile ilgili sorularınızı bu foruma yazabilirsiniz.
Cevapla
Kullanıcı avatarı
Shou
Üye
Mesajlar: 260
Kayıt: 26 Ağu 2011 02:00

winexec ile program açınca sorun oluyor.

Mesaj gönderen Shou »

Merhaba arkadaşlar.

Programımı elle çalıştırdığımda sorun yok ama,

Kod: Tümünü seç

winexec(pchar(prodizini+'program.exe'),1);
Olarak başka program'dan çalıştırınca dosya okuma vs sorun oluyor neden kaynaklanıyor?

Sorunun ne olduğunu buldum ama çözümünü bulamadım bir türlü.

Kod: Tümünü seç

if fileexists('ayarlar.txt') then begin
showmessage('var.');
end;
Alttaki kod exe'de çalışıyor sorunsuz ama ben DLL'de yapmak istiyorum DLL de aynı sorun oluyor.

Kod: Tümünü seç

uses ShellApi;
var parameter: String;

parameter:='param1 param2';
ShellExecute(0, 'open', 'program.exe', PChar(parameter), nil, SW_SHOW);

Mesela normal elle açınca ayarlar.txt adlı dosya var diyor ama winexec ile açınca yok gözüküyor nasıl çözücez?

Yardımcı olursanız sevinirim.
Arkadaşlar yeni proje yaptım içine ekledim kod elle çift tıklayıp açınca çalışıyor ama winexec programla açınca gene çalışmıyor.

Benim projemle alakalı olabilir diye düşündüm ama değilmiş.
ertank
Kıdemli Üye
Mesajlar: 1716
Kayıt: 12 Eyl 2015 12:45

Re: winexec ile program açınca sorun oluyor.

Mesaj gönderen ertank »

Merhaba,

WinExec() fonksiyonuna verdiğiniz paramete uygulamayı çalıştıracaktır. Ancak WinExec() hangi dizinde iken çalıştırıldı ise açılan uygulamanın çalışma dizini de bu olacaktır. Zira siz parametre olarak 1 geçiyorsunuz.
Örn:
C:\test\Uygulama1.exe uygulaması WinExec() C:\test dizininde çalıştırılmış olsun.
WinExec() ise d:\deneme\uygulama2.exe uygulamasını çalıştırıyor olsun. uygulama2.exe çalıştırıldığında aktif dizini sizin verdiğiniz parametreye göre c:\test olacaktır.

WinExec() parametreleri ile ilgili detaylı bilgi almak için: https://msdn.microsoft.com/tr-tr/ms687393

Buna bağlı olarak FileExists() fonksiyonuna dizin olmadan sadece dosya adını parametre olarak vermişsiniz. Bu şekilde uygulama hangi dizin içinde çalışıyor ise o dizin içinde dosya olup olmadığı kontrol edilir. Yukarıdaki örneği düşünür isek bu dizin c:\test olacaktır. Burada doğru çalışma için yine dosya adını tam dizin bilgisi ile birlikte vermeniz gerekir.

Örnek ShellExecute kodu içinde dizin bilgisi yok. Eğer çalıştırılmak istenilen EXE dosya ShellExecute() fonksiyonunu çağıran uygulamanın şu anda bulunduğu dizin içinde değil ise bu fonksiyon başarısız olur. Dizin ile birlikte tam EXE dosya adını parametre olarak geçerseniz sorununuz çözülecektir diye düşünüyorum.

Uygulamanın aktif çalışma dizinini SysUtils içindeki GetCurrentDir() fonksiyonunu kullanarak öğrenebilirsiniz.
Kullanıcı avatarı
Shou
Üye
Mesajlar: 260
Kayıt: 26 Ağu 2011 02:00

Re: winexec ile program açınca sorun oluyor.

Mesaj gönderen Shou »

ertank yazdı:Merhaba,

WinExec() fonksiyonuna verdiğiniz paramete uygulamayı çalıştıracaktır. Ancak WinExec() hangi dizinde iken çalıştırıldı ise açılan uygulamanın çalışma dizini de bu olacaktır. Zira siz parametre olarak 1 geçiyorsunuz.
Örn:
C:\test\Uygulama1.exe uygulaması WinExec() C:\test dizininde çalıştırılmış olsun.
WinExec() ise d:\deneme\uygulama2.exe uygulamasını çalıştırıyor olsun. uygulama2.exe çalıştırıldığında aktif dizini sizin verdiğiniz parametreye göre c:\test olacaktır.

WinExec() parametreleri ile ilgili detaylı bilgi almak için: https://msdn.microsoft.com/tr-tr/ms687393

Buna bağlı olarak FileExists() fonksiyonuna dizin olmadan sadece dosya adını parametre olarak vermişsiniz. Bu şekilde uygulama hangi dizin içinde çalışıyor ise o dizin içinde dosya olup olmadığı kontrol edilir. Yukarıdaki örneği düşünür isek bu dizin c:\test olacaktır. Burada doğru çalışma için yine dosya adını tam dizin bilgisi ile birlikte vermeniz gerekir.

Örnek ShellExecute kodu içinde dizin bilgisi yok. Eğer çalıştırılmak istenilen EXE dosya ShellExecute() fonksiyonunu çağıran uygulamanın şu anda bulunduğu dizin içinde değil ise bu fonksiyon başarısız olur. Dizin ile birlikte tam EXE dosya adını parametre olarak geçerseniz sorununuz çözülecektir diye düşünüyorum.

Uygulamanın aktif çalışma dizinini SysUtils içindeki GetCurrentDir() fonksiyonunu kullanarak öğrenebilirsiniz.
Teşekkür ederim hocam yorumunuz için denedim ben başka klasörü okuyor evet ama ben kendi klasörümü nasıl okutabilirim onu çözemedim örnek kod verebilirseniz çok sevinirim.
ertank
Kıdemli Üye
Mesajlar: 1716
Kayıt: 12 Eyl 2015 12:45

Re: winexec ile program açınca sorun oluyor.

Mesaj gönderen ertank »

İlgili kodu paylaşabilir misiniz? Üzerinde düzeltme yapalım. Verilen örnek sizin için anlamlı olmayabilir.
Kullanıcı avatarı
Shou
Üye
Mesajlar: 260
Kayıt: 26 Ağu 2011 02:00

Re: winexec ile program açınca sorun oluyor.

Mesaj gönderen Shou »

ertank yazdı:İlgili kodu paylaşabilir misiniz? Üzerinde düzeltme yapalım. Verilen örnek sizin için anlamlı olmayabilir.

Kod: Tümünü seç

parameter:='param1 param2';
ShellExecute(0, 'open', pchar(prodizini+'GD.exe'), PChar(parameter), nil, SW_SHOW);
Dll de bunu yaptım ve,

Kod: Tümünü seç

winexec(pchar(prodizini+'GD.exe SS'),sw_show);
Bunu yaptım ama programları açıyorlar başka bir klasörü okuyorlar.

En üstteki kod bir programdan bir programı açınca sorunsuz çalışıyor ama DLL'de açıyor aynı klasörü okumuyor.

Teşekkür ederim.
ertank
Kıdemli Üye
Mesajlar: 1716
Kayıt: 12 Eyl 2015 12:45

Re: winexec ile program açınca sorun oluyor.

Mesaj gönderen ertank »

GD.EXE uygulamasının OnCreate() olayına esas yapması gerekenleri yapmaya başlamadan önce (mümkünse ilk satır olarak) aşağıdaki satırı ekleyip yeniden deneyebilir misiniz?

Kod: Tümünü seç

Chdir(ExtractFilePath(Application.ExeName));
Kullanıcı avatarı
Shou
Üye
Mesajlar: 260
Kayıt: 26 Ağu 2011 02:00

Re: winexec ile program açınca sorun oluyor.

Mesaj gönderen Shou »

ertank yazdı:GD.EXE uygulamasının OnCreate() olayına esas yapması gerekenleri yapmaya başlamadan önce (mümkünse ilk satır olarak) aşağıdaki satırı ekleyip yeniden deneyebilir misiniz?

Kod: Tümünü seç

Chdir(ExtractFilePath(Application.ExeName));
Böyle düzeldi hocam çok teşekkür ederim sağolasınız.
Cevapla