报错C1189 #error: "No Target Architecture"

根本原因:

是因为单独包含了一些windows.h已经包含了的头文件如"fileapi.h","WinUser.h",但是却没有包含windows.h
或者
先包含了如"fileapi.h","WinUser.h",后包含windows.h,顺序不对

先说解决方案:

在代码中 加入include  “windows.h” 即可,或者调整顺序,把winows.h放在前面

 

网上的解决方案:

在项目中添加_AMD64_宏(其他三个也可以)也可以解决该问题
具体方法:项目名称右键-->属性-->C/C++-->预处理器-->添加宏,如下所示:
error C1189: #error :

 

具体过程:

我在调用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 图形设备接口函数

posted @ 2018-12-22 10:37  birdhumen鸟人  阅读(7593)  评论(0编辑  收藏  举报