Bei Callback auslesen kommt nix raus

  • VB.NET

Es gibt 16 Antworten in diesem Thema. Der letzte Beitrag () ist von zulu23.

    Bei Callback auslesen kommt nix raus

    Hallo zusammen

    Ich würde gerne mit Hilfe einer Lib ein Callback auslesen, nur leider funktioniert es irgendwie nicht, bzw. bekomme ich keine werte zurück.
    Bei der Variable "backas" die als "punkDeviceFinderCallback as Object" definiert ist kommt nichts zurück.
    Mit dem counter bekomme ich aber die Anzahlteilnehmer zurück, das würde ja eigentlich bedeuten das er Teilnehmer finden sollte....

    VB.NET-Quellcode

    1. Public Class Form34
    2. Dim cUDN As String
    3. Dim oFindDevice As UPNPLib.UPnPDeviceFinder
    4. Dim myDevice As UPNPLib.IUPnPDevices
    5. Dim oDevice As UPNPLib.UPnPDevice
    6. Dim vIn(0) As Object
    7. Dim vOut(0) As Object
    8. Dim sValue As Integer
    9. Dim iRet As Integer
    10. Dim findData As Integer
    11. Private Sub Button2_Click(sender As System.Object, e As System.EventArgs) Handles Button2.Click
    12. 'suche beenden
    13. oFindDevice.CancelAsyncFind(findData)
    14. End Sub
    15. Private Sub Button1_Click(sender As System.Object, e As System.EventArgs) Handles Button1.Click
    16. Dim backas(2) As Object
    17. cUDN = TextBox1.Text
    18. oFindDevice = New UPNPLib.UPnPDeviceFinder
    19. 'asynchrone suche kreiren
    20. findData = oFindDevice.CreateAsyncFind("upnp:rootdevice", 0, backas)
    21. 'suche starten
    22. oFindDevice.StartAsyncFind(findData)
    23. 'callback auslesen
    24. Label1.Text = backas(0)
    25. Label2.Text = backas(1)
    26. Label3.Text = backas(2)
    27. Label4.Text = findData
    28. End Sub
    29. Private Sub Button4_Click(sender As System.Object, e As System.EventArgs) Handles Button4.Click
    30. oFindDevice = New UPNPLib.UPnPDeviceFinder
    31. 'alle teilnehmeranzahl auslesen
    32. myDevice = oFindDevice.FindByType("upnp:rootdevice", 0)
    33. Label5.Text = myDevice.Count
    34. End Class


    Muss ich den Callback mit irgend etwas speziellem auselesen oder wie sollte das funktionieren? Wäre um jede Hilfe dankbar...

    Gruss

    zulu23
    Hast Du möglicherweise eine falsche Vorstellung von CallBack?
    Du kannst da nix auslesen.
    Du übergibst einer BlackBox einen wohldefinierten Funktionspointer auf eine bei / von Dir zu implementierende Funktion.
    Die BlackBox ruft bei Bedarf diesen Funktionspointer auf und meldet sich so bei Dir in dieser Funktion und teilt Dir damit etwas mit, sozusagen ein Event.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    indemfall irgendwie schon....
    aber es sollte irgendwie so gehen...hab ein Codebeispiel bei msdn.microsoft.com in VBS gefunden und der sieht wie folgt aus

    VB.NET-Quellcode

    1. Sub DeviceFinderCallback (device, UDN, calltype)
    2. select case calltype
    3. Case 0
    4. output = "Found: " & vbCrLf
    5. output = output & "DisplayName: " & device.FriendlyName & vbCrLf
    6. output = output & "Type: " & device.Type & vbCrLf
    7. output = output & "UDN: " & device.UniqueDeviceName & vbCrLf
    8. MsgBox output
    9. Case 1
    10. MsgBox "device removed: " & UDN
    11. Case 2
    12. MsgBox "search complete"
    13. end select
    14. End Sub
    15. Dim devicefinder
    16. Dim findData
    17. Set devicefinder = CreateObject("UPnP.UPnPDeviceFinder")
    18. Sub StartFind()
    19. findData = devicefinder.CreateAsyncFind("upnp:rootdevice", 0, _
    20. GetRef("DeviceFinderCallback"))
    21. devicefinder.StartAsyncFind(findData)
    22. End Sub
    23. Sub StopFind()
    24. deviceFinder.CancelAsyncFind(findData)
    25. End Sub


    ...aber das mit "GetRef("DeviceFinderCallback")" funktioniert ja nicht in VB. wie kann ich den das in VB richtig initialisieren?




    GetRef("DeviceFinderCallback")
    Probier mal

    VB.NET-Quellcode

    1. AddressOf DeviceFinderCallback
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Poste bitte mal den Code in der Umgebung, wo das deklariert ist:
    punkDeviceFinderCallback as Object.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Bis jetzt ist noch nicht viel dabei beim Code, ich versuche bis jetzt mit dem Code nur Info's der UPnP-Geräte mit hilfe der UPnPLib.dll aus zulesen. Also bis jetzt sieht das ganz erst so aus, ich hab noch was versucht mit einer Funktion aber das geht irgendwie auch icht, es kommt der Fehler:
    "Für den Parameter "calltype" von "Public Sub DeviceFinderCallback(device As Object, UDN As Object, calltype As Object)" wurde kein Argument angegeben"


    VB.NET-Quellcode

    1. Public Class Form34
    2. Dim oFindDevice As UPNPLib.UPnPDeviceFinder
    3. Dim myDevice As UPNPLib.IUPnPDevices
    4. Dim oDevice As UPNPLib.UPnPDevice
    5. Dim findData As Integer
    6. Public Sub DeviceFinderCallback(ByVal device As Object, ByVal UDN As Object, ByVal calltype As Object)
    7. Select Case calltype
    8. Case 0
    9. Label8.Text = "Found: "
    10. Label8.Text = Label8.Text & "DisplayName: " & device.FriendlyName
    11. Label8.Text = Label8.Text & "Type: " & device.Type
    12. Label8.Text = Label8.Text & "UDN: " & device.UniqueDeviceName
    13. MsgBox(Label8.Text)
    14. Case 1
    15. MsgBox("device removed: " & UDN)
    16. Label9.Text = "dd"
    17. Case 2
    18. MsgBox("search complete")
    19. Label9.Text = "dd"
    20. End Select
    21. End Sub
    22. Private Sub Button2_Click(sender As System.Object, e As System.EventArgs) Handles Button2.Click
    23. 'suche beenden
    24. oFindDevice.CancelAsyncFind(findData)
    25. End Sub
    26. Private Sub Button1_Click(sender As System.Object, e As System.EventArgs) Handles Button1.Click
    27. oFindDevice = New UPNPLib.UPnPDeviceFinder
    28. 'asynchrone suche kreiren
    29. findData = oFindDevice.CreateAsyncFind("upnp:rootdevice", 0, DeviceFinderCallback)
    30. 'suche starten
    31. oFindDevice.StartAsyncFind(findData)
    32. Label4.Text = findData
    33. End Sub
    34. Private Sub Button4_Click(sender As System.Object, e As System.EventArgs) Handles Button4.Click
    35. oFindDevice = New UPNPLib.UPnPDeviceFinder
    36. 'alle teilnehmeranzahl auslesen
    37. myDevice = oFindDevice.FindByType("upnp:rootdevice", 0)
    38. Label5.Text = myDevice.Count
    39. End Sub
    40. End Class


    Was bräuchtest den Du noch für Info's?

    Gruss und Danke für die Hilfe

    zulu23
    Mit der Zeile

    VB.NET-Quellcode

    1. findData = oFindDevice.CreateAsyncFind("upnp:rootdevice", 0, DeviceFinderCallback)

    übergibst Du Deine CallBack-Funktion an di eDLL.
    Was sagt denn die DLL-Beschreibung, wie diese Funktion deklariert werden soll?
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Soweit ich das finden konnte unter

    HTML-Quellcode

    1. http://msdn.microsoft.com/en-us/library/aa450674.aspx
    müsste sie so deklariert sein:

    The callback function must be declared with three parameters, and uses the values specified for each parameter:


    • param1 is the IUPnPDevice object of the new device; it is only valid when param3 is 0.
    • param2 is the unique device name (UDN) of the found or removed device; it is only valid when param3 is 0 or 1.
    • param3 is the type of callback. Valid values are:
      0 – indicates a new device.


      1 – indicates a device has been removed.


      2 – indicates that all devices currently on the network have been
      reported. The asynchronous search will continue until it is canceled
      and will report any device that appears on the network at a later time.

    das würde ich gerne mit dem "DeviceFinderCallback" machen...aber nimmt mir die ganze nicht an
    Da steht doch, dass Du es dfalsch gemacht hast.
    Der will kein Object als Parametertyp haben.
    Mir scheint es folgerndermaßen zu sein:
    Der 1. Parameter ist ein IUPnPDevice,
    der 2. Parameter ist ein String
    der 3. Parameter ist ein Integer.
    Ich bin mir jedoch nicht sicher.
    Probier es aus.
    Und gib Deinem Projekt Option Strict On.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Ich kann die drei Parameter schon so deklarieren:

    VB.NET-Quellcode

    1. Private Sub DeviceFinderCallback(device As UPNPLib.IUPnPDevice, UDN As String, calltype As Integer)

    aber an der Fehlermeldung ändert sich leider nix's.
    Für den Parameter "device" von "Private Sub DeviceFinderCallback(device
    As UPNPLib.IUPnPDevice, UDN As String, calltype As Integer)" wurde kein
    Argument angegeben.
    Für den Parameter "calltype" von "Private Sub DeviceFinderCallback(device As UPNPLib.IUPnPDevice, UDN As String, calltype As Integer)" wurde kein Argument angegeben.
    Für den Parameter "UDN" von "Private Sub DeviceFinderCallback(device As UPNPLib.IUPnPDevice, UDN As String, calltype As Integer)" wurde kein Argument angegeben.
    muss ich denn, deb drei Paramtern ein Wert geben das einer zurück kommt? Oder wie könnte das mit den Argumenten gemeint sein?
    Kann ich nicht sagen. Probier mal bla As IntPtr,
    kommentiere aber zunächst den Inhalt der Funktion aus, bis die Parameter stimmen.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    so nun habe ich die Funktion nochmals etwas angepasst...jetzt bekomme ich vom "calltype" 0 zurück...aber wenn er dann in case0 geht kommt folgende Fehlermeldung: System.NullReferenceException wurde nicht behandelt. "Der Objektverweis wurde nicht auf eine Objektinstanz festgelegt."

    VB.NET-Quellcode

    1. Public Class Form34
    2. Dim oFindDevice As UPNPLib.UPnPDeviceFinder
    3. Dim myDevice As UPNPLib.UPnPDevices
    4. Dim oDevice As UPNPLib.UPnPDevice
    5. Dim findData As Integer
    6. Dim a As Object
    7. Dim b As Object
    8. Dim c As Object
    9. Function DeviceFinderCallback(ByVal device As UPNPLib.IUPnPDevice, ByVal UDN As String, ByVal calltype As Integer) As IntPtr
    10. Label8.Text = calltype
    11. 'wenn calltype = 0 dann neues Gerät gefunden
    12. Select Case calltype
    13. Case 0
    14. Label8.Text = "Found: "
    15. Label8.Text = Label8.Text & "DisplayName: " & device.FriendlyName
    16. Label8.Text = Label8.Text & "Type: " & device.Type
    17. Label8.Text = Label8.Text & "UDN: " & device.UniqueDeviceName
    18. MsgBox(Label8.Text)
    19. 'wenn calltype = 1 dann wurde ein Gerät entfernt
    20. Case 1
    21. MsgBox("device removed: " & UDN)
    22. 'wenn calltype = 2 dann alle geräte gefunden, sucht bis "CancelAsyncFind" aufgerufen wird
    23. Case 2
    24. MsgBox("search complete")
    25. End Select
    26. End Function
    27. Private Sub Button2_Click(sender As System.Object, e As System.EventArgs) Handles Button2.Click
    28. 'suche beenden
    29. oFindDevice.CancelAsyncFind(findData)
    30. End Sub
    31. Private Sub Button1_Click(sender As System.Object, e As System.EventArgs) Handles Button1.Click
    32. Dim backas(2) As Object
    33. oFindDevice = New UPNPLib.UPnPDeviceFinder
    34. 'asynchrone suche kreiren
    35. findData = oFindDevice.CreateAsyncFind("upnp:rootdevice", 0, DeviceFinderCallback(a, b, c))
    36. 'suche starten
    37. oFindDevice.StartAsyncFind(findData)
    38. 'callback auslesen
    39. Label8.Text = findData
    40. End Sub
    41. Private Sub Button4_Click(sender As System.Object, e As System.EventArgs) Handles Button4.Click
    42. oFindDevice = New UPNPLib.UPnPDeviceFinder
    43. 'alle teilnehmeranzahl auslesen
    44. myDevice = oFindDevice.FindByType("upnp:rootdevice", 0)
    45. Label9.Text = myDevice.Count
    46. 'einzelner teilnehmer auslesen
    47. oDevice = myDevice.Item("uuid:RINCON_000E585456C201400")
    48. Label10.Text = oDevice.FriendlyName
    49. End Sub


    irgendwie sehe ich da leider kein Licht am Tunnel...hab so vieles probiert und nichts geht ;(
    Ich hoffe vielleicht kannst mir noch weiterhelfen...

    Gruss
    Ich meinte

    VB.NET-Quellcode

    1. ByVal device As IntPtr
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!

    VB.NET-Quellcode

    1. Imports System.Runtime.InteropServices
    2. Sub xxx(ByVal ReadBuffer As IntPtr)
    3. ' so musst Du die Struktur nachbilden, die da ankommen soll.
    4. Dim i1 As Integer = Marshal.ReadInt32(ReadBuffer, 0)
    5. Dim i2 As Integer = Marshal.ReadInt32(ReadBuffer, 4)
    6. Dim b1 As Byte = Marshal.ReadByte(ReadBuffer, 8)
    7. Dim i3 As Integer = Marshal.ReadInt32(ReadBuffer, 9)
    8. End Sub
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Hallo RodFromGermany,

    Danke für deine geduldige Hilfe, habs dieses Weekend nochmals versucht aber ich bin leider auf keinen grünen Zweig gekommen.

    Ich hab nochmals ein anderes Beispiele gefunden in VBScript, aber das in VB.net zum laufen bringen will bei mir nicht wirklich klappen..daher versuche ich es auf eine andere Variante zuschaffen meine UPnP Teilnehmer ausfindig zu machen....

    Gruss

    zulu23