| |
VB.NET - Ein- und UmsteigerDatenaustausch - NamedPipes - Multithreading - Datatable | | | Autor: Bazi | Datum: 26.05.15 21:53 |
| Hallo,
ich möchte zwischen zwei Programmen die auf 2 Rechnern im gleichen Netzwerk laufen Daten austauschen.
Von einem möchte ich Abfragen / Befehle an das andere senden. Das soll dann den Inhalt von Variablen und/oder Datatables zurückschicken.
Bislang habe ich das über Textdatei und Timer gemacht, nun möchte ich das auf NamedPipes umstellen.
Hierüber habe ich jetzt einiges gelesen, mit NamedPipes ein wenig experimentiert.
Dabei habe ich dann gemerkt dass ich auf die Steuerelemente im Formular (Hauptthread) nicht direkt zugreifen kann. Delegate ...
Ist das bei Datatables, Variablen und Propertys auch so?
Ich habe testweise über eine Textbox eine String-Variable gefüllt, auf die konnte ich vom StreamWriter aus nicht zugreifen. Der Objektverweis war Nothing.
Mein angedachter Weg:
auf Prog1 läuft ein NamedPipeServer, auf Prog2 der Client. Mit Prog2 möchte ich Prog1 abfragen / steuern.
Je nach Anfrage soll Prog1 Daten oder Variablen in einen String packen und zurückschicken.
Dann soll in Prog1 dieser String ausgewertet werden und ein DGV oder Labels gefüllt oder eine Meldung angezeigt werden.
Das wird in der derzeitig implementierten Lösung über Textbox über eine Property gemacht.
Kann ich die auch direkt über die NamedPipe füllen, oder gibt es auch dafür Delegaten?
Gruß Christian
Danke für die Hilfe
Gruß Christian | |
Re: Datenaustausch - NamedPipes - Multithreading - Datatable | | | Autor: Blackbox | Datum: 26.05.15 22:12 |
| Hallo,
Stichwort: Marshalling? Nichts gefunden? | |
Re: Datenaustausch - NamedPipes - Multithreading - Datatable | | | Autor: Manfred X | Datum: 27.05.15 06:13 |
| Hallo!
Was genau Du vorhast, ist nicht klar. Kommunikation zwischen Threads, Programmen, Rechnern ...?
Im Prinzip sollte die Interprozess-Kommunikation durch binär-Serialisierbare Klassen
zu erledigen sein. Hier ein simples Beispiel für die Übertragung einer Datatable
zwischen zwei Threads per NamedPipes.
Zugriffe auf Controls von ausserhalb des UI-Thread erfordern ein Invoke (Delegat).
Imports System.Runtime.Serialization.Formatters.Binary
Imports System.IO.Pipes
Imports System.Threading
Imports System.ComponentModel
Public Class frmPipe
Dim dgv As New DataGridView With {.Parent = Me}
Delegate Sub Tabledelegate(ByVal dt As DataTable)
Private Sub frmPipe_Load(sender As System.Object, _
e As System.EventArgs) Handles MyBase.Load
'NamedPipe-Threads starten
Dim st As New Thread(AddressOf serverthread)
st.Start()
Dim ct As New Thread(AddressOf clientthread)
ct.Start()
End Sub
Private Sub serverthread()
'Testdaten erstellen
Dim dt As New DataTable
With dt
.Columns.Add("SP1")
.Columns.Add("SP2")
.Columns.Add("SP3")
.Rows.Add("11", "12", "13")
.Rows.Add("21", "22", "23")
.Rows.Add("31", "32", "33")
End With
'Übertragung der Datatable
'Serialisierung der Datatable in einen Memorystream
Dim bf As New BinaryFormatter
Dim ms As New IO.MemoryStream
bf.Serialize(ms, dt)
Dim bl As Integer = ms.ToArray.Length 'Byte-Länge notieren
'zu sendende Bytelänge in Bytearray wandeln
Dim blb As Byte() = BitConverter.GetBytes(bl)
'NamedPipe für das Senden der Tabelle erstellen
Dim server As New NamedPipeServerStream("PipeTable")
server.WaitForConnection()
'Byte-Arrays übertragen (senden)
server.Write(blb, 0, blb.Length) 'Länge
server.Write(ms.ToArray, 0, bl) 'Datatable-Serialisierung
End Sub
Private Sub clientthread()
'NamedPipe für den Datenempfang
Dim client As New NamedPipeClientStream("PipeTable")
client.Connect()
'Byte-Länge lesen
Dim blb(4) As Byte
client.Read(blb, 0, 4)
Dim bl As Integer = BitConverter.ToInt32(blb, 0)
'Array für die empfangenen Daten
Dim buffer(bl) As Byte
client.Read(buffer, 0, bl) 'Datatable-Serialisierung lesen
'Deserialisieren des Byte-Array
Dim msc As New IO.MemoryStream(buffer)
Dim bfc As New BinaryFormatter
Dim dtc As DataTable = _
CType(bfc.Deserialize(msc, Nothing), DataTable)
'Anzeige der erhaltenen Datatable-Daten im Grid
Me.Invoke(New Tabledelegate(AddressOf showtable), dtc)
End Sub
Private Sub showtable(ByVal dt As DataTable)
dgv.DataSource = Nothing
dgv.DataSource = dt
End Sub
End Class
Beitrag wurde zuletzt am 27.05.15 um 06:21:47 editiert. | |
Ergänzender Hinweis | | | Autor: Manfred X | Datum: 27.05.15 08:21 |
| Falls alle zu übertragenden Datenfelder in einer serialisierbaren
Datenklasse zusammengefaßt werden, kann man eine Instanz dieser Klasse
direkt in den PipeStream Serialisieren (Senden) bzw. aus ihm Deserialisieren (Empfangen).
Das Zusammenbauen eines Byte-Array aus den einzelnen Elementen entfällt.
| |
Re: Datenaustausch - NamedPipes - Multithreading - Datatable | | | Autor: Bazi | Datum: 27.05.15 10:27 |
| Danke,
das Beispiel trifft meine Anforderung ziemlich genau.
Wie kann ich beim empfangenen Stream erkennen was da kommt? Ob jetzt nur der Inhalt einer Variablen (String, ggf. über mehrere Zeilen) oder eine verpackte DataTable?
Je nachdem wäre eine andere Prozedur zu starten.
Bislang hatte ich die DataTable in einen String gepackt uns später wieder zusammengebastelt, so ist es aber viel besser.
Gruß Christian
Danke für die Hilfe
Gruß Christian | |
Re: Datenaustausch - NamedPipes - Multithreading - Datatable | | | Autor: Manfred X | Datum: 27.05.15 13:37 |
| Du könntest eine serialisierbare Klasse erstellen,
die alle insgesamt benötigten Member/Properties enthält (Strings, Datatables usw.)
und zusätzlich eine Kennung (Enumeration) einfügen, aus der hervorgeht,
welche Art von Inhalt (= Welche der Properties der Klasse) bei der aktuell
übergebenen Instanz relevant ist ( = Daten enthalten).
Auf diese Weise kannst Du alle Austauschvorgänge mit einer
Pipe und je einer Routine in der Client-/Server-Anwendung regeln.
Auch die Programm-Wartung ist wegen der gemeinsamen "Transfer-Klasse"
relativ einfach.
Einfache Tranferklasse:
Public Enum TransferTyp
[String]
Number
Table
End Enum
<Serializable()> _
Public Class TransferDaten
Public Property Typ As TransferTyp 'Kennung
Public Property AString As String 'Properties für diverse Übergaben
Public Property BNumber As Decimal
Public Property CTable As DataTable
End Class Pipe-Routinen:
Private Sub server_thread()
'Testdaten erstellen
Dim dt As New DataTable
With dt
.Columns.Add("SP1")
.Columns.Add("SP2")
.Columns.Add("SP3")
.Rows.Add("11", "12", "13")
.Rows.Add("21", "22", "23")
.Rows.Add("31", "32", "33")
End With
Dim tc As New TransferDaten
'Transferklasse füllen
tc.CTable = dt
tc.Typ = TransferTyp.Table
'Direkte Serialisierung der Datatable in der
'Transferklasse in die Pipe
Dim bf As New BinaryFormatter
Dim server As New NamedPipeServerStream("PipeTransfer")
server.WaitForConnection()
bf.Serialize(server, tc)
server.Close()
End Sub
Private Sub Client_Thread()
'NamedPipe für den Datenempfang
Dim client As New NamedPipeClientStream("PipeTransfer")
client.Connect()
'Direkte Deserialisierung der empfangenen TC-Instanz
Dim bfc As New BinaryFormatter
Dim tc As TransferDaten = CType(bfc.Deserialize(client), TransferDaten)
client.Close()
'Hier Fallunterscheidung gemäß Übergabetyp vornehmen
If tc.Typ = TransferTyp.Table Then
'Anzeige der erhaltenen Datatable-Daten im Grid
Me.Invoke(New Tabledelegate(AddressOf showtable), tc.CTable)
else
'.....
End If
End Sub
Beitrag wurde zuletzt am 27.05.15 um 13:41:30 editiert. | |
Re: Datenaustausch - NamedPipes - Multithreading - Datatable | | | Autor: Bazi | Datum: 27.05.15 14:30 |
| Danke
Sieht super aus.
Werde es heute Abend einbauen.
Gruß Christian
Danke für die Hilfe
Gruß Christian | |
Re: Datenaustausch - NamedPipes - Multithreading - Datatable | | | Autor: Bazi | Datum: 06.06.15 22:03 |
| So, habe es eingebaut.
Laufe beim Client in nen Fehler beim Datenempfang.
SerializationException wurde nicht behandelt
Die Assembly "TestServer, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null" kann nicht gefunden werden.
Derzeit bin ich noch mit beiden Programmen auf dem gleichen Rechner. Habe allerdings beim Client für den PipeNamen anstatt dem führenden "." den Rechnernamen eingesetzt. Das dürfte es aber doch nicht ausmachen.
Bin grade ratlos.
Danke für die Hilfe
Gruß Christian | |
Re: Datenaustausch - NamedPipes - Multithreading - Datatable | | | Autor: Kuno60 | Datum: 07.06.15 01:28 |
| Hallo,
binär serialisierte Daten können nur in die gleiche Assembly wieder geladen werden.
Der Assemblyname, Typen und Namespacebereiche, müssen überein stimmen.
Das gilt auch für die Serialisierung über ein Netzwerk.
Also wenn du für den Server und für den Client verschiedene Programme verwendest, solltest du die Netzwerkübertragung mit der Serialisierung, in einer Klassenbibliothek (DLL) unterbringen und diese in beiden Programmen verwenden (Verweis hinzufügen).
| |
Re: Datenaustausch - NamedPipes - Multithreading - Datatable | | | Autor: Bazi | Datum: 07.06.15 09:10 |
| Danke für die Info.
Ich habe mich noch nihct mit dem Erstellen von Anwendungserweiterungen befasst. Dann werde ich mir das anschauen.
Danke für die Hilfe
Gruß Christian | |
Re: Datenaustausch - NamedPipes - Multithreading - Datatable | | | Autor: Bazi | Datum: 07.06.15 14:57 |
| irgendwo hab ich was falsch gemacht.
Ich bekomme noch immer den gleichen Fehler:
SerializationException wurde nicht behandelt
Die Assembly "TestServer, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null" kann nicht gefunden werden.
Die gesamte Pipe samt TransferDaten habe ich in eine dll ausgelagert. Diese binde ich in beide Projekte ein.
Die Sub für den Server sieht so aus:
<System.Runtime.InteropServices.ComVisible(True)> _
Public Sub Serverstart()
Using PipeServer As New _
NamedPipeServerStream(PipeName, PipeDirection.InOut, _
maxNumberOfServerinstances, PipeTransmissionMode.Message, _
PipeOptions.Asynchronous)
ZeileAnzeigen("Server: --> warte auf Client..." & " PipeName = " _
& PipeName)
PipeServer.WaitForConnection()
ZeileAnzeigen("Server: --> verbunden")
PipeOn = True
While PipeOn
Try
If Not PipeServer.IsConnected Then Serverstart()
Using sr As New StreamReader(PipeServer), sw As New _
StreamWriter(PipeServer)
sw.AutoFlush = True
Dim temp As String = String.Empty
tcOut = Nothing
While (assign(temp, sr.ReadLine())) IsNot Nothing
ServerInput = temp
If ServerInput.Length > 0 Then RaiseEvent _
PropertyChanged(Me, ServerRequest)
If Not tcOut Is Nothing Then
Dim bf As New BinaryFormatter
bf.Serialize(PipeServer, tcOut)
End If
End While
ZeileAnzeigen("Server: --> Daten")
End Using
'End If
Catch ex As Exception
' kam Fehler bei beenden Client vor Server -->
' unterbrochene Pipe
ZeileAnzeigen("Server Fehler: --> " & _
ex.InnerException.ToString)
End Try
End While
ZeileAnzeigen("Server: --> beende")
End Using
PipeOn = False
End Sub und für den Client:
<System.Runtime.InteropServices.ComVisible(True)> _
Public Sub ClientStart(ByVal AnfrageString As String)
Using PipeClient As New NamedPipeClientStream(ServerName, PipeName, _
PipeDirection.InOut, PipeOptions.None, _
Security.Principal.TokenImpersonationLevel.Impersonation)
ZeileAnzeigen("Client: --> warte auf Server..." & "PipeName = " _
& String.Concat(ServerName, ",", PipeName))
PipeClient.Connect()
startTimer()
PipeOn = True
ZeileAnzeigen("Client: --> verbunden")
sw = New StreamWriter(PipeClient)
sw.AutoFlush = True
sw.WriteLine(AnfrageString)
ZeileAnzeigen("Client Anfrage: --> " & AnfrageString)
If Not PipeOn Then PipeClient.Close()
'Direkte Deserialisierung der empfangenen TC-Instanz
Dim bfc As New BinaryFormatter
Dim tc As TransferDaten = CType(bfc.Deserialize(PipeClient), _
TransferDaten)
If Not tc Is Nothing Then ClientInput = tc : RaiseEvent _
PropertyChanged(Me, ClientRequest) : TimeOut.Dispose()
PipeClient.Close()
ZeileAnzeigen("Client: --> beendet")
End Using
End Sub zum Fehler kommt es in der Zeile:
Dim tc As TransferDaten = CType(bfc.Deserialize(PipeClient),TransferDaten)
Die Transferdaten werden in der dll zusammengestellt:
Private tcOut As TransferDaten
Public TransferTyp As TransferTyp
Public TransferDataTable As DataTable
Public TransferString As String
Public TransferNumber As Decimal
Public TransferCount As Integer
Public Sub createTransferdata()
Try
tcOut = New TransferDaten
With tcOut
.Typ = TransferTyp
If Not String.IsNullOrEmpty(TransferString) Then .TString = _
TransferString
Select Case TransferTyp
Case NamedPipe.TransferTyp.Count
.TCount = TransferCount
Case NamedPipe.TransferTyp.Table
.CTable = TransferDataTable
Case NamedPipe.TransferTyp.Decimal
.TNumber = TransferNumber
End Select
End With
Catch ex As Exception
tcOut = Nothing
End Try
End Sub
Danke für die Hilfe
Gruß Christian | |
Re: Datenaustausch - NamedPipes - Multithreading - Datatable | | | Autor: Manfred X | Datum: 07.06.15 15:24 |
| Vermutlich fehlt der korrekte Projekt-Verweis auf die Bibliothek,
die die Tranferklasse enthält.
Heißt diese Bibliothek tatsächlich "Testserver"????
Nur der Code der Transferklasse gehört zwingend in die DLL
(siehe mein Beispiel).
Du hast anscheinend keine entsprechende Klasse erstellt.
Vermutlich so oder ähnlich ...
<Serializable> _
Public Class tcOut As TransferDaten
Public TransferTyp As TransferTyp
Public TransferDataTable As DataTable
Public TransferString As String
Public TransferNumber As Decimal
Public TransferCount As Integer
End Class Die Pipe, die Instanzen der Transferklasse und die
(De-)Serialisierungsmethoden sind vermutlich jeweils
spezifisch in den Anwendungsprogrammen zu erstellen.
Beitrag wurde zuletzt am 07.06.15 um 15:34:51 editiert. | |
Re: Datenaustausch - NamedPipes - Multithreading - Datatable | | | Autor: Bazi | Datum: 07.06.15 15:53 |
| hm, in der dll habe ich unter anderem diese Klasse:
Public Enum TransferTyp
[String]
Count
[Decimal]
Table
End Enum
<Serializable()> _
Public Class TransferDaten
Dim _Typ As TransferTyp
Public Property Typ() As TransferTyp 'Kennung
Get
Return _Typ
End Get
Set(ByVal value As TransferTyp)
_Typ = value
End Set
End Property
Dim _String As String
Public Property TString() As String 'Properties für diverse Übergaben
Get
Return _String
End Get
Set(ByVal value As String)
_String = value
End Set
End Property
Dim _Number As Decimal
Public Property TNumber() As Decimal
Get
Return _Number
End Get
Set(ByVal value As Decimal)
_Number = value
End Set
End Property
Dim _Count As Integer
Public Property TCount() As Integer
Get
Return _Count
End Get
Set(ByVal value As Integer)
_Count = value
End Set
End Property
Dim _DTable As DataTable
Public Property CTable() As DataTable
Get
Return _DTable
End Get
Set(ByVal value As DataTable)
_DTable = value
End Set
End Property
End Class und der Transfer wird mit dem oben gepostetem Code erstellt.
Testserver ist der Name der Anwendung, die den Server einbindet.
in der dll habe ich:
Klasse für die Pipe (Pipe.vb)
Klasse für den Transfer (TransferDaten.vb
Form zur Auswahl des Serverrechners für den Client
Modul für allgemeine Berechnungen
in den beiden Projekten wo ich die dll einbinde habe ich den Verweis gesetzt und die "alten" Klassen für Pipes und Transfer auf Buildvorgang = keine gesetzt. Die dürten eigentlich nicht mehr reinpfuschen.
Danke für die Hilfe
Gruß Christian | |
Re: Datenaustausch - NamedPipes - Multithreading - Datatable | | | Autor: Manfred X | Datum: 07.06.15 18:37 |
| Hallo!
Schreibe im Code bei den Variablen-Deklaration nich nur "As TransferDaten",
sondern verwende die volle Qualifikation (Bibliothek, Namespace, Klasse).
Entferne veraltete Klassen aus dem Projekt oder kommentiere deren Klassencode
vor dem Kompilieren aus.
| |
Re: Datenaustausch - NamedPipes - Multithreading - Datatable | | | Autor: Bazi | Datum: 07.06.15 19:46 |
| ich konnte es ein wenig eingrenzen.
Bei Transferdata.Typ = String klappt es, bei DataTable kommt der Fehler.
Kann das was mit dem Typisierten Dataset zu tun haben, das ich beim Programm mit dem Server habe?
habe die createTransferdata nun abgeändert, aber ohne Erfolg:
Public Sub createTransferdata()
'Try
tcOut = New NamedPipe.TransferDaten
With tcOut
.Typ = NamedPipe.TransferTyp
If Not String.IsNullOrEmpty(TransferString) Then .TString = _
TransferString
Select Case .Typ
Case NamedPipe.TransferTyp.Count
.TCount = TransferCount
Case NamedPipe.TransferTyp.Table
.CTable = Nothing
.CTable = New DataTable
.CTable = TransferDataTable.Copy
Case NamedPipe.TransferTyp.Decimal
.TNumber = TransferNumber
End Select
End With
'Catch ex As Exception
'tcOut = Nothing
'End Try
End Sub Danke für die Hilfe
Gruß Christian | |
Re: Datenaustausch - NamedPipes - Multithreading - Datatable | | | Autor: Tommi467 | Datum: 12.06.15 08:43 |
| So etwas bräuchte ich auch gerade
Gibt es nicht eine fertige DLL und ein Demo wie sie aufzurufen ist zur freien Verwendung???
Ich hab noch nie mit DLLs gearbeitet und kenne mich damit wirklich 0 aus.
Das Teil selbst zu erstellen und einzubinden traue ich mir einfach nicht zu .
| |
Re: Datenaustausch - NamedPipes - Multithreading - Datatable | | | Autor: Bazi | Datum: 12.06.15 09:18 |
| fertige dll habe ich noch keine gefunden. Einige Beispiele, auf MS und auch hier im Forum schon.
Danke für die Hilfe
Gruß Christian | |
Re: Datenaustausch - NamedPipes - Multithreading - Datatable | | | Autor: Manfred X | Datum: 12.06.15 10:57 |
| 1. Erstelle ein neues Projekt des Typs Klassenbibliothek.
2. In diesem Projekt codierst Du eine öffentliche Klasse,
die die Properties enthält, über die Du Daten austauschen möchtest.
3. Erstelle das Projekt (DLL)
In den Anwendungsprogrammen, die per Pipe Daten austauschen sollen,
setzt Du jeweils einen Projektverweis: Reiter "Durchsuchen" -- zu Deiner
DLL navigieren und sie bestätigen.
In den Projekten findest Du bei Eingabe von "Imports" am Anfang
einer CodeDatei den Namen Deiner Bibliothek per Intellisense.
Importiere sie und Du kannst Instanzen der dort enthaltenenen Klasse
wie gewöhnlich deklarieren und nutzen.
| |
Re: Datenaustausch - NamedPipes - Multithreading - Datatable | | | Autor: Bazi | Datum: 12.06.15 22:19 |
| So, nun habe ich die 2 Programmteile auf unterschiedlichen Rechnern laufen.
Aber, ich bekomme keine Verbindung vom Client zum Server.
Mein Aufruf im Clientprog sieht so aus:
Private Sub PipeClientStart(ByVal AnfrageString As String)
If ps Is Nothing Then
ps = New NamedPipe.Pipe
RemoveHandler ps.PropertyChanged, AddressOf ServerAnswer
AddHandler ps.PropertyChanged, AddressOf ServerAnswer
RemoveHandler ps.PropertyChanged, AddressOf ClientTimeOut
AddHandler ps.PropertyChanged, AddressOf ClientTimeOut
End If
With ps
If String.IsNullOrEmpty(PipeServerName) Then PipeServerName = _
.ServerName Else .ServerName = PipeServerName
.PipeName = "MyPipeName"
.ClientStart(AnfrageString)
End With
End Sub und in der Klasse der Pipe:
Private _PName As String = "Testpipe"
Public Property PipeName() As String
Get
Return _PName
End Get
Set(ByVal value As String)
_PName = value
End Set
End Property
Private _ServerName As String = String.Empty
Public Property ServerName() As String
Get
If _ServerName = String.Empty Then
Using Pcs As New dlgServerName
Pcs.ShowDialog()
If Pcs.DialogResult = Windows.Forms.DialogResult.OK Then _
_ServerName = If(Pcs.PcName.Trim = String.Concat("\\", _
My.Computer.Name.Trim), ".", Pcs.PcName)
End Using
End If
Return _ServerName
End Get
Set(ByVal value As String)
If value = String.Concat("\\", My.Computer.Name.Trim) Then _
_ServerName = "." Else _ServerName = value
End Set
End Property
<System.Runtime.InteropServices.ComVisible(True)> _
Public Sub ClientStart(ByVal AnfrageString As String)
Using PipeClient As New NamedPipeClientStream(ServerName, PipeName, _
PipeDirection.InOut, PipeOptions.None, _
Security.Principal.TokenImpersonationLevel.Impersonation)
ZeileAnzeigen("Client: --> warte auf Server..." & "PipeName = " _
& String.Concat(ServerName, ",", PipeName))
PipeClient.Connect()
startTimer()
PipeOn = True
ZeileAnzeigen("Client: --> verbunden")
sw = New StreamWriter(PipeClient)
sw.AutoFlush = True
sw.WriteLine(AnfrageString)
ZeileAnzeigen("Client Anfrage: --> " & AnfrageString)
If Not PipeOn Then PipeClient.Close()
'Direkte Deserialisierung der empfangenen TC-Instanz
' Try
Dim bfc As New BinaryFormatter
Dim tc As TransferDaten = CType(bfc.Deserialize(PipeClient), _
NamedPipe.TransferDaten)
If Not tc Is Nothing Then ClientInput = tc : RaiseEvent _
PropertyChanged(Me, ClientRequest) : TimeOut.Dispose()
' Catch ex As Exception
'ZeileAnzeigen("Client Fehler: --> " & If(ex Is Nothing, "",
' ex.InnerException.ToString))
'TimeOut.Dispose()
'End Try
PipeClient.Close()
ZeileAnzeigen("Client: --> beendet")
End Using
End Sub das ZeileAnzeigen brachte mir:
Client: --> warte auf Server...PipeName = \\MICHAEL-PC,MyPipeName
Die beiden Rechner sind im gleichen Netzwerk und ich habe über den Explorer auch Zugriff auf den anderen. Habe ich bei der Angabe des Servernamens was falsch?
Danke für die Hilfe
Gruß Christian | |
Re: Datenaustausch - NamedPipes - Multithreading - Datatable | | | Autor: Bazi | Datum: 14.06.15 14:23 |
| Brauche ich auf dem Serverrechner ein Benutzerkonto für den Anwender des Clientstreams?
Danke für die Hilfe
Gruß Christian | |
Re: Datenaustausch - NamedPipes - Multithreading - Datatable | | | Autor: Bazi | Datum: 24.06.15 21:08 |
| könnt Ihr mir hier bitte noch weiterhelfen, ich packs nicht alleine.
Auf dem gleichen Rechner klappts, auf verschiedenen nicht.
Danke für die Hilfe
Gruß Christian | |
Re: Datenaustausch - NamedPipes - Multithreading - Datatable | | | Autor: Manfred X | Datum: 24.06.15 21:16 |
| Laut Dokumentation sollte es so funktionieren:
[I]If the client and server processes were on separate computers,
"." would be replaced with the network name of the computer
that runs the server process.[/I]
Wie sieht es denn mit den Zugriffsrechten aus?
Beitrag wurde zuletzt am 24.06.15 um 21:19:11 editiert. | |
Re: Datenaustausch - NamedPipes - Multithreading - Datatable | | | Autor: Bazi | Datum: 25.06.15 20:11 |
| über die Zugriffsrechte habe ich mir bislang keine Gedanken gemacht.
Brauche ich da welche?
Beide Programme laufen ohne Administratorrechte, also nur mit den jeweiligen Benutzerrechten.
Den "." im Aufruf habe ich durch den Server-Rechnernamen ersetzt.
Danke für die Hilfe
Gruß Christian | |
Re: Datenaustausch - NamedPipes - Multithreading - Datatable | | | Autor: Manfred X | Datum: 25.06.15 20:14 |
| Wenn bei Server/Client unterschiedliche Benutzer angemeldet sind,
kann das Probleme mit den Zugriffsrechten geben (habe ich gelesen!).
Teste man was geschieht, wenn der User identisch ist.
| |
| Sie sind nicht angemeldet! Um auf diesen Beitrag zu antworten oder neue Beiträge schreiben zu können, müssen Sie sich zunächst anmelden.
Einloggen | Neu registrieren |
|
|
Neu! sevCommand 4.0
Professionelle Schaltflächen im modernen Design!
Mit nur wenigen Mausklicks statten auch Sie Ihre Anwendungen ab sofort mit grafischen Schaltflächen im modernen Look & Feel aus (WinXP, Office, Vista oder auch Windows 8), inkl. große Symbolbibliothek. Weitere InfosTipp des Monats TOP Entwickler-Paket
TOP-Preis!!
Mit der Developer CD erhalten Sie insgesamt 24 Entwickler- komponenten und Windows-DLLs. Die Einzelkomponenten haben einen Gesamtwert von 1605.50 EUR...
Jetzt nur 599,00 EURWeitere Infos
|