C ++ Win API函数'未在此范围内声明'

时间:2014-08-13 00:10:28

标签: c++ windows winapi

我正在尝试使用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)。

2 个答案:

答案 0 :(得分:1)

SDDL_REVISION_1sddl.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定义为{{1}}以外的其他内容。

答案 1 :(得分:1)

虽然很多评论和Ben Key的回答让我找到了合适的位置,但事实证明Mingw中的 Min 代表的是最小的。

我使用的sddl.h实际上来自Mingw的include文件夹,而不是来自我的Windows SDK包含。在查看sddl.h provided by Mingw之后,我注意到它是一个非常小的版本,并且缺少原型并定义了我需要的版本。这也解释了为什么我的代码在MSVC中为其他人工作。

谢谢大家的评论和答案,帮助我解决这个问题!

编辑:这个问题的answer概述了使用mingw和Win SDK时的一些问题。

Edit2:正如Ben Key在评论中提到的那样,mingw-builds的版本为sddl.h(以及其他包含版本),其填充量远远超过原始版本中的版本。 Mingw-builds与mingw-w64合并,似乎是mingw选项中最新的(虽然仍然是成熟的)。您可以阅读有关mingw-w64 here的更多信息。