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 IfKiitos selkeästä ohjeesta! Täytyy tutustua WMI:hin ja kokeilla esimerkkiäsi.
Aihe on jo aika vanha, joten et voi enää vastata siihen.