Forum: PC-Programmierung Von statischer C# Funktion auf Objekt zugreifen


von Peter (Gast)


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

von Dirk K. (merciless)


Lesenswert?

Eine Idee wäre, Application.OpenForms aufzurufen
und in der Sammlung von Forms deine herauszusuchen.

merciless

von bluppdidupp (Gast)


Lesenswert?

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

von Peter (Gast)


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

von N. M. (mani)


Lesenswert?

Was sagt denn die Exception genau?
Und wo tritt sie genau auf? Zeile?

Der Klassiker ist ja aus einem nicht GUI Thread auf die Elemente 
zuzugreifen.

: Bearbeitet durch User
von Peter (Gast)


Lesenswert?

N. M. schrieb:
> Was sagt denn die Exception genau?
> Der Klassiker ist ja aus einem nicht GUI Thread auf die Elemente
> zuzugreifen.

Ausnahme ausgelöst: "System.InvalidOperationException" in 
System.Windows.Forms.dll

von Peter (Gast)


Lesenswert?

1
form.listBox.Items.Insert(0, "Text");

und dort tritt sie auf.

von Peter (Gast)


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

von Peter (Gast)


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

von Dirk K. (merciless)


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

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.