C++ Win API 函数'未在此范围内声明'
Posted
技术标签:
【中文标题】C++ Win API 函数\'未在此范围内声明\'【英文标题】:C++ Win API function 'not declared in this scope'C++ Win API 函数'未在此范围内声明' 【发布时间】:2014-08-13 00:10:27 【问题描述】:我正在尝试使用GetNamedSecurityInfo(),但我不断出现超出范围的错误:
main.cpp:25:3: error: 'SDDL_REVISION_1' was not declared in this scope
SDDL_REVISION_1, DACL_SECURITY_INFORMATION, secDescBuffer, buflen);
^
main.cpp:25:68: error: 'ConvertSecurityDescriptorToStringSecurityDescriptor' was not declared in this scope
SDDL_REVISION_1, DACL_SECURITY_INFORMATION, secDescBuffer, buflen);
代码如下:
#include "windows.h"
#include "sddl.h"
#include "aclapi.h"
#include <iostream>
#include <stdio.h>
using namespace std;
int main()
PACL pACL = NULL;
DWORD dwRes = 0;
PSECURITY_DESCRIPTOR pSecDesc = NULL;
dwRes = GetNamedSecurityInfo(TEXT("C:\\somefile.txt"),
SE_FILE_OBJECT, DACL_SECURITY_INFORMATION,
NULL, NULL, &pACL, NULL, &pSecDesc);
if (ERROR_SUCCESS == dwRes)
LPTSTR * secDescBuffer = NULL;
PULONG buflen = NULL;
dwRes = ConvertSecurityDescriptorToStringSecurityDescriptor(pSecDesc,
SDDL_REVISION_1, DACL_SECURITY_INFORMATION, secDescBuffer, buflen);
else
printf("GetNamedSecurityInfo Error %lu\n", dwRes);
...
我知道它使用 sddl.h 头文件,而且它肯定存在,没有直接引用它的编译错误。我在这里想念什么?
编辑: 我正在使用 netbeans 和 minGW 工具链。我有 Windows SDK,并且一直在使用其他部分很好(如示例中所示的 GetNamedSecurityInfo)。
【问题讨论】:
一个函数名 51 个字符,有时他们真的做得过火了...... 我知道对吗?我盯着它看了好几遍,确保没有错字。 你有什么版本的 Windows SDK?您包含的 sddl.h 文件是否包含 SDDL_REVISION_1 变量?如果是这样,请检查它周围的#ifdef。 尝试更新 MinGW,在旧版本中缺少这些功能。 FWIW,您的代码在 Visual Studio 中构建良好。 【参考方案1】:SDDL_REVISION_1
定义在 sddl.h
中,但前提是 WINAPI_FAMILY
定义为 WINAPI_FAMILY_DESKTOP_APP
。 WINAPI_FAMILY
的默认值显然是WINAPI_FAMILY_DESKTOP_APP
,即winapifamily.h
将其定义为WINAPI_FAMILY_DESKTOP_APP
(如果尚未定义)。
我的最佳猜测是您将WINAPI_FAMILY
定义为WINAPI_FAMILY_DESKTOP_APP
以外的其他内容。
【讨论】:
【参考方案2】:虽然许多 cmets 和 Ben Key 的回答让我找到了正确的地方,但归根结底是 Mingw 中的 Min 代表最小。
我使用的 sddl.h
实际上来自 Mingw 的包含文件夹,而不是来自我的 Windows SDK 包含。查看sddl.h provided by Mingw 后,我注意到它是一个非常小的版本,并且缺少我需要的原型和定义。这也解释了为什么我的代码在 MSVC 中为其他人工作。
感谢大家提供帮助我解决这个问题的 cmets 和答案!
编辑:answer 到另一个问题概述了同时使用 mingw 和 Win SDK 包含的一些问题。
Edit2:正如 Ben Key 在他的评论中提到的,mingw-builds 有一个版本的sddl.h
(和其他包括),它比原始 mingw 中的填充更多。 Mingw-builds 是与 mingw-w64 的合并,并且似乎是 mingw 选项中最新的(同时仍然是成熟的)。您可以阅读有关 mingw-w64 here 的更多信息。
【讨论】:
MinGW 版本附带的 sddl.h 版本在 sourceforge.net/projects/mingwbuilds (GCC 4.8.1) 中定义了 SDDL_REVISION_1 和 ConvertSecurityDescriptorToStringSecurityDescriptor。 你是对的!感谢您向我展示这一点,通过处理这个问题我学到了很多东西。以上是关于C++ Win API 函数'未在此范围内声明'的主要内容,如果未能解决你的问题,请参考以下文章