Я пытаюсь использовать 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, как показано в примере).
В то время как многие из комментариев и ответ Бена-ключа привели меня в нужное место, это сводилось к тому, что 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 здесь.
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
.