C ++ Win API функция «не объявлена в этой области»

0

Я пытаюсь использовать 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, и он определенно существует без ошибок компиляции, ссылающихся непосредственно на него. Что мне здесь не хватает?

edit: Я использую netbeans и toolchain minGW. У меня есть SDK Windows, и я использую другие части просто отлично (например, GetNamedSecurityInfo, как показано в примере).

  • 0
    51 символ для одного имени функции, иногда они действительно переусердствуют ...
  • 0
    Я точно знаю? Я смотрел на него несколько раз, чтобы убедиться в отсутствии опечатки.
Показать ещё 10 комментариев
Теги:
winapi

2 ответа

1
Лучший ответ

В то время как многие из комментариев и ответ Бена-ключа привели меня в нужное место, это сводилось к тому, что Min in Mingw означает минимальный.

sddl.h который я использовал, на самом деле поступал из папки Mingw include, а не из моего Windows SDK. Посмотрев на sddl.h, предоставленный Mingw, я заметил, что это очень минимальная версия и отсутствует прототипы и определяет, что мне нужно. Это также объясняет, почему мой код работал в MSVC для других.

Спасибо всем за комментарии и ответы, которые помогли мне понять это!

Изменение: этот ответ на другой вопрос описывает некоторые проблемы, связанные с использованием как mingw, так и Win SDK.

Edit2: Как упоминал Бен Ключ в своем комментарии, mingw-builds имеет версию sddl.h (и других включает), которая намного больше заполнена, чем та, что была найдена в исходном средстве. Mingw-builds является слиянием с mingw-w64 и, по-видимому, является самым современным (хотя и все еще зрелым) из вариантов mingw. Вы можете прочитать больше о MinGW-w64 здесь.

  • 1
    Версия sddl.h, которая поставляется с версией MinGW, доступной по адресу sourceforge.net/projects/mingwbuilds (GCC 4.8.1), имеет SDDL_REVISION_1 и ConvertSecurityDescriptorToStringSecurityDescriptor.
  • 0
    Ты прав! Спасибо, что показали мне это, я многому научился благодаря решению этой проблемы.
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.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню