Von statischer C# Funktion auf Objekt zugreifen

Gast #6369546
Lesenswert?

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 #6370019
Lesenswert?

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
Lesenswert?

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
Lesenswert?

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
Lesenswert?

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

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren