Hi zusammen!
Habe mal den Workshop in VB.Net umgesetzt
http://www.vbarchiv.net/workshop/workshop35.php
jetzt hab ich nur leider das problem das die Nachrichten entweder nur einmal oder garnicht "vernpnftig übersetzt werden. D.h. es funktioniert alles einwandfrei bis ich mit
RC = ReadFileSimple(SlotHandle, TextPuffer, TextPuffer.Length + 1, BytesRead, 0) den TextPuffer vollschreiben möchte. Da behält er nämlich dann einfach die vorher geschriebenen "0"-en drin und überschreibt sie nicht.
Ausserdem bekomm ich, wenn ich mehr als eine Nachricht sende, am Ende die Meldung bzw Exception dass ich in geschützen Speicher schreiben will.
Hab ich so umgangen, vielleicht auch nich so gut, aber einfach im Timer folgendes eingefügt :
If MsgCount > 0 Then
' Wenn ja, Funktion zum Lesen und anzeigen
MsgText = MailSlotRead(BufferSize)
txt_RecMsg.Text = MsgText
'Postfach löschen
CloseHandle(SlotHandle)
'Und wieder neu erstellen
cmd_RecMsg.PerformClick()
End If Also ich denke es liegt wahrscheinlich an der umsetzung der Aufrufe in der API, ich poste die hier mal, vielleicht hat mal jemand zeit das zu prüfen :
Friend Declare Function CreateFile Lib "kernel32" Alias "CreateFileA" ( _
ByVal lpFileName As String, _
ByVal dwDesiredAccess As Int32, ByVal dwShareMode As Int32, _
ByRef lpSecurityAttributes As SECURITY_ATTRIBUTES, ByVal _
dwCreationDisposition As Int32, _
ByVal dwFlagsAndAttributes As Int32, ByVal hTemplateFile As Int32) _
As Int32
Friend Declare Function CreateFileNoSecurity Lib "kernel32" Alias _
"CreateFileA" ( _
ByVal lpFileName As String, ByVal dwDesiredAccess As Int32, ByVal _
dwShareMode As Int32, _
ByVal Zero As Int32, ByVal dwCreationDisposition As Int32, ByVal _
dwFlagsAndAttributes As Int32, _
ByVal hTemplateFile As Int32) As Int32
Friend Declare Function WriteFileSimple Lib "kernel32" Alias "WriteFile" ( _
ByVal hFile As Int32, _
ByRef lpBuffer As String, ByVal nNumberOfBytesToWrite As Int32, _
ByRef lpNumberOfBytesWritten As Int32, ByVal Zero As Int32) As Int32
' Server API's
Friend Declare Function ReadFileSimple Lib "kernel32" Alias "ReadFile" ( _
ByVal hFile As Int32, _
ByRef lpBuffer As String, ByVal nNumberOfBytesToRead As Int32, _
ByRef lpNumberOfBytesRead As Int32, ByVal Zero As Int32) As Int32
Friend Declare Function CreateMailslot Lib "kernel32" Alias _
"CreateMailslotA" ( _
ByVal lpName As String, ByVal nMaxMessageSize As Int32, ByVal _
lReadTimeout As Int32, _
ByRef lpSecurityAttributes As SECURITY_ATTRIBUTES) As Int32
Friend Declare Function GetMailslotInfo Lib "kernel32" (ByVal hMailslot As _
Int32, _
ByRef lpMaxMessageSize As Int32, ByRef lpNextSize As Int32, ByRef _
lpMessageCount As Int32, _
ByRef lpReadTimeout As Int32) As Int32
Friend Declare Function CloseHandle Lib "kernel32" (ByVal hObject As Int32) _
As Int32 vielleicht findet ja auch der Autor von dem Workshop zeit sich das anzusehen.
Wenn mehr code gebraucht wird, bitte bescheid sagen.
Gruß
Sebastian |