CALLBACK Methode in Klasse Kapseln
-
hallo,
ich versuch mir grad für die erstellung einer listview eine klasse zu schreiben. die listview wollte ich subclassen um nachrichten an die listview verarbeiten zu können.
nun weis ich aber nicht, wie ich die CALLBACK Funktion syntaktisch richtig in die Klasse implementieren um diese als static Methode der Klasse benutzen zu können.
hier mal meine deklaration:
private: static LONG_PTR PrevWndProcListView; static LRESULT CALLBACK ListViewProc (HWND, UINT, WPARAM, LPARAM);hier mein definitions "versuch":
LRESULT CALLBACK CListview::ListViewProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) { switch(message) { //nicht relevant } return CallWindowProc ((WNDPROC) PrevWndProcListView, hWnd, message, wParam, lParam); }als fehler gibt er mir "unresolved external symbol aus" ist vermutlich syntaktisch nicht korrekt. klappt as überhaupt so wie ich mir das denke?
was mach ich falsch?
-
joe132 schrieb:
als fehler gibt er mir "unresolved external symbol aus" ist vermutlich syntaktisch nicht korrekt. klappt as überhaupt so wie ich mir das denke?
Für welchen Namen? Ich vermute spontan, er findet deinen LONG_PTR nicht - da brauchst du den Eintrag "LONG_PTR CListview::PrevWndProcListView;" in der CPP-Datei.
-
die deklaration der Funktion als Methode der Klasse ist falsch, daher findet er die in der Klasse deklarierte PrevWndProcListView nicht.
**LRESULT CALLBACK CListview::ListViewProc(**HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
}im schwarzmakierten teil ist vermutlich was syntaktisch falsch. Kann man callbackfunktionen übheraupt als methode einer klasse deklarieren?
-
joe132 schrieb:
im schwarzmakierten teil ist vermutlich was syntaktisch falsch.
Und was? Das sollte eigentlich der Compiler dir mitgeteilt haben.
(mir fallen nur zwei potentielle Fehlerquellen auf - (a) du hast dich beim Klassennamen vertippt (kann ich mit den gegebenen Fragmenten nicht überprüfen) (b) ich bin mir nicht sicher, ob das CALLBACK wirklich bei der Definition nötig ist)Kann man callbackfunktionen übheraupt als methode einer klasse deklarieren?
Als statische Methoden sollte es eigentlich funktionieren.
(btw, bei deinem nächsten Beitrag solltest du nicht nur deinen Code und die dazugehörigen Vermutungen mitliefern, sondern auch die exakten Fehlermeldungen des Compilers/Linkers)
-
meine .h datei
#include "commctrl.h" //comctl32.lib im Projekt hinzufügen! class CListview { public: static LONG_PTR PrevWndProcListView; static LRESULT CALLBACK ListViewProc (HWND, UINT, WPARAM, LPARAM); public: CListview(); ~CListview(void); bool initListView(HWND , unsigned short, HINSTANCE ); /* Initialisierung */ void setStyle(DWORD); /* Listview styles setzen */ void resizeListView(int, int, int, int); /* Groesse des Listview ändern */ int createColumn(int iCol, TCHAR* Text, int iBreite); /* Spaltenerzeugen und Überschrift setzen */ HWND getListviewHandle() {return hListView;} /* Liefert den Handel der Listview */ int create2ColItem(TCHAR *Text1, TCHAR *Text2); /* Listvieweintrag mit 2 Spaltenwerten erzeugen */ private: HWND hListView; INITCOMMONCONTROLSEX inicc; };und hier die funktion deklaration wie es derzeit aussieht.
LRESULT CListview::ListViewProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) { switch(message) { POINT hitPoint; case WM_MOUSEMOVE: TRACKMOUSEEVENT tme; tme.cbSize = sizeof(TRACKMOUSEEVENT); tme.dwFlags = TME_HOVER; tme.dwHoverTime = HOVER_DEFAULT; tme.hwndTrack = hWnd; TrackMouseEvent(&tme); break; case WM_MOUSEHOVER: GetCursorPos(&hitPoint); LVHITTESTINFO pHitInfo; ScreenToClient(hWnd,&hitPoint); pHitInfo.pt = hitPoint; ListView_HitTest(hWnd, &pHitInfo.pt); break; } return CallWindowProc ((WNDPROC) CListview::PrevWndProcListView, hWnd, message, wParam, lParam); }Der Compiler sagt mir das:
Listview.obj : error LNK2001: unresolved external symbol "public: static long CListview::PrevWndProcListView" (?PrevWndProcListView@CListview@@2JA)
C:\Documents and Settings\Souljumper\My Documents\Visual Studio 2005\Projects\KnowledgeBase\Debug\KnowledgeBase.exe : fatal error LNK1120: 1 unresolved externals
-
Vielleicht solltest du dir auch mal ansehen, worüber sich der Compiler/Linker überhaupt beschwert
In der Fehlermeldung geht es überhaupt nicht um deine Callback-Funktion, sondern um die statische LONG_PTR-Variable der Klasse.
Aber darauf hatte ich schon in der ersten Antwort hingewiesen:CStoll schrieb:
joe132 schrieb:
als fehler gibt er mir "unresolved external symbol aus" ist vermutlich syntaktisch nicht korrekt. klappt as überhaupt so wie ich mir das denke?
Für welchen Namen? Ich vermute spontan, er findet deinen LONG_PTR nicht - da brauchst du den Eintrag "LONG_PTR CListview::PrevWndProcListView;" in der CPP-Datei.
-
was meinst du mit in der .cpp datei?
ich hab das doch in meinem headerfile definiert. wieso kennt der meine CListview::PrevWndProcListView in meiner Methode dann nicht?
wo muss ich das in die .cpp datei hineinschreiben ? bin was verwirrt

-
Im Header hast du die Variable "nur" deklariert - die Definition benötigst du noch extra. Die kannst du in die selbe Datei packen, in der auch deine Funktion steht.
zur Erklärung: Mit der Deklaration hast du dem Compiler nur mitgeteilt, daß es diese Variable gibt - er kann aber noch keinen Speicher dafür anlegen, weil er nicht weiß, wie oft der Header eingebunden werden wird (das gäbe auch Probleme, wenn jeder Anwender deiner Klasse eine eigene Version dieser Variable anlegen würde). Mit der Definition sagst du dem Compiler, daß die Variable genau hier angelegt werden soll.
-
danke, funktioniert.
und wieder was gelernt

-
CallWindowProc(&CListview::PrevWndProcListView, hWnd, message, wParam, lParam);... function pointer!
-
(D)Evil schrieb:
CallWindowProc(&CListview::PrevWndProcListView, hWnd, message, wParam, lParam);... function pointer!
das führt zu nem laufzeitfehler.
ohne, den adressoperator klappts wunderbar.
das passiert bei der objekterstellung:
CListview::PrevWndProcListView = SetWindowLongPtr(this->getListviewHandle(), GWLP_WNDPROC, (LONG_PTR) CListview::ListViewProc);damit speicher ich mir doch schon die adresse der funktion oder nicht ?