Toon posts:

[VB.NET] ipc remoting

Pagina: 1
Acties:

Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Weet iemand hoe je een return waarde van een functie via ipc van een windows service kan doorsturen naar een winform? De service heeft SYSTEM rechten maar de winform bijna geen. Momenteel krijg ik volgende foutmelding. Failed to connect to an IPC Port: Access is denied.

Acties:
  • 0 Henk 'm!

  • beany
  • Registratie: Juni 2001
  • Laatst online: 25-09 21:17

beany

Meeheheheheh

Ik ben niet helemaal zeker wat je bedoelt of wat je precies aan het doen bent, maar loop je niet eerder tegen het probleem aan dat alles via ipc via een eigen thread loopt en dat je vanuit die thread dus niet rechtstreeks een form kan benaderen omdat die in zijn eigen (main) thread draait? Je zult dan met invoke aan de slag moeten gaan.

Dagelijkse stats bronnen: https://x.com/GeneralStaffUA en https://www.facebook.com/GeneralStaff.ua


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
In de service doe ik het volgende:

Dim chan As New IpcChannel("Server")
ChannelServices.RegisterChannel(chan, False)
RemotingConfiguration.RegisterWellKnownServiceType(GetType(SSEService.Execute), "RemotingServer", WellKnownObjectMode.Singleton)

En in het winform probeer ik de meegegeven object te openen:

RemotingConfiguration.RegisterWellKnownClientType(GetType(SSEService.Execute), "ipc://Server/RemotingServer")

Dim rs As New SSEService.Execute
MessageBox.Show(rs.executeWmiForSms())

Acties:
  • 0 Henk 'm!

  • Niemand_Anders
  • Registratie: Juli 2006
  • Laatst online: 09-07-2024

Niemand_Anders

Dat was ik niet..

Misschien is het handig als je een port opneemt voor de verbinding?

Zowel de server als client channel communiceren over een port. Ik raad je heel erg aan nog eens rustig de MSDN erbij te pakken en dan vooral eens goed naar het voorbeeld te kijken..

Zoek eens op IpcChannel.
The IpcClientChannel class uses the Windows interprocess communication (IPC) system to transport messages between application domains on the same computer. When communicating between application domains on the same computer, the IPC channel is much faster than the TCP or HTTP channels.
Ofwel 'Server' dient in jouw geval Localhost te zijn, anders zul je een TCP of HTTP channel moeten gebruiken.

[ Voor 42% gewijzigd door Niemand_Anders op 24-11-2008 13:57 ]

If it isn't broken, fix it until it is..


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Wanneer ik server verander naar localhost geeft hij nog altijd "access denied"

Acties:
  • 0 Henk 'm!

  • Niemand_Anders
  • Registratie: Juli 2006
  • Laatst online: 09-07-2024

Niemand_Anders

Dat was ik niet..

