Avatar billede Slettet bruger
28. februar 2010 - 02:45 Der er 18 kommentarer og
1 løsning

Klassen er ikke registreret (Undtagelse fra HRESULT: 0x80040154 (REGDB_E_CLASSNOTREG))

Hej, jeg sider her og programmere i VB 2008 Express Edition.

Jeg er igang med at lave en chat hvor jeg følger en guide på youtube. Og jeg har følget guiden fra punkt til prik. Og det skal siges i videoen som jeg ser, får han også de fejl som jeg får men han kan så åbne hans program og bruge det og det kan jeg ikke. men jeg kan lige nævne de fejl jeg får.

Der hvor jeg marker "" om et ord. er der hvor jeg får fejlen.

Form1
----
Private Sub Sock_DataArrival(ByVal sender As Object, ByVal e As AxMSWinsockLib.DMSWinsockControlEvents_DataArrivalEvent) Handles Sock.DataArrival
        Dim o As Object
        Dim received As String
        Dim character As Byte

        Sock.GetData("o")
        For Each character In o

        Next

        TXTreceive.Text = String.Concat(TXTreceive.Text, vbNewLine, "received")

Form2

Private Sub Sock_DataArrival(ByVal sender As Object, ByVal e As AxMSWinsockLib.DMSWinsockControlEvents_DataArrivalEvent) Handles Sock.DataArrival
        Dim o As Object
        Dim received As String
        Dim character As Byte

        Sock.GetData("o")

        received = String.Concat(received, Chr(character))


        TXTreceive.Text = String.Concat(TXTreceive.Text, vbNewLine, "received")


Når jeg prøver programmet får jeg denne besked.

Klassen er ikke registreret (Undtagelse fra HRESULT: 0x80040154 (REGDB_E_CLASSNOTREG))

Jeg har søgt en del på nettet, og kan ikke finde noget som rigtig virker.


Håber i forstår mig :)
Avatar billede arne_v Ekspert
28. februar 2010 - 03:02 #1
Hvilken linie giver den fejl ?
Avatar billede arne_v Ekspert
28. februar 2010 - 03:03 #2
Men i.s.f. at bruge tid på at løse det problem vil jeg anbefale dig at skifte fra COM til .NET for din socket brug.

Det er nemmere, bedre dokumenteret og med langt bedre fejlmeddelser !!
Avatar billede Slettet bruger
28. februar 2010 - 03:04 #3
Form1
Line 39 & 44

Form2
Line 27 & 29
Avatar billede Slettet bruger
28. februar 2010 - 03:05 #4
men hvis i skal have hele kodningen, så kan jeg da smide det ind?
Avatar billede arne_v Ekspert
28. februar 2010 - 03:08 #5
Bare lige den relevante kode med angivelse af hvilke linier det er.
Avatar billede arne_v Ekspert
28. februar 2010 - 03:08 #6
Eller måske skulle du bare fortælle hvad du har brug for så vi kan finde en ren .NET for det samme.
Avatar billede Slettet bruger
28. februar 2010 - 03:11 #7
Jeg har smidt de styks ind hvor der er fejl på og markert teksten med "" som den brokker sig over.

Men for en sikkerheds skyld så smider jeg lige hele koden ind.


Fejlene er på line 39 & 44


Public Class Form1

    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        Sock.Close()

        Sock.LocalPort = 2909
        Sock.Listen()
        ListBox1.Items.Add("Server Is Listening...")
        Form2.Show()
    End Sub



    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
        Try
            Sock.SendData("Server : " & TXTsend.Text)
        Catch ex As Exception
            ListBox1.Items.Add("Sending Failed")
        End Try

        TXTreceive.Text = String.Concat(TXTreceive.Text, vbNewLine, TXTsend.Text)
        TXTsend.Text = Nothing
    End Sub

    Private Sub Sock_ConnectionRequest(ByVal sender As Object, ByVal e As AxMSWinsockLib.DMSWinsockControlEvents_ConnectionRequestEvent) Handles Sock.ConnectionRequest
        Sock.Close()
        ListBox1.Items.Add("Incomming Request...")
        Sock.Accept(e.requestID)
        Sock.SendData("Connected!")
        ListBox1.Items.Add("Connected!")
    End Sub


    Private Sub Sock_DataArrival(ByVal sender As Object, ByVal e As AxMSWinsockLib.DMSWinsockControlEvents_DataArrivalEvent) Handles Sock.DataArrival
        Dim o As Object
        Dim received As String
        Dim character As Byte

        Sock.GetData(o)
        For Each character In o

        Next

        TXTreceive.Text = String.Concat(TXTreceive.Text, vbNewLine, received)
    End Sub
