c ++ - Win32 API funktioner ikke fundet

Indlæg af Hanne Mølgaard Plasc

Problem



Jeg er usign DevC ++ på Windows 7 Ultimate 32 bit og har inkluderet windows.h og psapi.h i mit program. Alle de Windows API'er, jeg har brugt indtil videre, arbejder undtagen GetProcessId og DebugActiveProcessStop. Kompilatoren returnerer i begge tilfælde, at den angivne funktion er sort. Men når jeg ser i winbase.h, kan jeg tydeligt se, at GetProcessId er erklæret. Selv når jeg svæver musen over funktionen, vises oplysninger om strukturen. Så hvorfor kan ikke kompilatoren synes at genkende nogen funktion?

Bedste reference


Når du bruger Win32 API-overskrifterne, skal du angive, hvilken version af operativsystemet du målretter mod. Dette er dokumenteret i MSDN-biblioteket. [6]


I dag skal du gøre dette ved at definere NTDDI\_VERSION. Hvis du kontrollerer dokumentationen for GetProcessId, skal du bemærke, at det kræver Windows XP SP1, så du skal angive mindst NTDDI\_WINXPSP1 som mål operativsystem version. Faktisk siden SP1 ikke længere understøttes, er du nok bedre klar med SP2: [7]


#define NTDDI\_VERSION 0x05010200


Tidligere har jeg fundet, at definere NTDDI\_VERSION ikke altid virker som forventet, men forhåbentlig er de fleste af fejlene blevet stryket ud nu. Hvis det ikke virker, skal du prøve at bruge den ældre makro \_WIN32\_WINNT i stedet, hvilket også dokumenteres på linket ovenfor. I dette tilfælde vil du have:


#define \_WIN32\_WINNT 0x0502


Hvis du senere skal bruge funktioner, der blev introduceret i Vista eller Windows 7, skal du ændre værdien af ​​NTDDI\_VERSION eller \_WIN32\_WINNT korrekt. MSDN-bibliotekets dokumentation for hver funktion siger hvilken version af operativsystemet den blev introduceret i.

Andre referencer 1


Dette problem opstår i nogle tilfælde, når du 'koder i windows api. Du kan se, at funktionen er i headerfilen, men af ​​en eller anden grund er din compiler uenig. Når du kommer på tværs af dette problem, skal du finde funktionen i headerfilen , og kig efter præprocessor-direktiver omkring det. Du skal muligvis definere noget for at kunne bruge den funktion.


I dette tilfælde er her hvad jeg fandt for de funktioner, du har problemer med:


    #if (\_WIN32\_WINNT >= 0x0501)
    WINBASEAPI DWORD WINAPI GetProcessId(HANDLE);
    #endif


og


    #if (\_WIN32\_WINNT >= 0x0501)
    WINBASEAPI BOOL WINAPI DebugActiveProcessStop(DWORD);
    #endif


Så i din hovedkodefil, hvor du indeholder vinduesoverskriften, skal du sætte denne definition FØR din inkludering af Windows-overskriften:


 #define \_WIN32\_WINNT 0x0501


Dette bør løse dit problem. Held og lykke ^ \_ ^