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_APPWINAPI_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 函数'未在此范围内声明'的主要内容,如果未能解决你的问题,请参考以下文章

字符串未在此范围内声明 C++

Python C API:T_INT 未在此范围内声明

C++ 错误:“QueryFullProcessImageNameA”未在此范围内声明

未在此范围内声明(C++ 中的数组)[关闭]

C++“未在此范围内声明”编译错误及修改提示

错误:未在此范围内声明“对象”