Функции Win32 API не найдены - PullRequest
2 голосов
/ 10 марта 2012

Я использую DevC ++ в Windows 7 Ultimate 32 бит и включил в свою программу windows.h и psapi.h. Все Windows API, которые я использовал до сих пор, работают, за исключением GetProcessId и DebugActiveProcessStop. Компилятор возвращает в обоих случаях, что указанная функция не объявлена. Однако, когда я смотрю в winbase.h, я ясно вижу, что GetProcessId объявлен. Даже когда я наводю указатель мыши на функцию, отображается информация о структуре. Итак, почему компилятор не может распознать любую функцию?

Ответы [ 2 ]

2 голосов
/ 10 марта 2012

При использовании заголовков Win32 API необходимо указать, на какую версию операционной системы вы нацелены.Это задокументировано в библиотеке MSDN .

. В настоящее время вы должны делать это, определяя NTDDI_VERSION.Если вы посмотрите документацию для GetProcessId , вы заметите, что для этого требуется Windows XP SP1, поэтому вам нужно указать как минимум NTDDI_WINXPSP1 в качестве целевой версии операционной системы.Фактически, поскольку SP1 больше не поддерживается, вам, вероятно, лучше использовать SP2:

#define NTDDI_VERSION 0x05010200

В прошлом я обнаружил, что определение NTDDI_VERSION не всегда работает должным образом, хотя, надеюсь, большинство глюковбыли сглажены к настоящему времени.Если это не работает, попробуйте использовать более старый макрос _WIN32_WINNT, который также задокументирован по ссылке, приведенной выше.В этом случае вы хотите:

#define _WIN32_WINNT 0x0502

Если вам позже понадобится использовать функции, которые были представлены в Vista или Windows 7, измените значение NTDDI_VERSION или _WIN32_WINNT соответствующим образом.В документации библиотеки MSDN для каждой функции указано, в какой версии операционной системы она была представлена.

1 голос
/ 10 марта 2012

Эта проблема иногда появляется, когда вы кодируете в Windows API.Вы можете видеть, что функция находится в заголовочном файле, но по какой-то причине ваш компилятор не согласен.Когда вы сталкиваетесь с этой проблемой, найдите функцию в заголовочном файле и поищите директивы препроцессора вокруг нее.Вам может потребоваться определить что-то, чтобы использовать эту функцию.

В этом случае вот что я нашел для функций, с которыми у вас проблемы:

    #if (_WIN32_WINNT >= 0x0501)
    WINBASEAPI DWORD WINAPI GetProcessId(HANDLE);
    #endif

и

    #if (_WIN32_WINNT >= 0x0501)
    WINBASEAPI BOOL WINAPI DebugActiveProcessStop(DWORD);
    #endif

Итак, в вашем основном кодовом файле, куда вы включаете заголовок Windows, поместите это определение ПЕРЕД включением заголовка Windows:

 #define _WIN32_WINNT 0x0501

Это должно решить вашу проблему.Удачи ^ _ ^

...