Ohjelmointi: ShellExecute() linuxissa - vastine

Windowsissa on API -kutsu nimeltä ShellExecute().


dokumentointi:
http://msdn.microsoft.com/en-us/library/windows/desktop/bb762153(v=vs.85).aspx

ShellExecute() on siitä kätevä, että sille voi antaa parametriksi vaikkapa:

"textfile.txt", jolloin se avaa automaattisesti em. tekstitiedoston käyttäjän oletuseditorissa (joka on oletuksena notepad, mutta käyttäjä voi sen halutessaan vaihtaa).

Vastaavasti esim:
"document.pdf", avaa automaattisesti em. PDF -tiedoston käyttäjän oletus PDF -katselimessa (joka on usein acrobat reader, mutta käyttäjä voi sen halutessaan vaihtaa).

Tai, kun windows -käyttäjä klikkaa magnet linkkiä eräillä nettisivuilla, niin käyttäjän oletus -torrentinkäsittelyohjelma käynnistyy ja pyrkii lataamaan ko. magnet linkin viittaaman tiedoston.

Mutta miten linuxissa saa toimimaan saman idean ?

Linuxissa ei valitettavasti ole samaa toiminnallisuutta vakiona, mutta muutaman tunnin netistä tietoa etsittyäni löytyi paras ratkaisu, millä linux saadaan näissä asioissa käyttäytymään samoin kuin windows:

Koneelle tulee asentaa xdg-open.

Jos koneella ajetaan jotakin näistä työpöytäympäristöistä (Desktop environment):

GNOME, KDE, Xfce

silloin xdg-open välittää avauskomennon ko. työpöytäympäristön omalle tiedostonavauskäsittelijälle (gvfs-open, kde-open, exo-open),
muussa tapauksessa xdg-open käyttää omia konfiguraatiotiedostojaan päätelläkseen, mikä ohjelma tarvitaan käyttäjän haluaman dokumentin avaamiseen.

Lisää xdg-openista:
https://wiki.archlinux.org/index.php/Xdg-open

Jos samalla koneella ajetaan useita eri työpöytäympäristöjä vuorotellen (tai yhtäaikaa Ctrl-Alt-F7, Ctrl-Alt-F8 ja Ctrl-Alt-F9 -virtuaalityöpöydillä), ratkaisussa on toki se haitta, että jos haluaa oletusohjelmien olevan aina samat, joutuu samat oletusohjelmat konfiguroimaan useaan eri paikkaan.

Mutta kun linuxilla ei ole asiaan yhtenäistä standardia, niin xdg-open on kuitenkin huomattavasti tyhjää parempi ratkaisu siihen ongelmaan, ettei linuxissa ole aitoa ShellExecute() -funktiota windowsin tavoin.

Seuraava kysymys: saako tuon xdg-openin muihinkin jakeluihin kuin archlinuxiin ?

Siis tässä pseudokoodi ShellExecute() -funktioon linuxille:

int ShellExecute(
_In_opt_ HWND hwnd,
_In_opt_ LPCTSTR lpOperation,
_In_ LPCTSTR lpFile,
_In_opt_ LPCTSTR lpParameters,
_In_opt_ LPCTSTR lpDirectory,
_In_ INT nShowCmd
) {

// JOS lpDirectory ei ole NULL, niin :
// chdir(lpDirectory);

// JOS lpFile ei ole ajettava tiedosto (ohjelma tai skripti), niin:
// kutsu ohjelmaa xdg-open ja anna sille parametriksi lpFile

// jos lpFile ON ohjelma tai skripti, käynnistä em. ohjelma tai skripti ja anna
// sille parametriksi lpParameters

}

Voi olla, että vastaavia ohjelmia olisi muitakin. Mutta, jotta ohjelma Z voisi toteuttaa asiallisesti toimivan ShellExecute() -funktion linuxissa, niin ei ohjelma Z voi arvailla, mitä ohjelmaa missäkin jakelussa pitäisi kutsua.

Koska tuo xdg-open on ilmeisesti ensimmäinen / tunnetuin ratkaisu ongelmaan, niin asiallista on kutsua nimenomaan sitä.

Jos xdg-open ei jotakuita miellytä, niin suosittelen kirjoittamaan itse paremman, mutta pitämään huolta siitä, että kun oman ohjelmansa nimeää xdg-openiksi, niin oman ohjelman on syytä toimia oikein silloin, kun sitä kutsuva muu ohjelma luulee kutsuvansa alkuperäistä xdg-openia ! Jos tätä periaatetta ei noudata, niin omasta ohjelmastasi on silloin enemmän haittaa kuin hyötyä !

Lopuksi: kuuluukohan tällaiset artikkelit linux -vai ohjelmointipalstalle, kun on kyse nimenomaan linux -ohjelmoinnista ?
5128
Äänestä

Muut lukivat myös

Vastaukset 5

Vanhimmat

>> Lopuksi: kuuluukohan tällaiset artikkelit linux -vai ohjelmointipalstalle, kun on kyse nimenomaan linux -ohjelmoinnista ? >>

