Olen yrittänyt etsiä ratkaisua seuraavaan ongelmaan, johon en löydä oikeita hakusanoja, koska minulla ei ole mitään tietoa kuinka tälläinen tilanne normaalisti hoidetaan Windows käyttöjärjestelmässä:
Minulla on kaksi ohjelmaa, kummatkin veistetty samasta VB.net 3.5 puusta. Ohjelmien täytyisi pystyä lähettämään viestejä keskenään. Koska kummatkin ohjelmat käynnistetään itsenäisesti, ne eivät suoraan ole tietoisia toistensa olemassaolosta eikä toista välttämättä ole olemassa ollenkaan. En siis pysty suoraan kutsumaan funktiota X objektista Y, koska pitäisi ensin selvittää Y. Tällä hetkellä ratkaisun odottaessa käytän tekstitiedostoja viestien välittämiseen, mutta kovo ruksuttaa ikävästi.
Viestit ovat toki tarkasti määriteltyjä ja menevät vaikka String muodossa virtuaalipostina. Ne kuitenkin muodostuvat 3*16-bit numeroista, eli mielellään lähettäisin kokonaisuuden samassa yhteydessä ettei tarvitse sentään ruveta mitään protokollia vääntämään.
Olen yrittänyt katsoa noita API-delegate räpellyksiä, mutta suoraan sanottuna ne menee aikalailla pihalle normaalista VB syntaksista (puhumattakaan siitä että 6.0 ja .Net esimerkit eivät sovi keskenään), enkä mielellään käyttäisi huonosti dokumentoituja menetelmiä kun jonkinasteinen vakaus on toivottavaa.
Täytyyhän näin yksinkertaiseen juttuun olla joku hieman vähemmän assemblyä vaativa keino? Linkkejä tms. vihjeitä?
Heippa latesoft!
tässä tämmöinen 'oldfashion' viritelmä...vääntele itsellesi sopivaksi
toinen mahdollisuus on käyttää WMI:a
(vaati hieman laajenpaa tutustumista, mutta tutustuminen kyllä kannattaa)
Imports System.Diagnostics '... Public Shared prosessit() as Process Public Shared prosessi As Process Public Shared rullaa As Boolean Public Shared progid as Integer 'Public Sub Joku_Tapahtuma(... rullaa = False prosessit = Process.GetProcesses() 'tutkii onko ohjelma käynnissä... For Each prosessi in prosessit With prosessi If .Name.ToLower() = "joku.exe" Then´ progid = .id rullaa = True: Exit For End If End With Next If Not rullaa Then 'jos ei pyöri...käynnistetään With prosessi .FileName = "joku.exe" '(kokopolku jos ei löydy Path-asetuksista) .StartInfo.WindowStyle = _ .ProcessWindowStyle.Maximized .Start() .WaitForInputIdle() progid = .id rullaa = True End With End If Dim jokuStr As String = "12345,67890,9876" 'jne.. AppActivate(progid) SendKeys.Send(jokuStr) AppActivate(Me.Text) '(NamespaceNimi.MainForm.Text) 'vaikka jossain toisessa tapahtumassa... If rullaa Then 'tapetaan... For Each prosessi in prosessit With prosessi If .íd = progid Then .Kill() 'aina jos ikkunaton (toimii aina) '.CloseMainWindow 'jos omaa käyttöliittymän End If End With rullaa = False Next End If
Kiitos selkeästä ohjeesta! Täytyy tutustua WMI:hin ja kokeilla esimerkkiäsi.
Aihe on jo aika vanha, joten et voi enää vastata siihen.