chefsalat-
Mitglied
Hallo zusammen,
folgendes Szenario:
In einem Dialogfenster sollen beim Initialisieren verschiedene Variablen an einer SPS zum ereignisgesteuerten Lesen angemeldet werden.
Das ganze läuft über Callback-Funktionen. (auf der Konsole gehts ohne Probleme)
Jedes mal, wenn die Variable sich an der SPS geändert hat, soll sie im Dialogfenster aktualisiert werden.
Das Anmelden der Variable an der SPS geht folgendermaßen:
Callback ist die Funktion, die aufgerufen werden soll, wenn sich eine Variable verändert hat. Ich werde für jede Variable eine eigene Funktion machen müssen. Aber hier der Übersichtlichkeit halber nur mal für eine Variable.
---------------------------------------------------------------------------------------------------------------
Jetzt mein Problem:
Wenn ich die Callback-Funktionen zu Member-Funktionen des Dialogfensters mache, bekomme ich folgenden Fehler:
So bekomme ich aber dann Zugriff auf die Edit-Felder, in denen die Variablen aktualisiert werden sollen.
Die entsprechende Header-Datei des Dialogfensters:
Und die cpp-Datei des Dialogfensters:
---------------------------------------------------------------------------------------------------------------
Mache ich die Callback-Funktionen nicht zu Member-Funktionen des Dialogfensters, habe ich keinen Zugriff auf die Edit-Felder und bekomme diese Fehlermeldung:
Die Header-Datei des Dialogfensters:
Die cpp-Datei - also das Dialogfenster:
Der Übersichtlichkeit halber habe ich nur "test" in das Edit-Feld geschrieben.
Zum Schluss noch mein System:
- MS Visual C++ 6.0
- Win XP
- Multithreaded
Kann mir bitte jemand helfen, wie ich zu einem Ergebnis komme, bzw. wo ich einen Fehler gemacht habe?
Danke schon mal im Vorraus.
Gruß chefsalat-
folgendes Szenario:
In einem Dialogfenster sollen beim Initialisieren verschiedene Variablen an einer SPS zum ereignisgesteuerten Lesen angemeldet werden.
Das ganze läuft über Callback-Funktionen. (auf der Konsole gehts ohne Probleme)
Jedes mal, wenn die Variable sich an der SPS geändert hat, soll sie im Dialogfenster aktualisiert werden.
Das Anmelden der Variable an der SPS geht folgendermaßen:
C++:
// Übertragen der SPS-Variablen beginnen
nErr = AdsSyncAddDeviceNotificationReq(pAddr, ADSIGRP_SYM_VALBYHND, ulHdlVar, &adsNotificationAttrib, Callback, hUser, &hNotification);
---------------------------------------------------------------------------------------------------------------
Jetzt mein Problem:
Wenn ich die Callback-Funktionen zu Member-Funktionen des Dialogfensters mache, bekomme ich folgenden Fehler:
C++:
error C2664: 'AdsSyncAddDeviceNotificationReq' : Konvertierung des Parameters 5 von 'void (AmsAddr *,AdsNotificationHeader *,unsigned long)' in 'void (__cdecl *)(AmsAddr *,AdsNotificationHeader *,unsigned long)' nicht moeglich
Keine Funktion mit diesem Namen im Gueltigkeitsbereich stimmt mit dem Zieltyp ueberein
Die entsprechende Header-Datei des Dialogfensters:
C++:
class CTestDlg : public CDialog
{
// Konstruktion
public:
CTestDlg(CWnd* pParent = NULL); // Standard-Konstruktor
void Callback(AmsAddr* pAddr, AdsNotificationHeader* pNotification, ULONG hUser);
...
}
Und die cpp-Datei des Dialogfensters:
C++:
// Callback-Funktion
void CTestDlg::Callback(AmsAddr* pAddr, AdsNotificationHeader* pNotification, ULONG hUser) {
m_edit_lichtschranke.SetWindowText("test");
}
---------------------------------------------------------------------------------------------------------------
Mache ich die Callback-Funktionen nicht zu Member-Funktionen des Dialogfensters, habe ich keinen Zugriff auf die Edit-Felder und bekomme diese Fehlermeldung:
C++:
error C2065: 'm_edit_lichtschranke' : nichtdeklarierter Bezeichner
error C2228: Der linke Teil von '.SetWindowTextA' muss eine Klasse/Struktur/Union sein
Die Header-Datei des Dialogfensters:
C++:
void Callback(AmsAddr* pAddr, AdsNotificationHeader* pNotification, ULONG hUser);
class CTestDlg : public CDialog
{
// Konstruktion
public:
CTestDlg(CWnd* pParent = NULL); // Standard-Konstruktor
...
}
Die cpp-Datei - also das Dialogfenster:
C++:
// Callback-Funktion
void Callback(AmsAddr* pAddr, AdsNotificationHeader* pNotification, ULONG hUser) {
m_edit_lichtschranke.SetWindowText("test");
}
Der Übersichtlichkeit halber habe ich nur "test" in das Edit-Feld geschrieben.
Zum Schluss noch mein System:
- MS Visual C++ 6.0
- Win XP
- Multithreaded
Kann mir bitte jemand helfen, wie ich zu einem Ergebnis komme, bzw. wo ich einen Fehler gemacht habe?
Danke schon mal im Vorraus.
Gruß chefsalat-