Taitaapa kuulua, sillä xdg-open löytyy suoraan pakettivarastosta:
$ apt-cache search xdg-open
xdg-utils - desktop integration utilities from freedesktop.org

Mutta on kokonaan toinen asia kuinka moni tällä foorumilla ymmärtää näistä GUI-ohjelmointiin liittyvistä asioista? Katotaan kuinka käy...

Äänestä

//???????????
//miten olis tämä?
execv("/usr/bin/firefox","www.huuhaa.com");

//???????????

Äänestä
  • No ei !!!

    Kun tässä nimenomaan haettiin ShellExecute() -vastinetta linuxiin.

    Ja tuo ShellExecute kun nimenomaan mahdollistaa sen, että sille annetaan parametriksi pelkkä tiedostonimi tai URL, eikä sovellusta.

    Jos vaikkapa linux -asennuksessani on asennettuna kaikki nämä:

    firefox
    opera
    konqueror

    niin aito ShellExecute osaa katsoa, mikä on käyttäjän oletusselain ja avata http -linkit siinä. Miksi siis kovakoodaisin http -linkeille "firefox" kun voi olla, että:

    1) koneella ei ole edes asennettuna firefoxia

    2) käyttäjän oletusselain voi olla muu kuin firefox.

    Tuo itse löytämäni sovellus vaikuttaa parhaalta, mitä linuxjakeluille on tähän tarkoitukseen saatavana.

    Toivottavasti xdg-open tekijät ymmärtävät joko:

    a) olla muuttamatta ohjelman kutsutapaa

    tai

    b) jos kutsutapaa muutetaan, muutokset pitää suunnitella siten, että joku vanha ohjelma joka noudattaa vanhaa kutsutapaa, toimii edellee oikein.

    Äänestä

  • ShellExecute! kirjoitti:

    No ei !!!

    Kun tässä nimenomaan haettiin ShellExecute() -vastinetta linuxiin.

    Ja tuo ShellExecute kun nimenomaan mahdollistaa sen, että sille annetaan parametriksi pelkkä tiedostonimi tai URL, eikä sovellusta.

    Jos vaikkapa linux -asennuksessani on asennettuna kaikki nämä:

    firefox
    opera
    konqueror

    niin aito ShellExecute osaa katsoa, mikä on käyttäjän oletusselain ja avata http -linkit siinä. Miksi siis kovakoodaisin http -linkeille "firefox" kun voi olla, että:

    1) koneella ei ole edes asennettuna firefoxia

    2) käyttäjän oletusselain voi olla muu kuin firefox.

    Tuo itse löytämäni sovellus vaikuttaa parhaalta, mitä linuxjakeluille on tähän tarkoitukseen saatavana.

    Toivottavasti xdg-open tekijät ymmärtävät joko:

    a) olla muuttamatta ohjelman kutsutapaa

    tai

    b) jos kutsutapaa muutetaan, muutokset pitää suunnitella siten, että joku vanha ohjelma joka noudattaa vanhaa kutsutapaa, toimii edellee oikein.

    jaa joo.. en ihan tajunnut tuota ensimmäistä selostustasi.
    xdg-open tuossa tapauksessa joo tai sitten testaat mikä työpöytä käytössä ja sitten esim. kde-open tai gnome-open jne..

    ja voisko tämä olla avuksi?
    http://linux.die.net/man/1/mimeopen

    Äänestä

1. Oletko ihan varma, että käytät oikeaa työkalua (tai tapaa) homman tekemiseen? Sopivalla frameworkilla saa tehtyä tiedoston avaamisen omassa sovelluksessasi integroidusti.

2. Yleensä ohjelmistoissa ei kannata ottaa maaliksi kaikkia mahdollisia Linuxia käyttäviä käyttäviä käyttöjärjestelmiä ja työpöytäympäristöjä. Mutta jos niin haluaa niin tuo xdg-open on oikea tapa jos haluaa käynnistellä eri sovelluksilla tiedostoja.

Äänestä

Kommentoi aloitusta


ShellExecute! kirjoitti:

Windowsissa on API -kutsu nimeltä ShellExecute().


dokumentointi:
http://msdn.microsoft.com/en-us/library/windows/desktop/bb762153(v=vs.85).aspx

ShellExecute() on siitä kätevä, että sille voi antaa parametriksi vaikkapa:

"textfile.txt", jolloin se avaa automaattisesti em. tekstitiedoston käyttäjän oletuseditorissa (joka on oletuksena notepad, mutta käyttäjä voi sen halutessaan vaihtaa).

Vastaavasti esim:
"document.pdf", avaa automaattisesti em. PDF -tiedoston käyttäjän oletus PDF -katselimessa (joka on usein acrobat reader, mutta käyttäjä voi sen halutessaan vaihtaa).

Tai, kun windows -käyttäjä klikkaa magnet linkkiä eräillä nettisivuilla, niin käyttäjän oletus -torrentinkäsittelyohjelma käynnistyy ja pyrkii lataamaan ko. magnet linkin viittaaman tiedoston.

Mutta miten linuxissa saa toimimaan saman idean ?

