Win-ohjelmien

avaaminen. Miten onnistuisi tehdä ohjelma, joka avaa esim. MediaPlayerin soittamaan jotain teittyä kappaletta, tai selaimen avaamaan jonkun tietyn osoitteen? Olisiko esimerkkejä vaikkapa Pascalille, C :lle tai Windowsin skriptiin?

Kysyvä ei tieltä eksy.
4362
Äänestä

Muut lukivat myös

Vastaukset 4

Vanhimmat

MS media player + Delphi

tällä yhdistelmällä homma on helppo!

1. importoi MS Media Player Delphiin ActiveX -komponenttina.

HUOM: älä hyväksy oletusnimeä TMediaPlayer (koska se menee päällekkäin Delphin oman TMediaPlayer -komponentin kanssa, mikä aiheuttaa importoinnin epäonnistumisen, koska et voi asentaa 2 samannimistä komponenttia).

Siis muuta nimi vaikka TMsMediaPlayer:iksi.

2. kun olet importoinut nimellä TMsMediaPlayer, voit suoraan pudottaa formille TMsMediaPlayer -komponentin, jolloin Delphi luo koodia näin:

MsMediaPlayer1:TMsMediaPlayer;

en muista ulkoa, mutta menisiköhän suunnilleen näin:

esim Button1Click -metodiin:

MsMediaPlayer1.FileName := 'C:\polkunimi\biisi.mp3';

MsMediaPlayer1.Play;

tuo ei tosin avaa erillistä media playeria, vaan käyttä MS Media Playeria osana omaa Delphi -ohjelmaasi.

Jos välttämättä haluat avata erillisen playerin, googleta netistä: msdn createprocess

huom: jos em. importoimasti TMsMediaPlayer aiheuttaa ongelmia Delphin IDE.ssä tai omassa ohjelmassasi "Access violation" -ilmoitusten muodossa, voi ongelmaa yrittää ratkaista lisäämällä WMDestroy -käsittelijän määreellä:

message WM_Destroy;

tuohon sitten laitat tällasta:

procedure WMDestroy(Message:TWmDestroy);
begin

FreeAndNil(MsMediaPlayer1);

inherited;
end;

Jos Access violation aiheutuu Delphin IDE:ssä, niin silloin kannattaa tehdä näin:

1. Importoi em. TMsMediaPlayer

2. periytä siitä oma luokka TFixedMsMediaPlayer

omassa TFixedMsMediaPlayer -luokassa tee tarpeelliset muutokset/täydennykset, jotta komponentti osaa vapauttaa itsensä oikein
aiheuttamatta poikkeuksia.

em. ongelma johtuu Microsoftin ja Borland Delphin erilaisesta järjestyksestä tehdä komponentin tuhoamiseen ja ohjelman lopettamiseen liittyviä asioita.

Jos et halua tai osaa kikkailla em. ongelmien kanssa, voi 1 ratkaisu olla myös tämä:

ÄLÄ pudota formille TMsMediaPlayeria, vaan luo se omassa koodissasi esim. formin OnCreate -metodissa:

MsMediaPlayer := TMsMediaPlayer.Create(Self);

ja laita sekä em. WMDestroy että OnDestroy -metodiin sama FreeAndNil(MsMediaPlayer);

ensimmäinen kutsu vapauttaa playerin JA asettaa siihen viittaavan formin kentän arvoon NIL.

Jälkimmäinen FreeAndNil ei tee mitään, kun huomaa, että kenttä on jo NIL.

Juuri tästä syystä FreeAndNil on parempi kuin pelkkä Free; pelkkä Free vapauttaa olion, muttei nollaa siihen liityvää muuttujaa, siksi uusi Free -kutsu yrittää vapauttaa toiseen kertaan jo vapautettua oliota, mistä seuraa hankaluuksia (yleensä Access Violation, mutta muitakin harmeja saattaa olla luvassa).

Tässä samalla malliesimerkki siitä, mitä hyötyä on ActiveX:stä: sen avulla saat Microsoftin tekemän Mediaplayerin toimimaan aivan kuin se olisi Delphi -komponenttti (siitä voi jopa periyttää uusia Delphi -komponentteja).

MS Internet Explorer löyty Delphistä valmiina ActiveX -komponenttina: TWebBrowser.

sen käytöstä esim Henri Fournier on kirjoitellut paljon asiaa (googleta).

Vaihtoehtona myös TEmbeddedWB (ei kuulu Delphiin vakiona, mutta googleta tuolla nimellä tai bsalsa).

huom: TEmbeddedWB tunkee omiaan http GET/POST -pyyntöjen useragent -kenttään, ja mikä pahinta, tämä koskee samaan aikaan käynnissä olevaa MS-IE:tä myös !

Onneksi TEmbeddedWB on avointa lähdekoodia (tehty 100% Delphillä), joten tutki koodia, ja korjhaa sen useragent :iin liittyvät muutokset!

helpoin tapa: etsi ja poista kaikki kohdat, joissa kirjoitetaan windows rekisteriin!

varoitus: normaalisti tuo tekee muutokset käynnistettäessä, ja kumoaa tekemänsä muutokset ohjelmaa lopetettaessa.

Jos joudut lopettamaan debugatessa "tapa ohjelma" toiminnolla (tai Delphin Ctrl-F2), niin rekisteri saattaa jäädä muutettuun tilaan.

Tuo useragent -käsittely siis on tehty TEmbeddedWB -komponentissa kirjoittamalla windows rekisteriin ylimääräisiä, jotka muuuttavat MS-IE:n (sekä itsenäisen ohjelman että ActiveX -version) käytöstä.

voit tutkia asiaa vaikkapa ennen/jälkeen testillä vaikkapa ShieldsUp -sivustolla ( http://www.grc.com )

Äänestä
  • Olipa pitkä ja perusteellinen vastaus. Kiitos paljon! Onnistuin avaamaan selaimen ShellExecute-komennolla. MediaPlayeria en ole viel kokeilut... vielä kysyttävää, mutta teen sen uudella avauksella.

    Äänestä

  • mikä sulla on yh-äitejä vastaan?

    Äänestä

  • --dee-- kirjoitti:

    Olipa pitkä ja perusteellinen vastaus. Kiitos paljon! Onnistuin avaamaan selaimen ShellExecute-komennolla. MediaPlayeria en ole viel kokeilut... vielä kysyttävää, mutta teen sen uudella avauksella.

    Ratkaisu: AccessViolation

    Jos importoitu TMsMediaPlayer aiheuttaa AccessViolation -ilmoituksia formille pudotettuna, ratkaisu löytyy tältä... en muistanut, että olen joskus aikoja sitten jo postannut tänne ratkaisun tähänkin ongelmaan...

    katsopa allaolevasta linkistä:

    http://keskustelu.suomi24.fi/show.fcgi?category=108&conference=652&posting=22000000001757002#22000000001757002

    Äänestä

Kommentoi aloitusta


--d-- kirjoitti:

avaaminen. Miten onnistuisi tehdä ohjelma, joka avaa esim. MediaPlayerin soittamaan jotain teittyä kappaletta, tai selaimen avaamaan jonkun tietyn osoitteen? Olisiko esimerkkejä vaikkapa Pascalille, C :lle tai Windowsin skriptiin?

Kysyvä ei tieltä eksy.

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