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.
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
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())
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())
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.
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.
Ofwel 'Server' dient in jouw geval Localhost te zijn, anders zul je een TCP of HTTP channel moeten gebruiken.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.
[ Voor 42% gewijzigd door Niemand_Anders op 24-11-2008 13:57 ]
If it isn't broken, fix it until it is..
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.
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..
in de service doe ik het volgende
En in de from load doe ik dit:
Nu geeft hij de volgende foutmelding: "Attempted to call a method declared on type 'SSEService.Execute' on an object which exposes 'SSEService.Service1'
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'
Gebruik eens code-tags om code te posten, dat leest al wat makkelijker.
https://fgheysels.github.io/
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.
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