Linuxissa ei valitettavasti ole samaa toiminnallisuutta vakiona, mutta muutaman tunnin netistä tietoa etsittyäni löytyi paras ratkaisu, millä linux saadaan näissä asioissa käyttäytymään samoin kuin windows:

Koneelle tulee asentaa xdg-open.

Jos koneella ajetaan jotakin näistä työpöytäympäristöistä (Desktop environment):

GNOME, KDE, Xfce

silloin xdg-open välittää avauskomennon ko. työpöytäympäristön omalle tiedostonavauskäsittelijälle (gvfs-open, kde-open, exo-open),
muussa tapauksessa xdg-open käyttää omia konfiguraatiotiedostojaan päätelläkseen, mikä ohjelma tarvitaan käyttäjän haluaman dokumentin avaamiseen.

Lisää xdg-openista:
https://wiki.archlinux.org/index.php/Xdg-open

Jos samalla koneella ajetaan useita eri työpöytäympäristöjä vuorotellen (tai yhtäaikaa Ctrl-Alt-F7, Ctrl-Alt-F8 ja Ctrl-Alt-F9 -virtuaalityöpöydillä), ratkaisussa on toki se haitta, että jos haluaa oletusohjelmien olevan aina samat, joutuu samat oletusohjelmat konfiguroimaan useaan eri paikkaan.

Mutta kun linuxilla ei ole asiaan yhtenäistä standardia, niin xdg-open on kuitenkin huomattavasti tyhjää parempi ratkaisu siihen ongelmaan, ettei linuxissa ole aitoa ShellExecute() -funktiota windowsin tavoin.

Seuraava kysymys: saako tuon xdg-openin muihinkin jakeluihin kuin archlinuxiin ?

Siis tässä pseudokoodi ShellExecute() -funktioon linuxille:

int ShellExecute(
_In_opt_ HWND hwnd,
_In_opt_ LPCTSTR lpOperation,
_In_ LPCTSTR lpFile,
_In_opt_ LPCTSTR lpParameters,
_In_opt_ LPCTSTR lpDirectory,
_In_ INT nShowCmd
) {

// JOS lpDirectory ei ole NULL, niin :
// chdir(lpDirectory);

// JOS lpFile ei ole ajettava tiedosto (ohjelma tai skripti), niin:
// kutsu ohjelmaa xdg-open ja anna sille parametriksi lpFile

// jos lpFile ON ohjelma tai skripti, käynnistä em. ohjelma tai skripti ja anna
// sille parametriksi lpParameters

}

Voi olla, että vastaavia ohjelmia olisi muitakin. Mutta, jotta ohjelma Z voisi toteuttaa asiallisesti toimivan ShellExecute() -funktion linuxissa, niin ei ohjelma Z voi arvailla, mitä ohjelmaa missäkin jakelussa pitäisi kutsua.

Koska tuo xdg-open on ilmeisesti ensimmäinen / tunnetuin ratkaisu ongelmaan, niin asiallista on kutsua nimenomaan sitä.

Jos xdg-open ei jotakuita miellytä, niin suosittelen kirjoittamaan itse paremman, mutta pitämään huolta siitä, että kun oman ohjelmansa nimeää xdg-openiksi, niin oman ohjelman on syytä toimia oikein silloin, kun sitä kutsuva muu ohjelma luulee kutsuvansa alkuperäistä xdg-openia ! Jos tätä periaatetta ei noudata, niin omasta ohjelmastasi on silloin enemmän haittaa kuin hyötyä !

Lopuksi: kuuluukohan tällaiset artikkelit linux -vai ohjelmointipalstalle, kun on kyse nimenomaan linux -ohjelmoinnista ?

Anonyymi
5000

Ilmoita asiaton sisältö

  • Sisältää materiaalia, joka on loukkaavaa, herjaavaa, rasistista, uhkailevaa tai ahdistelevaa.

  • Materiaali sisältää nimiä, yhteystietoja tai muita henkilökohtaisia tietoja. Julkisuuden henkilöistä, julkisissa viroissa toimivista ihmisistä sekä yritysten vastuuhenkilöistä saa keskustella työhön liittyen. Myös yksityiselämään liittyvistä asioista voi keskustella siltä osin, kuin niistä on julkisesti kerrottu.

  • Sisältää lapsille haitallista tai heiltä kiellettyä materiaalia. Seksuaalinen sisältö on sallittua aiheeseen tarkoitetuilla palstoilla, joiden ikäraja on 18 vuotta.

  • Lainvastaista sisältöä voi olla mm. yksityiselämää loukkaavan tiedon levitys, kiihottaminen kansanryhmää vastaan, laiton uhkaaminen, alaikäisiin liittyvä seksuaalinen sisältö/grooming, petokset, identiteettivarkaudet, kunnianloukkaukset ja tekijänoikeusrikkomukset.

  • Sisältö ei liity palstan tai keskusteluketjun aiheeseen.

  • Viesti ei ole suomea tai ruotsia (pl. International Forums), se sisältää mainontaa, se sisältää tekijänoikeuksin suojattua materiaalia, se on massapostitus tai jokin muu syy.

Jaa keskustelu