Von statischer C# Funktion auf Objekt zugreifen

Gast #6369546
Hallo,

ich habe hier eine statische C# Funktion:
1
static void CallbackHandler(int value);

Diese Funktion wird aus einer C++ DLL aufgerufen und kann deshalb auch 
nicht irgendwie geändert werden.

Das C#-Projekt ist eine Windows-Forms Anwendung mit einer Edit-Box.

Meine Frage lautet: Wie bekomme ich den Wert value aus dem 
CallbackHandler in der Editbox angezeigt ?
Anders gefragt: Wie bekomme ich Zugriff auf den this-Zeiger ?

Danke.

Gruß Peter
Gast #6369664
Referenz auf das relevante Form-Objekt nach Erzeugen der Form in eine 
static-Variable sichern und dann aus der Callback über die 
static-Variable auf die Form zugreifen
Gast #6370019
Dirk K. schrieb:
> Eine Idee wäre, Application.OpenForms aufzurufen
> und in der Sammlung von Forms deine herauszusuchen.

Ich habe das jetzt mal versucht:
1
void CallbackHandler()
2
{
3
  Form1 form = Application.OpenForms["Form1"] as Form1;
4
  form.listBox.Items.Insert(0, "Text");
5
}

Beim ersten Aufruf wird die Funktion ausgeführt und es funktioniert. 
Beim zweiten Aufruf erhalte ich eine System.InvalidOperationException.

Was läuft da schief ?

Danke, Peter
Gast #6370054
Das ist die komplette Fehler-Meldung:
1
list_box = {SelectedItem = {System.InvalidOperationException: Ungültiger threadübergreifender Vorgang: Der Zugriff auf das Steuerelement listBoxRead erfolgte von einem anderen Thread als dem Thread, für den es erstellt wurde.
2
   bei System.Windows.Forms.Control.get_H...

... sobald ich auf das ListBox-Element zugreife ...

Anderer Thread ? Wegen des Aufrufs durch die DLL (ist ja ein Callback 
Handler) ?
Gast #6370106
Es funktioniert jetzt. Danke an Alle!

Da ich kein C# Programmierer bin, hoffe ich, dass man das so machen 
kann:
1
static void CallbackHandler()
2
{
3
    Form1 form = Application.OpenForms["Form1"] as Form1;
4
    form.Invoke((MethodInvoker) delegate
5
    {
6
        form.listBox.Items.Insert(0, "Text");
7
    });
8
}

Peter
#6370131
Peter schrieb:
> Es funktioniert jetzt. Danke an Alle!
>
> Da ich kein C# Programmierer bin, hoffe ich, dass man das so machen
> kann:
>
1
> static void CallbackHandler()
2
> {
3
>     Form1 form = Application.OpenForms["Form1"] as Form1;
4
>     form.Invoke((MethodInvoker) delegate
5
>     {
6
>         form.listBox.Items.Insert(0, "Text");
7
>     });
8
> }
9
>

Denke ja, sollte so fuunktionieren. So richtig
gefallen tut mir die Lösung nicht, aber wenn du
zufrieden bist, ist es ja ok ;)

merciless

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 6 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.