根本原因:
是因為單獨包含了一些windows.h已經包含了的頭文件如"fileapi.h","WinUser.h",但是卻沒有包含windows.h
或者
先包含了如"fileapi.h","WinUser.h",后包含windows.h,順序不對
先說解決方案:
在代碼中 加入include “windows.h” 即可,或者調整順序,把winows.h放在前面
網上的解決方案:
在項目中添加_AMD64_宏(其他三個也可以)也可以解決該問題
具體方法:項目名稱右鍵-->屬性-->C/C++-->預處理器-->添加宏,如下所示:
具體過程:
我在調用ShellExecute 函數時提示錯誤 "No Target Architecture",代碼簡化如下:
#include "stdafx.h"
#include "WinUser.h"
#include <ShellAPI.h>
int main()
{
ShellExecute(0, NULL, L"http://www.baidu.com", NULL, NULL, SW_SHOWNORMAL);
return 0;
}
定位錯誤位置在winnt.h
#if defined(_AMD64_) || defined(_X86_)
#define PROBE_ALIGNMENT( _s ) TYPE_ALIGNMENT( DWORD )
#elif defined(_IA64_) || defined(_ARM_) || defined(_ARM64_)
#define PROBE_ALIGNMENT( _s ) TYPE_ALIGNMENT( DWORD )
#elif !defined(RC_INVOKED)
#error "No Target Architecture"
#endif
原因也很簡答,就是沒有定義 (_AMD64_) 、(_X86_)這幾個宏,編譯器檢查到,就拋出異常
在調用 ShellExecute時,SW_SHOWNORMAL提示找不到,查了下,SW_SHOWNORMAL這玩意是在"WinUser.h"中定義,於是#include "WinUser.h"
"WinUser.h"里面定義了所有 user32.dll 導出的 API 以及各種宏定義,例如代表消息ID 的 WM_* 宏,與 Windows UI 相關的大部分 API 都是在 winuser.h 中定義的。這個文件是被include在了windows.h中的
所以一般都是直接 #include <windows.h>即可,而上面說到的 (_AMD64_) 、(_X86_)也是在windows.h 中先定義的,所以報錯了
在此例中,winuser和 <ShellAPI.h>都可以刪除,直接包含一個windows.h即可
windows.h下的重要的頭文件有哪些:
windows.h是一個最重要的頭文件,它包含了其他Windows頭文件,這些頭文件的某些也包含了其他頭文件。這些頭文件中最重要的和最基本的是:
WINDEF.H 基本數據類型定義
WINNT.H 支持Unicode的類型定義
WINBASE.H Kernel(內核)函數
WINUSER.H 用戶界面函數 //本例中shellexecute就定義在此
WINGDI.H 圖形設備接口函數