kostenloser Webspace werbefrei: lima-city


Funktion in Klasse aufrufen [WinApi]

lima-cityForumProgrammiersprachenC/C++ und D

  1. Autor dieses Themas

    pinkdragon

    pinkdragon hat kostenlosen Webspace.

    Hi

    Ich hab eine Klasse und eine Funktion, die nichts mit der Klasse zu tun hat. Jedoch möchte ich in dieser Klasse auf die Funktion verweisen.
    Genauer:
    Ich habe eine Klasse zum einfachen erzeugen von WinApi Elementen. Das Hauptfenster benötigt einen Verweis auf die "WindowProc" Funktion. (Verwalted Windows-Messages). Normalerweise funtkioniert es einfach, indem ich den Namen der Funktion übergebe (wcs.wndProc = WindowProc; //nicht exakt, aber so ähnlich). Wenn ich jetzt jedoch in einer Klasse darauf zugreife klappt es nicht (irgendwie auch logisch)
    class CClass{
        public:
            void MyFunc();
    }
    void CClass::MyFunc(){
        wcs.wndProc = WindowProc;
    }

    Wie greife ich also in einer klasse auf eine externe Funktion zu?

    mfg
    PD
  2. Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!

    lima-city: Gratis werbefreier Webspace für deine eigene Homepage

  3. tischfussball

    tischfussball hat kostenlosen Webspace.

    Was heisst denn klappt nicht? Bekommst du einen Compiler-Fehler oder funktioniert das Programm nicht wie erwartet?
  4. Autor dieses Themas

    pinkdragon

    pinkdragon hat kostenlosen Webspace.

    Compiler Fehler. (undefined reference to [irgendwas]WindowProc) Wenns weiterhilft, kann ich auch heute noch den genauen Fehler posten.
    Compiler: Dev-Cpp
  5. tischfussball

    tischfussball hat kostenlosen Webspace.

    Aus dem bisschen Codeschnipsel geht hervor, dass du WindowProc global definiert hast (wenn überhaupt). Wenn du das in einer anderen Datei gemacht hast, musst du die Funktion mit der extern-Anweisung in die Headerdatei deiner Klasse mit einbinden.
    Noch ein Tip: C- und C++-Funktionen haben verschiedene Aufrufkonventionen (siehe Stichwörter thiscall und __cdecl in der MSDN).

    Beitrag geaendert: 27.3.2007 16:58:01 von tischfussball
  6. Autor dieses Themas

    pinkdragon

    pinkdragon hat kostenlosen Webspace.

    Ja WindowProc ist (derweil noch) global, aber der header ist includiert ;)
    Der genaue Fehler lautet:
    [Linker error] undefined reference to `_Z10WindowProcP6HWND__jjl@16'

    Er kommt, seit ich folgenderweise probiere auf die Funktion WindowProc zuzugreifen:
    wcs.lpfnWndProc = WindowProc;



    Würde ausserdem gerne wissen, wie ich dieses lästige Warning loswerde:
    [Warning] passing NULL used for non-pointer converting 1 of `HWND__*
    CreateWindowExA(DWORD, const CHAR*, const CHAR*, DWORD, int, int, int, int,
    HWND__*, HMENU__*, HINSTANCE__*, void*)'

    ensteht durch:
    CreateWindowEx(NULL,
                   Name,
                   Name,
                   WEStyle,
                   CW_USEDEFAULT, CW_USEDEFAULT,
                   Width,Height,
                   NULL,
                   NULL,
                   m_hInst,
                   NULL);


    mfg
    PD

    Beitrag geaendert: 27.3.2007 18:34:19 von pinkdragon
  7. tischfussball

    tischfussball hat kostenlosen Webspace.

    Für das erste Problem wie gesagt das Schlüsselwort "extern" benutzen. Und das andere... mal schauen, ob es dann überhaupt noch auftritt.
  8. Autor dieses Themas

    pinkdragon

    pinkdragon hat kostenlosen Webspace.

    Oh stimmt, das wäre ne Möglichkeit (wenn auch keine sehr schöne). Werde es vorher noch mit Singletons versuchen.

    Nur Warnung hatte ich schon immer... liegt wahrscheinlich am Combiler aber man müsste doch irgendwo solche lästigen Warnings abschalten können... (nur gefunden hab ich derweil noch nichts)

  9. Nur Warnung hatte ich schon immer... liegt wahrscheinlich am Combiler aber man müsste doch irgendwo solche lästigen Warnings abschalten können... (nur gefunden hab ich derweil noch nichts)


    Besser ist's i.Allg., einfach sauberer zu Programmieren, denn das wirkt sich auch positiv auf die Programmstabilität aus. Die Warnungen sind nicht überflüssig, die Compilerentwicklerhaben sich da schon was bei gedacht ;)

    MFG,
    thw
  10. Autor dieses Themas

    pinkdragon

    pinkdragon hat kostenlosen Webspace.

    Nur was gibt es in dem Fall sauberer zu programmieren? Ich will dem Pointer nichts übergeben, und übergebe daher NULL. Soll ich statt dessen eine neue Variable (NULL-pointer) erstellen, nur um diesen übergeben zu können? oO Auch kommt der Warning bei anderen Entwicklungsumgebungen nicht. (afair: Visual C++ Net)
  11. wegen der warnung : glaube es liegt daran daß du versuchst einem dword einen NULL zeiger zu übergeben ändere einfach den ersten parameter in 0

    wegen deinem prob : wenn windowproc ne funktion is wo sind die parameter klammer müsste es nicht so aussehen WindowProc(blablaparameter);

    veileicht versuchst du ja auf ein privates element einer klasse zuzugreifen da kannst du dann so viel includieren wie du willst und wird trotzdem nicht funktionieren

    könnte auch sein das du so einfach nicht auf die instanz wcs nicht zugreifen kannst von deiner methode aus vieleicht solltest du mal den zeiger auf die instanz an MyFunc(* klassenname von wcs) übergeben und das dann benutzen

    es is schwer ein fehler zu beheben ohne den gesamten relevanten quelltext

    :angel:;)
  12. Autor dieses Themas

    pinkdragon

    pinkdragon hat kostenlosen Webspace.

    1) Jo mit der 0 funktioniert es jetzt. Danke!
    2) Thx fürs erklären, aber ich hab mich entschlossen Plattform unabhängig zu Programmieren und verzichte daher auf WinApi und DirectX...

    "wegen deinem prob : wenn windowproc ne funktion is wo sind die parameter klammer müsste es nicht so aussehen WindowProc(blablaparameter);"
    Dann sollte dieser Aufruf aber auch nicht innerhalb der WinMain Funktion möglich sein, was er aber ist.
    void CClass::MyFunc(){ 
        wcs.wndProc = WindowProc; 
    }
    Geht nicht, aber folgendes geht:
    int WinMain(...){ //WindowProc wird aber nicht! übergeben
        wcs.wndProc = WindowProc; 
    }


    "es is schwer ein fehler zu beheben ohne den gesamten relevanten quelltext"
    :P Das war aber schon alles :angel:

    Trotzdem Danke fürs helfen! (geht an alle ;))

    mfg
    PD
  13. Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!

    lima-city: Gratis werbefreier Webspace für deine eigene Homepage

Dir gefällt dieses Thema?

Über lima-city

Login zum Webhosting ohne Werbung!