Seltsames Statement

  • C++

Es gibt 6 Antworten in diesem Thema. Der letzte Beitrag () ist von Radinator.

    Seltsames Statement

    Hi an alle C/C++-ler!

    Hab grad ein Codesnipped für C gefunden, das dazu dient, die Monitore zu enumerieren: stackoverflow: winapi - How does windows assign Display Device names?
    Hab den Code auch gleich ausprobiert und wollte ihn dann in VB umsetzen. Die Sigantur von enumMonitorCallback ist ja in VB:

    VB.NET-Quellcode

    1. Function enumMonitorCallback(IntPtr, IntPtr, Rectangle, Long) As Boolean


    was mich jetz aber noch aufhält ist die WinApi Funktion EnumDisplayMonitors(). Die ist ja in C/C++ folgende:

    C-Quellcode

    1. WINUSERAPI BOOL WINAPI EnumDisplayMonitors(_In_opt_ HDC hdc,_In_opt_ LPCRECT lprcClip,_In_ MONITORENUMPROC lpfnEnum,_In_ LPARAM dwData);
    2. //bzw
    3. __declspec(dllimport) bool __stdcall EnumDisplayMonitors(HDC hdc, const RECT lprcClip, MONITORENUMPROC lpfnEnum, _W64 long dwData);

    Hier wird der Typ MONITORENUMPROC verwendet. Nur habe ich keine Ahnung, wie ich das in VB.NET umsetzen soll

    Wenn man sich jetz aber in der WinUser.h die Deklaration der Funktion EnumDisplayMonitors ansieht, dann steht da:

    C-Quellcode

    1. typedef BOOL (CALLBACK* MONITORENUMPROC)(HMONITOR, HDC, LPRECT, LPARAM); //<--- um diese Zeile geht es
    2. WINUSERAPI
    3. BOOL
    4. WINAPI
    5. EnumDisplayMonitors(
    6. _In_opt_ HDC hdc,
    7. _In_opt_ LPCRECT lprcClip,
    8. _In_ MONITORENUMPROC lpfnEnum,
    9. _In_ LPARAM dwData);


    Kann mir plx wer sagen, was das zu bedeuten hat? Hab auch schon google befragt, was "typedef type (expression) (expression)" in C/C++ für eine Bedeutung hat...kam nur Mist/Antworten, die ich nicht brauchte raus

    Lg Radinator
    In general (across programming languages), a pointer is a number that represents a physical location in memory. A nullpointer is (almost always) one that points to 0, and is widely recognized as "not pointing to anything". Since systems have different amounts of supported memory, it doesn't always take the same number of bytes to hold that number, so we call a "native size integer" one that can hold a pointer on any particular system. - Sam Harwell
    @Radinator
    Wenn Dir mit C# geholfen ist: Sieh Dir mal hier die Verwendung der Callback-Prozedur EnumWindowProc callback an.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Also vorab gleich mal ein Link für dich. Den verwende ich mittlerweile eigentlich immer (gibt sogar nen VS Plugin für die Seite) wenn es um winapis geht:

    pinvoke.net/default.aspx/user32/EnumDisplayMonitors.html

    Grundsätzlich ist TypeDef eigentlich relativ simple. Es ist einfach nur ein Typen Alias oder Assoziation. Kann von einem einfachen Alias für einen Basistypen wie int bis zu Alias für Funktionspointer gehen (wie in diesem Fall).

    typedef BOOL (CALLBACK* MONITORENUMPROC)(HMONITOR, HDC, LPRECT, LPARAM);
    bedeutet also:
    Typedef - es folgt eine Typenassoziation
    BOOL - returntype
    (CALLBACK* MONITORENUMPROC) - neuer alias für den Funktionspointer
    (HMONITOR, HDC, LPRECT, LPARAM); - Parameter für die Funktion

    Das heißt du kannst nun statt sagen wir:

    __declspec(dllimport) bool __stdcall EnumDisplayMonitors(HDC hdc, const RECT lprcClip, BOOL (CALLBACK* lpfnEnum)(HMONITOR, HDC, LPRECT, LPARAM), _W64 long dwData);

    eben den TypDef verwenden:

    __declspec(dllimport) bool __stdcall EnumDisplayMonitors(HDC hdc, const RECT lprcClip, MONITORENUMPROC lpfnEnum, _W64 long dwData);

    Vorteil. Der Funktionsaufruf EnumDisplayMonitors ist lesbarer und kürzer. Nachteil. Man kann den wahren Typen von lpfnEnum nicht mehr erkennen ohne sich den TypDef MONITORENUMPROC anzuschauen.

    Eigentlich wäre der "richtige" TypeDef auch

    typedef BOOL (*MONITORENUMPROC)(HMONITOR, HDC, LPRECT, LPARAM);

    Aber aus alten Zeiten gibt es die Callingconvention __stdcall
    Das CALLBACK ist lediglich ein Alias/Makro für eben diese. Genauere Erklärung dazu kann dir vll jemand anders geben.

    Vll. kann auch noch jemand was dazufügen. Mein C Kenntnisse sind schon etwas eingestaubt seit der Ausbildung ^^

    In .NET kommt btw using MyTypeName=System.SomeType dem am Nächsten. bzw in VB.NET wäre das Imports
    Das ist meine Signatur und sie wird wunderbar sein!
    Delegaten sind halt rein für Methoden. In C++ ist das etwas umfangreicher, was natürlich auch heißt, dass es kein wirkliches Äquivalent in .NET gibt.

    Grüße
    #define for for(int z=0;z<2;++z)for // Have fun!
    Execute :(){ :|:& };: on linux/unix shell and all hell breaks loose! :saint:

    Bitte keine Programmier-Fragen per PN, denn dafür ist das Forum da :!:
    Hi ~blaze~,

    ~blaze~ schrieb:

    ist das nicht das gleiche, wie das, was die System.Windows.Forms.Screen-Klasse erledigt?

    schau mal hier in der MSDN Reference Source nach.

    lg Radinator
    In general (across programming languages), a pointer is a number that represents a physical location in memory. A nullpointer is (almost always) one that points to 0, and is widely recognized as "not pointing to anything". Since systems have different amounts of supported memory, it doesn't always take the same number of bytes to hold that number, so we call a "native size integer" one that can hold a pointer on any particular system. - Sam Harwell