Zavolání již spuštěného programu.   zodpovězená otázka

VB.NET

Dobrý den,

zajímalo by mě jak detekovat volání v již spuštěném programu.

Tzn.:

1) Spustím program A.exe. Ten běží pouze v jedné instanci.

2) Zavolám program "A.exe parms".

Potřebuji, aby spuštěný program detekoval, že ho něco volá, převzal parametry a reagoval.

Předem díky za případné odpovědi.

PetrS

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Dobrý den,

při spuštění programu zjistíte, zda již jedna instance běží. Pokud ano, předáte ji pomocí meziprocesové (IPC) komunikace parametry a spuštěná instance tak dokáže na spuštění nové instance reagovat. Obvykle se nově spuštěná instance ihned ukončí, takže vše budí dojem, že na spuštění reaguje pouze již spuštěná instance.

IPC znamená http://cs.wikipedia.org/wiki/Meziproceso...

Ke komunikace využijete IpcChannel třídu http://msdn.microsoft.com/en-us/library/...

Návod jak to skutečně použít naleznete například tady http://www.codeguru.com/csharp/csharp/cs...

Zjistit jestli aplikace už běží lze pomocí systémového zámku Mutex:

Dim prvniInstance As Boolean
Dim mutex = new Mutex(false, "nejakeUnikatniJmeno", <System.Runtime.InteropServices.Out>prvniInstance)

Pozor: Unikátní jméno volte opravdu unikátní, tyto zámky jsou sdílené a určitě nebudete rád, když vám bude kolidovat s jiným programem.

nahlásit spamnahlásit spam 4 / 4 odpovědětodpovědět

Dobrý den,

nedalo by se, místo IPC, použít událost StartupNextInstance v ApplicationEvents?

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Podle dokumentace ano, v tomto případě to bude asi opravdu zcela dostačující a jednoduší. Ale funguje to jen u klasických formulářových aplikací (ne u knihoven / konzolových aplikací / služeb)

nahlásit spamnahlásit spam 1 / 1 odpovědětodpovědět

Díky za odpověď

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Dobrý den,

tak zkouším StartupNextInstance, ale vůbec nevím jak to použít.

1) zavolám program s argumenty přes příkazový řádek a nechám ho běžet.

2) zavolám program s argumenty znovu a zjistím v druhé instanci, zda program náhodou už neběží. Zjistím že běží, tak chci zřejmě vyvolat event StartupNextInstance v první již spuštěné applikaci, předat jí parametry a druhou instanci zavřít.

Jak vyvolám event první instance?

Kde mám definovat Sub Me_StartupNextInstance?

Nebyl by nějaký malilinkatý příkládek?

Díky moc,

PetrS

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Následující věci platí pro Windows Forms aplikaci se zapnutým application frameworkem:

1) Ve vlastnostech projektu na kartě Application zaškrtněte volbu Make single instance application.

2) Zobrazte zdrojový kód událostí aplikace (View Application Events) a přidejte událostní proceduru pro událost StartupNextInstance.

V této událostní proceduře máte v parametru "e" k dispozici vlastnost CommandLine, což jsou parametry předané aplikaci.

Celá věc funguje tak, že druhá instance aplikace se nespustí a událost StartupNextInstance nastane v první instanci aplikace.

nahlásit spamnahlásit spam -2 / 2 odpovědětodpovědět

Dobrý den,

nyní nemám možnost to vyzkoušet, každopádně používám zdejší Snippet ke zjištění zda už jedna instance běží. Je možné to samé udělat i bez zapínání Make single instance application?

Díky moc!

PetrS

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Pokud jste to psal pomocí tohoto

http://www.vbnet.cz/snippet--25-zajisten...

tak musíte vymyslet nějaký komunikační mechanismus mezi procesy což nemusí být jednoduché. Použil bych nejspíš pojmenované kanály (System.IO.Pipes).

nahlásit spamnahlásit spam -2 / 2 odpovědětodpovědět

Ano ano, tohle přesně jsem použil. Myslím ale, že si asi nebudu zbytečně přidělávat práci, zase to zruším a zatrhnu checkbox. :)

Díky za pomoc,

PetrS

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Každopádně vám nic nebrání zkombinovat obě metody pokud potřebujete ten Mutex například pro Inno Setup. Hlavně nezapomenout ten Mutex uvolnit při ukončení aplikace. K detekci spuštěné instance použijete StartupNextInstance a k vytvoření Mutexu výše uvedený snippet.

nahlásit spamnahlásit spam 1 / 1 odpovědětodpovědět

Dobrý den,

prostuduju a aplikuju.

Moc díky za pomoc,

PetrS

nahlásit spamnahlásit spam 0 odpovědětodpovědět
                       
Nadpis:
Antispam: Komu se občas házejí perly?
Příspěvek bude publikován pod identitou   anonym.
  • Administrátoři si vyhrazují právo komentáře upravovat či mazat bez udání důvodu.
    Mazány budou zejména komentáře obsahující vulgarity nebo porušující pravidla publikování.
  • Pokud nejste zaregistrováni, Vaše IP adresa bude zveřejněna. Pokud s tímto nesouhlasíte, příspěvek neodesílejte.

přihlásit pomocí externího účtu

přihlásit pomocí jména a hesla

Uživatel:
Heslo:

zapomenuté heslo

 

založit nový uživatelský účet

zaregistrujte se

 
zavřít

Nahlásit spam

Opravdu chcete tento příspěvek nahlásit pro porušování pravidel fóra?

Nahlásit Zrušit

Chyba

zavřít

feedback