C++ 赢 API 函数'not declared in this scope'



我试图使用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 %lun", dwRes);
    }
    ...

我知道它使用了sddl.h头文件,而且它确实存在,没有直接引用它的编译错误。我遗漏了什么?

edit:我使用netbeans和minGW工具链。我有Windows SDK,并且一直在使用其他部分(如示例中所示的GetNamedSecurityInfo)。

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以外的东西。

虽然许多评论和Ben Key的回答让我找到了正确的地方,但归根结底,Min在Mingw中表示最小。

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

感谢大家的评论和回答,帮助我弄清楚这个问题!

编辑:这是对另一个问题的回答,概述了使用mingw和Win SDK时的一些问题。

Edit2:正如Ben Key在他的评论中提到的,mingw-builds有一个sddl.h(和其他包含)的版本,比原来的mingw中更充实。mingw- builds是mingw-w64的合并版本,似乎是mingw选项中最新的(虽然仍然是成熟的)。你可以在这里阅读更多关于mingw-w64的信息

相关内容

最新更新