2012-03-10 60 views
2

我在Windows 7 Ultimate 32位上使用DevC++,並且在我的程序中包含了windows.h和psapi.h。到目前爲止,我所使用的所有Windows API除了GetProcessId和DebugActiveProcessStop之外都是有效的。編譯器在兩種情況下返回指定的函數未聲明。但是,當我查看winbase.h時,我可以清楚地看到GetProcessId已被聲明。即使將鼠標懸停在該功能上,也會顯示結構信息。那麼,爲什麼編譯器似乎無法識別這兩個函數呢?未找到Win32 API函數

+1

它可能被預編譯器指令排除。你檢查過了嗎? – 2012-03-10 01:46:31

+3

除非您被要求使用Dev-C++,否則我會考慮仔細關注[Dev-C++標記wiki]的內容(http://stackoverflow.com/tags/dev-c%2b%2b/info )。 – 2012-03-10 01:50:15

+0

作爲一種事後考慮:Windows SDK的v7.0A中既沒有GetProcessId也沒有DebugActiveProcessStop條件,可能是因爲Windows 2000和XP Gold現在都不支持。所以它看起來像你的SDK標題可能會過時。 – 2012-03-13 19:59:25

回答

2

當使用Win32 API標頭時,你需要指定你的目標操作系統的版本。這在MSDN library中有記錄。

現在,你應該通過定義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庫文檔說明了它所引入的操作系統版本。

+0

是的!第二個#定義工作。謝謝!!!!! – 2012-03-10 04:36:09

1

當你在windows api中編碼時,有時會彈出這個問題。您可以看到該函數位於頭文件中,但由於某種原因,編譯器不同意。當遇到此問題時,請在頭文件中找到該函數,並在其周圍查找預處理器指令。您可能需要定義一些內容才能使用該功能。

在這種情況下,這裏就是我發現你有問題的功能:

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

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

所以,在你的主代碼文件,在這裏你有窗戶頭,把這個定義之前,你的Windows頭包括:

#define _WIN32_WINNT 0x0501 

這應該sol有你的問題。祝你好運^ _^

+0

如果這不能解決問題(我認爲它應該),那麼我會確保你沒有從你的鏈接器設置中刪除kernel32.lib。 – 2012-03-10 02:21:43

+0

@druciferre這不會導致一堆鏈接器錯誤嗎? – Gogeta70 2012-03-10 02:53:52

+0

他沒有發佈確切的錯誤,所以它可能是一個鏈接器錯誤。此外,他從未明確表示這是** only **錯誤。我願意打賭'_WIN32_WINNT'的定義是根本原因。但我想我會添加評論,以防萬一。 – 2012-03-10 03:40:33