End Class
Avatar billede Slettet bruger
28. februar 2010 - 03:18 #8
#2 Du skriver at jeg skal skifte fra COM til .NET Nu er jeg ikke den store inde for programmering, men skal jeg så hente en ny udgave eller anden udgave ned af Visual basics eller hvordan?
Avatar billede arne_v Ekspert
28. februar 2010 - 03:27 #9
Slet ikke.

Samme sprog og samme IDE.

Men i.s.f. AxMSWinsockLib så klasserne i System.Net namespacet !
Avatar billede Slettet bruger
28. februar 2010 - 03:28 #10
Noget jeg skal ænder i koden eller?
Avatar billede arne_v Ekspert
28. februar 2010 - 03:31 #11
Ja.
Avatar billede arne_v Ekspert
28. februar 2010 - 03:32 #12
Lad mig se om jeg kan bixe et eksempel.
Avatar billede Slettet bruger
28. februar 2010 - 03:32 #13
Ok, så må jeg se om jeg kan finde de steder jeg skal ænder :)
Avatar billede Slettet bruger
28. februar 2010 - 03:34 #14
#12 tak :)
Avatar billede arne_v Ekspert
28. februar 2010 - 18:58 #15
Jeg antager at du er ved at lave noget chat ligende. Det er ikke helt klart for mig om det er direkte mellem to apps eller N apps forubundet til en server.

Den nemmeste løsning er at skifte paradigme fra event driven til at have en tråd per socket forbindelse.

Men det kan også laves event driven i .NET.
Avatar billede arne_v Ekspert
28. februar 2010 - 18:59 #16
En tråd løsning:

Imports System
Imports System.Collections.Generic
Imports System.IO
Imports System.Net
Imports System.Net.Sockets
Imports System.Threading

Public Class ChatMain
    Public Shared Sub Main(args As String())
        Dim srv As New Server()
        srv.Run()
    End Sub
End Class

Public Class Server
    Private allclients As List(Of ClientHandler)
    Public Sub Run()
        allclients = New List(Of ClientHandler)()
        Dim server As New TcpListener(IPAddress.Any, 50000)
        server.Start()
        While True
            Dim client As TcpClient = server.AcceptTcpClient()
            Dim ch As New ClientHandler(client, Me)
            allclients.Add(ch)
            Dim t As Thread = New Thread(AddressOf ch.Run)
            t.Start()
        End While
    End Sub
    Public Sub SendAll(msg As String)
        For Each ch As ClientHandler In allclients
            ch.Send(msg)
        Next
    End Sub
    Public Sub SendOne(msg As String, address As String)
        For Each ch As ClientHandler In allclients
            If ch.Remote.IndexOf(address) = 0 Then
                ch.Send(msg)
            End If
        Next
    End Sub
    Public Sub Remove(ch As ClientHandler)
        allclients.Remove(ch)
    End Sub
End Class

Public Class ClientHandler
    Private m_remote As String
    Private rdr As StreamReader
    Private wrt As StreamWriter
    Private srv As Server
    Public Sub New(cli As TcpClient, srv As Server)
        m_remote = cli.Client.RemoteEndPoint.ToString()
        rdr = New StreamReader(cli.GetStream())
        wrt = New StreamWriter(cli.GetStream())
        Me.srv = srv
    End Sub
    Public Sub Run()
        While True
            Dim line As String = rdr.ReadLine()
            Dim parts As String() = line.Split(" ".ToCharArray())
            Dim cmd As String = parts(0)
            If cmd = "SEND" Then
                Dim address As String = parts(1)
                If address = "*" Then
                    srv.SendAll(line.Substring(cmd.Length + address.Length + 2))
                Else
                    srv.SendOne(line.Substring(cmd.Length + address.Length + 2), address)
                End If
            ElseIf cmd = "EXIT" Then
                srv.Remove(Me)
                Return
            End If
        End While
    End Sub
    Public Sub Send(msg As String)
        SyncLock wrt
            wrt.WriteLine(msg)
            wrt.Flush()
        End SyncLock
    End Sub
    Public ReadOnly Property Remote() As String
        Get
            Return m_remote
        End Get
    End Property
