
Linux : ShellExecute API Muadili
Soru:
Windows’ta ShellExecute API’sini kullanarak harici programlar çalıştırabiliyoruz. Aynı işlevi Linux ortamında nasıl yapabiliriz?
Bu hafta Linux’u biraz kurcalayalım istedik, sanırım biraz abarttık 🙂
Cevap
Yaşadığımız 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 Type Casting tekniğini kullandım ve sorunumu bu noktada çözmüş oldum. 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.
https://linux.die.net/man/1/xdg-open
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;
Yorum yapılmamış