Das ActiveX-Steuerelement kann nicht instanziiert werden.

  • VB.NET

Es gibt 5 Antworten in diesem Thema. Der letzte Beitrag () ist von picoflop.

    Das ActiveX-Steuerelement kann nicht instanziiert werden.

    Hi,
    ich habe ein kleines Problem(chen)
    Und zwar: Ich habe ein Event auf meiner Form erstellt, welches ich aus einem BGW aufrufe.
    In der dem Event zugeordneten Sub starte ich eine andere Form mit einem WMP. Dann bekomme ich folge Fehlermeldung.
    Spoiler anzeigen
    System.InvalidOperationException wurde nicht von Benutzercode behandelt.
    Message=Fehler beim Erstellen des Formulars. Weitere Informationen finden Sie in Exception.InnerException. Fehler: Das ActiveX-Steuerelement 6bf52a52-394a-11d3-b153-00c04f79faa6 kann nicht instanziiert werden, da der aktuelle Thread kein Singlethread-Apartment ist..
    Source=FPH lcarsRadio
    StackTrace:
    bei FPH_lcarsRadio.My.MyProject.MyForms.Create__Instance__[T](T Instance) in 17d14f5c-a337-4978-8281-53493378c1071.vb:Zeile 190.
    bei FPH_lcarsRadio.My.MyProject.MyForms.get_Form1()
    bei FPH_lcarsRadio.Login.Hauptform(Boolean ohneuser, String benutzername) in D:\Dropbox\eigene Programme\lcarsRadio\FPH lcarsRadio\Login.vb:Zeile 95.
    bei FPH_lcarsRadio.Login.bgw_login_DoWork(Object sender, DoWorkEventArgs e) in D:\Dropbox\eigene Programme\lcarsRadio\FPH lcarsRadio\Login.vb:Zeile 71.
    bei System.ComponentModel.BackgroundWorker.OnDoWork(DoWorkEventArgs e)
    bei System.ComponentModel.BackgroundWorker.WorkerThreadStart(Object argument)
    InnerException: System.Threading.ThreadStateException
    Message=Das ActiveX-Steuerelement 6bf52a52-394a-11d3-b153-00c04f79faa6 kann nicht instanziiert werden, da der aktuelle Thread kein Singlethread-Apartment ist.
    Source=System.Windows.Forms
    StackTrace:
    bei System.Windows.Forms.AxHost..ctor(String clsid, Int32 flags)
    bei System.Windows.Forms.AxHost..ctor(String clsid)
    bei AxWMPLib.AxWindowsMediaPlayer..ctor()
    bei FPH_lcarsRadio.Form1.InitializeComponent() in D:\Dropbox\eigene Programme\lcarsRadio\FPH lcarsRadio\Form1.Designer.vb:Zeile 50.
    bei FPH_lcarsRadio.Form1..ctor() in D:\Dropbox\eigene Programme\lcarsRadio\FPH lcarsRadio\Form1.vb:Zeile 10.
    InnerException:

    Code
    Aufrufcode

    VB.NET-Quellcode

    1. Event Start(ByVal ohneuser As Boolean, ByVal benutzername As String)
    2. Private Sub bgw_login_DoWork(sender As System.Object, e As System.ComponentModel.DoWorkEventArgs) Handles bgw_login.DoWork
    3. '[...]
    4. RaiseEvent Start(False, benutzer)
    5. End Sub
    6. Sub Hauptform(ByVal ohneuser As Boolean, ByVal benutzername As String) Handles Me.Start
    7. Form1.Show() 'hier tritt der Fehler auf
    8. Form1.init(ohneuser, benutzername)
    9. Me.Close()
    10. End Sub
    Formstartcode bei Form1:

    VB.NET-Quellcode

    1. Private Sub Form1_Load(sender As System.Object, e As System.EventArgs) Handles MyBase.Load
    2. CheckForIllegalCrossThreadCalls = False
    3. tb_lautstärke.Value = AxWindowsMediaPlayer1.settings.volume()
    4. If My.Computer.FileSystem.FileExists(datei) = False Then
    5. If My.Computer.FileSystem.DirectoryExists(IO.Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData), "lcarsRadio\")) Then
    6. My.Computer.FileSystem.WriteAllBytes(datei, My.Resources.Radio, False)
    7. Else
    8. My.Computer.FileSystem.CreateDirectory(IO.Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData), "lcarsRadio\"))
    9. My.Computer.FileSystem.WriteAllBytes(datei, My.Resources.Radio, False)
    10. End If
    11. Elbow2.Text = "Standardradios geladen - Startsequenz abgeschlossen - Willkommen beim lcarsRadio"
    12. End If
    13. lvladen(datei, lokal)
    14. ListView1.ForeColor = Color.White
    15. ListView1.BackColor = Color.Black
    16. For Each item As ListViewItem In ListView1.Items
    17. item.ForeColor = Color.White
    18. item.BackColor = Color.Black
    19. Next
    20. End Sub

    Ich würde mich über eine Rückmeldung freuen,
    mbfan
    You should live for that what you belive. - Drag-Drop Beschreibung

    VB.NET-Quellcode

    1. CheckForIllegalCrossThreadCalls = False

    KOTZ!

    da der aktuelle Thread kein Singlethread-Apartment ist..

    Eben. Eine Instanz der ActiveX Komponente kann nur in einem STAThread erzeugt werden. Der GUI-Thread ist üblicherweise einer, ein Backgroundthread NICHT.
    Da du CheckForIllegalCrossThreadCalls ausgeschaltet hast, läuft dein Event im falschen Thread und das ganze geht in die Hose.

    Klickst du GUI-Helper in meiner Signatur und liest ALLES KOMPLETT DURCH!
    Hi,
    die Meldung kommt auch, wenn ich davor das CheckForIllegalCrossThreadCalls eingeschaltet habe und den GUIHelper verwende:

    VB.NET-Quellcode

    1. Sub Hauptform(ByVal ohneuser As Boolean, ByVal benutzername As String) Handles Me.Start
    2. CheckForIllegalCrossThreadCalls = True
    3. GUIHelper.InvokeMethod(Form1, "Show")
    4. GUIHelper.InvokeMethod(Form1, "init", ohneuser, benutzername)
    5. Me.Close()
    6. End Sub

    Habe ich das jetzt falsch verstanden?
    Das CheckForIllegalCrossThreadCalls habe ich auch in der Form1 jetzt auf true gesetzt.
    mbfan
    You should live for that what you belive. - Drag-Drop Beschreibung
    Hast du das Anwendungsframework ausgeschaltet?
    Warum verwendest du die Standardinstanz Form1? Und existiert zu diesem Zeitpunkt diese Instanz bereits? Andernfalls würde erst eine Instanz erzeugt werden und wenn das nicht im GUI-Thread erfolgt, gehts halt in die Hose, noch BEVOR überhaupt "Show" aufgerufen wird.

    picoflop schrieb:

    Hast du das Anwendungsframework ausgeschaltet?

    Nein.

    picoflop schrieb:

    Warum verwendest du die Standardinstanz Form1?

    Ich versuche die Form "Form1" aus einem anderen Fenster aufzurufen. Mehr will ich überhaubt nicht. Es macht keinen Unterschied, ob die Form nun Form1 oder Hauptfenster heißt.
    Ich nehme an, dass es mit dem WMP zu tun hat, da das (soweit ich weiß), dass einzige ActiveX-Element auf der Form ist.

    picoflop schrieb:

    Und existiert zu diesem Zeitpunkt diese Instanz bereits? Andernfalls würde erst eine Instanz erzeugt werden und wenn das nicht im GUI-Thread erfolgt, gehts halt in die Hose, noch BEVOR überhaupt "Show" aufgerufen wird.
    Das verstehe ich jetzt nicht. Ich öffne diese Form zu diesem Zeitpunkt zum ersten Mal im Programmablauf.
    mbfan

    EDIT: Habe das letzte Zitat jetzt verstanden und die Hauptform jetzt schon initiiert, bevor ich in den BGW gehe - Und nun funktionierts - Danke für die Hilfe.
    You should live for that what you belive. - Drag-Drop Beschreibung

    mbfan schrieb:

    Das verstehe ich jetzt nicht.

    Eben ;)

    Es gibt eine Klasse. Die heißt "Form1". Wenn du jetzt Form1.Show machst, wird im HINTERGRUND eine INSTANZ dieser Klasse erzeugt, die dummerweise denselben Namen wie die Klasse hat. Das instanzieren erfolgt hier offensichtlich in einem Backgroundthread und deswegen knallt es. Abhilfe: Erzeuge die Instanz VORHER im GUI-Thread (brauchst sie ja nicht per Show zu zeigen) und das Problem sollte verschwinden.