BOOL CALLBACK Funktionen?
-
Auch wenn ich mich als Newbie jetzt total lächerlich mache, aber wie
lege ich eine Funktion "BOOL CALLBACK" an? Ich kann doch im Assistenten
nur den Rückgabetyp etc. mit einem Wert ohne Leerzeichen angeben.Ok, es darf gelacht werden
Aber eine Antwort wäre auch nett.
-
Für ein Beispiel siehe:
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/winui/winui/windowsuserinterface/windowing/timers/usingtimers.asp
(ganz unten)
-
Jochen???? Lies die Frage nochmal durch.
-
Du meinst dass mit dem Assistenten und dem Leerzeichen?
Ich kann doch hier schlecht in gelächter Ausbrechen, oder?
Aber mal im Ernst:
Wenn Du wissen willst was eine Callback ist:
http://www.c-plusplus.net/forum/viewtopic-var-t-is-127060-and-highlight-is-callback.html
-
Hi, das ist also mehr API ja? Evtl verschieben bitte
Wenn ich nun ein CALLBACK zum testen habe z.B. um
EnumWindows zu nutzen. Warum erhalte ich da den
Fehler:Typumwandlung': 'overloaded-function' kann nicht in 'WNDENUMPROC' konvertiert werden
EnumWindows((WNDENUMPROC)ShowAllWindowsjet, Lparam);
Hat das was mit der CALLBACK Funktion zu tun?
BOOL ShowAllWindowsjet(HWND hwnd,LPARAM lParam) {..}
-
Schreib einfach noch das CALLBACK hin, dann wird alles gut (und lass bitte den cast weg!):
BOOL CALLBACK ShowAllWindowsjet(HWND hwnd,LPARAM lParam)
-
Dann erhalte ich:
'EnumWindows': Konvertierung des Parameters 1 von 'BOOL (HWND,LPARAM)' in 'WNDENUMPROC' nicht möglich
-
klassenmethoden als callback geht eh' nicht. höchstens eine statische methode
-
Bei mir geht das Problemlos:
#include <windows.h> #include <tchar.h> #include <stdio.h> BOOL CALLBACK MyCallback(HWND hwnd, LPARAM lParam) { return TRUE; } int _tmain() { EnumWindows(MyCallback, NULL); }
-
Jochen Kalmbach schrieb:
Bei mir geht das Problemlos:
falls du damit auf mein posting eingehst: das ist aber kein class member, sondern eine einfache funktion. sowas geht natürlich immer
-
Klar... ich wollte nicht auf Dein Posting eingehen (da ich hier auch nirgends eine Klasse sehe...)
-
Jochen Kalmbach schrieb:
Klar... ich wollte nicht auf Dein Posting eingehen (da ich hier auch nirgends eine Klasse sehe...)
nicht? der andens hat doch probleme mit dem blöden class wizard von msvc, dass der damit keine callback funktion anlegen kann.
-
Ach so... hast natürlich recht... es geht aber trotzdem mit Klassen... Du musst nur ein "static" davorschreiben und sonst alles beim alten lassen.
Und als Parameter übergibst Du natürlich "this" und dann hast Du auch wieder was Du wolltest:class X { static BOOL CALLBACK MyCallback(HWND hwnd, LPARAM lParam) { X *pX = (X*) lParam; pX->CallWhateverMemberYouWant(); return TRUE; } void DoEnum() { EnumWindows(MyCallback, this); } };
-
Jochen Kalmbach schrieb:
Ach so... hast natürlich recht... es geht aber trotzdem mit Klassen... Du musst nur ein "static" davorschreiben und sonst alles beim alten lassen.
ja, so geht das z.b. und die moral von der geschicht': beim class wizard das häkchen 'static' anklicken (oder entsprechenden listbox-eintrag wählen) und schon funzt es.
-
Ich habe das jetzt auf static gesetzt und kann auch die Fenster
ermitteln.Danke. Nur innerhalb des static-Bereiches kann ich ja
nicht wirklich meine Variablen die ich global angelegt habe verwenden.
Wie kann ich nun mein Ergebnis (den Fensternamen) im restlichen Programmablauf
weiter nutzen?BOOL CALLBACK CenumwinDlg::enumi(HWND hwnd, LPARAM lp) { char pcWinTitle[256]; //CString wert; //eigentlich global angelegt if(!::GetWindow(hwnd, GW_OWNER)) { ::GetWindowText(hwnd, pcWinTitle, 255); wert=pcWinTitle; //jetzt in ListBox anzeigen mit m_LBox.AddString(wert) } return true; }
-
Kannst Du Dir bitte nochmals meinen Beitrag zwei Postings weiter oben anschauen?
-
jaja, manchmal war mickrigsoft gar nicht so blöd, dass sie ihren callback funktionen einen frei verwendbaren parameter spendierten. so als hätten sie's gewusst, dass ihre c-style winapi manchmal in c++ programmen verwendet würde
-
Hm ok, ich rufe jetzt eine Funktion auf, die
den Fensternamen in eine ListBox schreiben soll,
aber genau an der Stelle stürzt das Programm ab.
Eine Ausgabe in eine MessageBox funktioniert hingegen.//aufruf aus der BOOL CenumwinDlg *penumwin = (CenumwinDlg*) lp; penumwin->setzen(wert);//wert enthält als CString den Fensternamen
In der Funktion setzen(CString hasit) gibt es immer einen Absturz.
Egal was ich dort mache.Nur MessageBox(hasit,"enthaltener Wert");
wird richtig ausgeführt.
-
Aus Deinen Code-Schnippseln wird ja niemand schlau (zumindest ich nicht)...
KannsDu bitte mal die gesamte Callback posten?
-
Danke für die Geduld
BOOL CALLBACK CenumwinDlg::enumi(HWND hwnd, LPARAM lp) { char pcWinTitle[256]; CString wert; if(!::GetWindow(hwnd, GW_OWNER)) { ::GetWindowText(hwnd, pcWinTitle, 255); wert=pcWinTitle; CenumwinDlg *penumwin = (CenumwinDlg*) lp; penumwin->setzen(wert); } return true; }