End Class
Avatar billede arne_v Ekspert
28. februar 2010 - 19:00 #17
En event driven løsning:

Imports System
Imports System.Collections.Generic
Imports System.Net
Imports System.Net.Sockets
Imports System.Threading

Namespace E
    Public Class AClient
        Private cli As Socket
        Private buf As Byte()
        Private buflen As Integer
        Public Sub New(cli As Socket, srv As AServer)
            Console.WriteLine("Connection open from " & Convert.ToString(cli.RemoteEndPoint))
            Me.cli = cli
            buf = New Byte(10239) {}
            buflen = 0
            cli.BeginReceive(buf, buflen, buf.Length - buflen, SocketFlags.None, New AsyncCallback(AddressOf GotData), srv)
        End Sub
        Public Sub GotData(res As IAsyncResult)
            Dim n As Integer = cli.EndReceive(res)
            Console.WriteLine("Read " & n & " bytes from " & Convert.ToString(cli.RemoteEndPoint))
            If n > 0 Then
                buflen += n
                Dim lf As Integer = Array.IndexOf(buf, CByte(AscW(ControlChars.Lf)), 0, buflen)
                If lf >= 0 Then
                    lf += 1
                    DirectCast(res.AsyncState, AServer).SendAll(buf, lf, Me)
                    If buflen > lf Then
                        Array.Copy(buf, lf, buf, 0, buflen - lf)
                    End If
                    buflen -= lf
                End If
                cli.BeginReceive(buf, buflen, buf.Length - buflen, SocketFlags.None, New AsyncCallback(AddressOf GotData), DirectCast(res.AsyncState, AServer))
            Else
                Console.WriteLine("Connection closed from " & Convert.ToString(cli.RemoteEndPoint))
                DirectCast(res.AsyncState, AServer).Remove(Me)
            End If
        End Sub
        Public Sub Send(buf As Byte(), buflen As Integer)
            Console.WriteLine("Write " & buflen & " bytes to " & Convert.ToString(cli.RemoteEndPoint))
            cli.Send(buf, buflen, SocketFlags.None)
        End Sub
    End Class
    Public Class AServer
        Private cli As List(Of AClient)
        Private srv As Socket
        Public Sub New(port As Integer)
            cli = New List(Of AClient)()
            srv = New Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp)
            srv.Bind(New IPEndPoint(IPAddress.Any, port))
            srv.Listen(10)
            srv.BeginAccept(New AsyncCallback(AddressOf GotConnection), srv)
        End Sub
        Public Sub GotConnection(res As IAsyncResult)
            cli.Add(New AClient(srv.EndAccept(res), Me))
            srv.BeginAccept(New AsyncCallback(AddressOf GotConnection), srv)
        End Sub
        Public Sub Remove(acli As AClient)
            cli.Remove(acli)
        End Sub
        Public Sub SendAll(buf As Byte(), buflen As Integer, sender As AClient)
            Console.WriteLine("Write " & buflen & " bytes to all")
            For Each acli As AClient In cli
                If sender IsNot acli Then
                    acli.Send(buf, buflen)
                End If
            Next
        End Sub
        Public Sub Close()
            srv.Close()
        End Sub
    End Class
    Public Class Program
        Public Shared Sub Main(args As String())
            Dim server As New AServer(1234)
            Console.ReadKey()
            server.Close()
        End Sub
    End Class
End Namespace
Avatar billede arne_v Ekspert
28. februar 2010 - 19:01 #18
Begge viser en server som kan håndtere mange klienter.

Men koden i en klient er næsten den samme, bare lidt simplere.

Bemærk at den event driven kode mangler lidt synkronisering for at være thread safe.
Avatar billede arne_v Ekspert
26. april 2010 - 03:46 #19
all set ?
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester