Kirjautuminen

Haku

Tehtävät

Keskustelu: Ohjelmointikysymykset: VB.NET: Ohjelmien välinen tiedonsiirto

latesoft [05.03.2008 11:45:27]

#

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ä?

neau33 [05.03.2008 15:31:29]

#

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

latesoft [05.03.2008 16:30:35]

#

Kiitos selkeästä ohjeesta! Täytyy tutustua WMI:hin ja kokeilla esimerkkiäsi.

Vastaus

Aihe on jo aika vanha, joten et voi enää vastata siihen.

Tietoa sivustosta