Konuyu Paylaş : facebook gplus twitter

Konuyu Oyla:
  • Derecelendirme: 5/5 - 1 oy
  • 1
  • 2
  • 3
  • 4
  • 5
Linux ShellExecute API Muadili
#1
Merhaba,

Bu hafta Linux'a bir göz atalım dedik fakat tam daldık sanırım :Smile

Windows'ta ShellExecute API'sini kullanarak harici programlar çalıştırabiliyoruz.  Bunun Linux'cası nedir? Yani ShellExecute'nin Linux eşdeğeri nedir?

Tam olarak yapmak istediğim aslıda şu;

procedure TAna.ShowFolder(aFilePath: TFileName);
begin
  {$IFDEF  MSWINDOWS}

    ShellExecute(0, 'open', Pchar (  ExtractFilePath (aFilePath)  ), '', '', SW_SHOWNORMAL);

  {$ENDIF}
  {$IFDEF  LINUX}

    // ?????

  {$ENDIF}
end;
Peyami Safa: "Yaşlanarak değil, yaşayarak tecrübe kazanılır. Zaman insanları değil, armutları olgunlaştırır". 
Cevapla
#2
Linkleri Görebilmeniz İçin Giriş yap veya Üye Ol şöyle bir örnek var, denediniz mi?
uses
{$IFDEF MSWINDOWS}
winapi.shellapi
{$ENDIF}
{$IFDEF POSIX}
Posix.Stdlib
{$ENDIF POSIX}
;

function ExecuteFile(const filename, Params, DefaultDir: string;
     ShowCmd: integer): THandle;
 begin
   {$IFDEF MSWINDOWS}
     result := ShellExecute(0, 'Open', PChar(filename), PChar(Params),
       PChar(DefaultDir), ShowCmd);
   {$ENDIF}
   {$IFDEF MACOS}
     _system(PAnsiChar('open ' + AnsiString(filename)));
   {$ENDIF}
 end;

Tabi ki siz MACOS kontrolü değiştirmeli/kaldırmalısınız.
There's no place like 127.0.0.1
WWW
Cevapla
#3
Yukarıdaki şekilde denedim fakat çalışmadı maalesef Sad
There's no place like 127.0.0.1
WWW
Cevapla
#4
Ben de denemelerimde başarısız oldum, kaynak araştırıyordum, şöyle bir yazı buldum, artık denemesini sabaha bırakıyorum;

Linkleri Görebilmeniz İçin Giriş yap veya Üye Ol

Şunlar da yardımcı olabilir diye şimdilik buraya not düşeyim;

Linkleri Görebilmeniz İçin Giriş yap veya Üye Ol
Linkleri Görebilmeniz İçin Giriş yap veya Üye Ol
Linkleri Görebilmeniz İçin Giriş yap veya Üye Ol

Şuna da bakmak lazım;

Linkleri Görebilmeniz İçin Giriş yap veya Üye Ol

( Bayılmadan yatsam iyi olur )  At
Peyami Safa: "Yaşlanarak değil, yaşayarak tecrübe kazanılır. Zaman insanları değil, armutları olgunlaştırır". 
Cevapla
#5
Linux altında hiç kodlama yapmadım ama aradığınız komut execv değil mi ?
Mal sahibi, mülk sahibi
Hani bunun ilk sahibi ?
Mal da yalan mülk de yalan
Var biraz da sen oyalan...
WWW
Cevapla
#6
Fonksiyonun ilgili kısmını şu şekilde değiştirip:
{$IFDEF LINUX64}
  _system(PUTF8Char(RawByteString(filename)));
{$ENDIF}

firefox'u console uygulamasından açmayı başardım Smile

ExecuteFile('firefox', '', '', 0);

Delphi'de Linux için kod yazmak isteyenler okumalı:
Linkleri Görebilmeniz İçin Giriş yap veya Üye Ol
There's no place like 127.0.0.1
WWW
Cevapla
#7
(02-11-2017, Saat: 00:17)Tuğrul HELVACI Adlı Kullanıcıdan Alıntı: Linkleri Görebilmeniz İçin Giriş yap veya Üye OlLinux altında hiç kodlama yapmadım ama aradığınız komut execv değil mi ?

Merhaba,
Çok araştırmadım, fakat benzer işlemler için ilaveten execle, execlp, execve ve execvp metodları da kullanılabilir.
Tuğrul hocam'ın belirttiği fonksiyonu kullanmak için;

