logo elektroda
logo elektroda
X
logo elektroda
REKLAMA
REKLAMA
Adblock/uBlockOrigin/AdGuard mogą powodować znikanie niektórych postów z powodu nowej reguły.

Jak poprawnie zdefiniować i użyć funkcję CALLBACK w Visual C++?

piotruss 27 Maj 2005 17:53 3047 6
REKLAMA
  • #1 1529235
    piotruss
    Poziom 12  
    Posty: 108
    Pomógł: 2
    Ocena: 1
    Mam funkcje
    BOOL CALLBACK CdupaDlg::EnumWindowsProc(HWND hwnd, LPARAM lParam);
    tak zdefiniowana w Dlg.h
    i jej cialo w dlg.cpp

    Chce uzyc funkcji
    EnumWindows((WNDENUMPROC)EnumWindowsProc,0);

    ale tak jak to napisane nie dziala,wyzuca cos takiego
    error C2440: 'type cast' : cannot convert from 'overloaded-function' to 'WNDENUMPROC'

    nie wiem jak sie do to ugrysc:(
  • REKLAMA
  • #2 1529246
    stepowicz
    Poziom 17  
    Posty: 160
    Pomógł: 18
    EnumWindows((WNDENUMPROC)EnumWindowsProc(?,?),0);
    W miejsce ? wstaw parametry.
  • REKLAMA
  • #3 1529249
    BoskiDialer
    Poziom 34  
    Posty: 1530
    Pomógł: 353
    Ocena: 42
    BOOL CALLBACK CdupaDlg::EnumWindowsProc(HWND hwnd, LPARAM lParam);

    EnumWindows(
    (WNDENUMPROC)EnumWindowsProc, // [1]
    0
    );

    [1]: tu wywołujesz funkcje bez żadnych parametrów.. co do konwersji -> nieryzykował bym bezpośredniej konwersji wyniku z funkcji.. ostatecznie kompilator sam tobie zgłosił błąd: chciałeś zamienić funkcje (a nie wynik - pokazane to jest jako 'overloaded-function' zamiast 'BOOL') na typ WNDENUMPROC
  • REKLAMA
  • #4 1529452
    piotruss
    Poziom 12  
    Posty: 108
    Pomógł: 2
    Ocena: 1
    EnumWindows((WNDENUMPROC)EnumWindowsProc,0)
    Chdzi mi wlasnie o wstawienie w miejsce 1 argumentu wskaznik do funkcji EnumWindowsProc ktora bedzie wywolywana wewnatrz funkcji EnumWindows
    [/b]
  • #6 1529850
    Sam Sung
    Poziom 33  
    Posty: 2002
    Pomógł: 227
    Ocena: 571
    A w C to było takie proste :)
    Można też zrobić globalną funkcję callback, wskaźnik do this przekazać przez user value, a wewnątrz callbacka wywołać właściwą metodę na rzecz tego obiektu. Jeśli ta metoda będzie prywatna, to callback zaprzyjaźnić.
  • REKLAMA
  • #7 1531176
    piotruss
    Poziom 12  
    Posty: 108
    Pomógł: 2
    Ocena: 1
    Problem czesciowo rozwiazalem deklarujac funkcje EnumWindowsProc jako statyczna, wtedy nie wywala bledu i funkcja EnumWindows ja wywoluje. Jednak nie mage wstawic do ciala funkcji EnumWindowsProc zadnych zmiennych aby zwrocony wskaznik HWND zapamietac ,wyzuca blad nawet ja to sa zmienne statczne:
    dupa error LNK2001: unresolved external symbol "public: static struct HWND__ * CcostamDlg::okno" (?okno@CcostamDlg@@2PAUHWND__@@A)

    Juz dziala. Zmienne static deklaruje poza obrebem deklaracji klasy i narazie to dziala.

Podsumowanie tematu

✨ Dyskusja dotyczy poprawnej definicji i użycia funkcji CALLBACK w Visual C++ na przykładzie funkcji EnumWindowsProc w klasie dialogowej. Problem polega na błędzie kompilacji C2440 przy próbie rzutowania metody klasy na wskaźnik do funkcji typu WNDENUMPROC, wynikającym z faktu, że metody niestatyczne mają ukryty wskaźnik this i nie mogą być bezpośrednio użyte jako callback. Rozwiązaniem jest zadeklarowanie funkcji EnumWindowsProc jako statycznej, co umożliwia jej przekazanie do EnumWindows bez błędów. Dodatkowo, aby przechować zwrócony uchwyt HWND, stosowano zmienne statyczne zdefiniowane poza klasą, co pozwoliło uniknąć błędów linkera LNK2001. Wskazano również, że w C można było łatwiej przekazać wskaźnik this przez parametr lParam i wywołać metodę obiektu wewnątrz globalnej funkcji callback. Podano link do przykładowego rozwiązania na CodeProject oraz omówiono technikę użycia globalnej funkcji callback z przekazywaniem wskaźnika do obiektu przez parametr użytkownika.
Wygenerowane przez model językowy.
REKLAMA