Winexec yada ShellExecute İle Klasör İçindeki Dosyayı Çağırma

Delphi'de kod yazma ile ilgili sorularınızı bu foruma yazabilirsiniz.
Cevapla
Nomercy
Üye
Mesajlar: 62
Kayıt: 17 Kas 2014 12:33

Winexec yada ShellExecute İle Klasör İçindeki Dosyayı Çağırma

Mesaj gönderen Nomercy »

Arkadaşlar WinExec yada ShellExecute İle Dosya Yolunu Girerek Dosyayı Çağırabiliyorum. Ama Herkesin Bilgisayarında Aynı Olmadığı İçin Şöyle Yapmak İstiyorum.Exe nin Yanında Bulunan Dosyanın İçindekini Çağırmak İstiyorum.

Yani Diyelim ki Dosya Yolu Bu; C:\Users\Nomercy\Desktop\Program\Data\x86.exe
Exe de C:\Users\Nomercy\Desktop\Program Klasörünün İçinde Çalışıyor.
Ben sadece Data\x86.exe Olarak Çağırırsam Her Zaman Diğer Bilgisayarlarda Sorun Yaşamadan Çalışır.

Umarım Anlatabilmişimdir.
Kullanıcı avatarı
greenegitim
Üye
Mesajlar: 713
Kayıt: 28 Nis 2011 10:33
Konum: İstanbul

Re: Winexec yada ShellExecute İle Klasör İçindeki Dosyayı Çağırma

Mesaj gönderen greenegitim »

ExtractFilePath işinizi görecektir.
http://docwiki.embarcadero.com/Librarie ... ctFilePath
Mücadele güzelleştirir!
ertank
Kıdemli Üye
Mesajlar: 1711
Kayıt: 12 Eyl 2015 12:45

Re: Winexec yada ShellExecute İle Klasör İçindeki Dosyayı Çağırma

Mesaj gönderen ertank »

Merhaba,

Kullandığınız Delphi sürümünü belirtmemişsiniz. Aşağıdaki örnek kod yeni sürüm Delphi ile çalışacak şekilde verilmiştir.

Öncelikle sorunuz çok net değil.

(1) Çalışma dizinini öğrenmek istiyor iseniz örnek kod aşağıdaki gibi olabilir:

Kod: Tümünü seç

uses
  System.IOUtils;

procedure TForm1.Button1Click(Sender: TObject);
var
  ExeNameToRun: string;
begin
  ExeNameToRun := ExtractFileName(ExcludeTrailingPathDelimiter(ExtractFilePath(Application.ExeName)));
  ExeNameToRun := ExeNameToRun + TPath.DirectorySeparatorChar + ExtractFileName(Application.ExeName);
  ShowMessage(ExeNameToRun);
end;
(2) Ancak zaten sürekli EXE çalışma dizini altındaki "Data\x86.exe" çalıştırılacak ise bunun için bir sabit tanımlayıp direk kendisini kullanabilirsiniz.

Kod: Tümünü seç

uses
  Shellapi,
  System.IOUtils;

procedure TForm1.Button2Click(Sender: TObject);
const
  ExeDirectoryName = 'data\';
  ExeNameToRun = 'x86.exe';
var
  Directory: string;
  Parameters: string;
begin
  Directory := TPath.GetLibraryPath() + TPath.DirectorySeparatorChar + 'data';
  Parameters := EmptyStr;

  {$I-}
  // Önlem için çalışma dizinine geçilsin.
  // Bazı uygulamalar çalışma dizini parametresini gözardı edebiliyor
  ChDir(Directory);
  {$I+}
  if IOResult <> 0 then
  begin
    ShowMessage('Dizine ulaşılamıyor: ' + AnsiQuotedStr(Directory, '"'));
    Exit();
  end;

  // Çalıştırılan uygulamanın pencere durumu ile ilgili kullanılabilecek parametreler
  // SW_HIDE
  // SW_SHOWNORMAL
  // SW_SHOWMINIMIZED
  // SW_SHOWMAXIMIZED
  ShellExecute(Application.Handle, 'open', PWideChar(ExeDirectoryName + ExeNameToRun), PWideChar(Parameters), PWideChar(Directory), SW_SHOWNORMAL);

  {$I-}
  // Kendi uygulama dizinimize geri dönelim
  ChDir(TPath.GetLibraryPath());
  {$I+}
  if IOResult <> 0 then
  begin
    ShowMessage('Uygulama dizinine geri dönülemiyor: ' + AnsiQuotedStr(TPath.GetLibraryPath(), '"'));
    Exit();
  end;
end;
Bunun dışında farklı birşey sormak istedi iseniz biraz daha detaylı şekilde ve kod paylaşarak yapmanızda fayda var.
Cevapla