uses
 System.SysUtils{$IFDEF  MSWINDOWS},
 Shellapi, Winapi.Windows{$ENDIF}
{$IFDEF  LINUX64}, Posix.Unistd{$ENDIF};

 
{$IFDEF  LINUX64}
 execl('./PAServer-19.0/paserver', '');
{$ENDIF}
While true do; Hayat döngüsü, kısır değildir! Yapılan bir yanlış, o döngünün dışına çıkmanızı sağlayacaktır.
WWW
Cevapla
#8
Merhaba,

Sonuca bağlamak adına sorunun nasıl çözüldüğünü belirtmek istedim;

Yaşadığım problemin iki ayağı vardı;

Bunlardan birincisi _PAnsiChar tipinin NEXTGEN derleyici direktifi kapsamında tanımlı olmasından kaynaklanıyordu, yani LINUX, LINUX64 gibi derleyici direktifleri altında doğrudan bir tip tanımlaması ile karşılaşamadım. Bu sorunu aşmak için SimaWB'in kulandığı tekniği kullandım ve işimi bu noktada çözmüş oldu. Yani PUTF8Char( RawByteString( filename ) ) tip sarmalamasıyla bu noktayı aşmış olduk.

Fakat yine de söz konusu klasörü bir pencerede gösterme sorununu aşmak gerekiyordu. Bu sorunu aşmak için linux'ta bu işler için "xdg-open" komutunun kullanılması gerekiyor. Bu komut tıpkı Windows'daki gibi ShellExecute'nin yaptığı işi konsolda bir komut olarak yerine getiriyor. Sadece bir klasörü açmak için değil, aynı zamanda işletim sisteminin tanıdığı dosya tiplerine karşılık gelen ilgili programı çağırarak dosyaları da açabiliyor veya bir URL yazdıysanız onu browser'a da yükleyebiliyor... Detaylı bilgi için aşağıdaki linke bakılabilir.

Linkleri Görebilmeniz İçin Giriş yap veya Üye Ol

implementation

uses
    System.IniFiles
  {$IFDEF MSWINDOWS}
  , WINAPI.WINDOWS
  , Winapi.ShellAPI           // ShellExecute
  {$ENDIF MSWINDOWS}
  {$IFDEF LINUX64}
  , Posix.Stdlib              // _system  >  ShellExecute eşdeğeri...
  {$ENDIF LINUX64}
  ;

  // .....
  // .....
  // .....

procedure TAna.ShowFolder( aFilePath: TFileName );
var
  aPath : String;
begin
  aPath := ExtractFilePath(aFilePath);
  {$IFDEF  MSWINDOWS}
    ShellExecute( 0, 'open', PChar ( aPath ), '', '', SW_SHOWNORMAL);
  {$ENDIF}
  {$IFDEF LINUX64}
    _system( PUTF8Char( RawByteString( 'xdg-open ' + aPath ) ) );
  {$ENDIF}
end;

Sonuç olarak hem Windows'ta hem de Linux'ta çalışan bir program olmuş oldu;

rJ5LrV.gif
Peyami Safa: "Yaşlanarak değil, yaşayarak tecrübe kazanılır. Zaman insanları değil, armutları olgunlaştırır". 
Cevapla

Konuyu Paylaş : facebook gplus twitter



Konu ile Alakalı Benzer Konular
Konular Yazar Yorumlar Okunma Son Yorum
  Linux Cursor Position ve Text Attributte API muadili... uparlayan 11 730 01-11-2017, Saat: 07:36
Son Yorum: savasabd
  Hoş Bir Linux Dağıtımı Elementary Os savasabd 3 527 23-10-2017, Saat: 22:56
Son Yorum: nguzeller
  Delphi ile Linux Uygulama Geliştirme Abdullah ILGAZ 24 2.615 12-07-2017, Saat: 13:36
Son Yorum: nguzeller
  Linux Sunucu Önerisi Fesih ARSLAN 22 1.772 18-06-2017, Saat: 17:19
Son Yorum: nguzeller
Question Linux da Lazarus ve raudus kurup yayınlama masteryoda 1 1.542 07-10-2016, Saat: 02:06
Son Yorum: engerex



Konuyu Okuyanlar: 1 Ziyaretçi