En je hebt zeer goed naar het voorbeeld van de MSDN documentatie (http://msdn.microsoft.com...nnels.ipc.ipcchannel.aspx) gekeken? Neem anders eens letterlijke (copy & paste) de declaratie over..

Laat ik het op een andere manier vragen: Op welke poort heb je de service draaien?

Tip: Ga anders eerst met de TcpChannel aan de slag (is meer documentatie over). Daarna kun je TcpChannel vervangen door IpcChannel. Beide type channels werken op dezelfde manier, alleen de manier van communiceren tussen client en server is anders.

If it isn't broken, fix it until it is..


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
in de service doe ik het volgende

Visual Basic .NET: serv
1
2
3
4
5
6
7
8
9
10
11
12
13
14
System.Runtime.Remoting.RemotingServices.Marshal(Me, m_UniqueIdentifier)
        Dim tcp_properties As IDictionary = New Hashtable(2)
        tcp_properties("bindTo") = "127.0.0.1"
        tcp_properties("port") = 0
        m_TCPChannel = New System.Runtime.Remoting.Channels.Tcp.TcpChannel(tcp_properties, Nothing, Nothing)
        System.Runtime.Remoting.Channels.ChannelServices.RegisterChannel(m_TCPChannel, False)
        'My.Computer.Registry.SetValue(RootKeyNse, "NSE Service", m_TCPChannel.GetUrlsForUri(m_UniqueIdentifier)(0))
        If IO.Directory.Exists("c:\program files\nextmobile\nse\channel2.txt") Then
            IO.Directory.Delete("c:\program files\nextmobile\nse\channel2.txt")
        End If
        Dim objReader As System.IO.StreamWriter
        objReader = New IO.StreamWriter("c:\program files\nextmobile\nse\channel2.txt")
        objReader.Write(m_TCPChannel.GetUrlsForUri(m_UniqueIdentifier)(0))
        objReader.Close()


En in de from load doe ik dit:

Visual Basic .NET: form
1
2
3
4
5
6
7
8
9
10
11
12
13
14
Dim strContents As String
        Dim objReader As IO.StreamReader
        objReader = New IO.StreamReader("c:\program files\nextmobile\nse\channel2.txt")
        strContents = objReader.ReadToEnd
        objReader.Close()

        Dim mySMSObj As SSEService.Execute = CType(System.Runtime.Remoting.RemotingServices.Connect(GetType(SSEService.Execute), strContents), SSEService.Execute)
        'Dim mySMSObj As SSEService.Execute = CType(System.Runtime.Remoting.RemotingServices.Connect(GetType(SSEService.Execute), strContents), SSEService.Execute)
        'Dim smsitem As System.Collections.DictionaryBase
        Dim smsitem As String

        smsitem = mySMSObj.executeWmiForSms

        Label1.Text = smsitem.ToString()


Nu geeft hij de volgende foutmelding: "Attempted to call a method declared on type 'SSEService.Execute' on an object which exposes 'SSEService.Service1'

Acties:
  • 0 Henk 'm!

  • whoami
  • Registratie: December 2000
  • Laatst online: 26-09 17:09
Gebruik eens code-tags om code te posten, dat leest al wat makkelijker.

https://fgheysels.github.io/


Acties:
  • 0 Henk 'm!

  • Niemand_Anders
  • Registratie: Juli 2006
  • Laatst online: 09-07-2024

Niemand_Anders

Dat was ik niet..

Ik moet eerlijk zeggen dat dit wel een heel rare manier is om een remote object te configureren. Normaal doe ik eigenlijk niet heel erg veel meer dan 'TcpChannel client = new TcpChannel("localhost:9000");'.

En weet wat nou zo grappig is, als je client vervangt door server heb je de declaratie voor de server. Dat had je kunnen weten als je zoals ik tot twee keer toe heb aangegeven het MSDN voorbeeld had gevolg. Daar staat in het voorbeeld letterlijk wat je moet doen.

In je tweede reactie was je er zo dicht bij. Het enigste wat je hoefde te doen was IpcChannel("Server") te veranderen in IpcChannel("Server:9000") zodat de server weet aan welke poort het moet binden en de client aan welke poort het moet connecten. Vandaar ook de tip om eens met de TcpChannel te spelen..

Oh en voor de duidelijkheid. Om remoting werkend te krijgen en te houden is het verstandig dat je minimaal drie projecten in je solution hebt, namelijk een client project, een server (service) project en een 'interface' project welke de class bevat welke zowel de client als de server nodig hebben. Zowel de client- als de server hebben vervolgens een referentie naar dit project. Dit zorgt er namelijk voor dat beide naar dezelfde versie van de class wijzen.

Als je de beschikking hebt over .NET framework 3.x raad ik je ten stelligste aan om eens te kijken naar de WCF oplossingen. Daarmee is veel meer mogelijk en je kunt later eenvoudig de configuratie veranderen.

If it isn't broken, fix it until it is..

Pagina: 1