Неразрешенный токен и символы для ‹alcapi.h›

Я хочу создать библиотеку, чтобы иметь возможность изменить ACL объекта. Я создал проект C++ в VS 2015 (все компоненты C++ установлены), что дало мне макет библиотеки DLL.

Я включил пример кода по ссылке выше в свой файл .cpp и включил alcapi.h :

#include <windows.h>
#include <stdio.h>
#include <Aclapi.h>

DWORD AddAceToObjectsSecurityDescriptor(
    LPTSTR pszObjName,          // name of object
    SE_OBJECT_TYPE ObjectType,  // type of object
    LPTSTR pszTrustee,          // trustee for new ACE
    TRUSTEE_FORM TrusteeForm,   // format of trustee structure
    DWORD dwAccessRights,       // access mask for new ACE
    ACCESS_MODE AccessMode,     // type of ACE
    DWORD dwInheritance         // inheritance flags for new ACE
)
{
    DWORD dwRes = 0;
    PACL pOldDACL = NULL, pNewDACL = NULL;
    PSECURITY_DESCRIPTOR pSD = NULL;
    EXPLICIT_ACCESS ea;
...

Когда я пытаюсь построить это, я получаю следующие ошибки, например:

LNK2028 unresolved token (0A00005D) "extern "C" unsigned long __stdcall SetNamedSecurityInfoW(wchar_t *,enum _SE_OBJECT_TYPE,unsigned long,void *,void *,struct _ACL *,struct _ACL *)" (?SetNamedSecurityInfoW@@$$J228YGKPA_WW4_SE_OBJECT_TYPE@@KPAX2PAU_ACL@@3@Z) referenced in function "unsigned long __cdecl AddAceToObjectsSecurityDescriptor(wchar_t *,enum _SE_OBJECT_TYPE,wchar_t *,enum _TRUSTEE_FORM,unsigned long,enum _ACCESS_MODE,unsigned long)" (?AddAceToObjectsSecurityDescriptor@@$$FYAKPA_WW4_SE_OBJECT_TYPE@@0W4_TRUSTEE_FORM@@KW4_ACCESS_MODE@@K@Z)    
LNK2019 unresolved external symbol "extern "C" unsigned long __stdcall SetNamedSecurityInfoW(wchar_t *,enum _SE_OBJECT_TYPE,unsigned long,void *,void *,struct _ACL *,struct _ACL *)" (?SetNamedSecurityInfoW@@$$J228YGKPA_WW4_SE_OBJECT_TYPE@@KPAX2PAU_ACL@@3@Z) referenced in function "unsigned long __cdecl AddAceToObjectsSecurityDescriptor(wchar_t *,enum _SE_OBJECT_TYPE,wchar_t *,enum _TRUSTEE_FORM,unsigned long,enum _ACCESS_MODE,unsigned long)" (?AddAceToObjectsSecurityDescriptor@@$$FYAKPA_WW4_SE_OBJECT_TYPE@@0W4_TRUSTEE_FORM@@KW4_ACCESS_MODE@@K@Z)

Компоновщик не находит определения функций, объявленных в aclapi.h.

Что мне нужно сделать, чтобы это сработало?

Заранее спасибо.


person jeroen.de.smedt    schedule 29.06.2016    source источник
comment
Начните с поиска и чтения ссылка на SetNamedSecurityInfo, которая расскажет вам, какие библиотеки вам нужно связать.   -  person Some programmer dude    schedule 29.06.2016
comment
Это Advapi32.dll, который я нахожу на своем компьютере в папке System32. Но я не могу добавить ссылку на проект, так как он не относится к типу или версии, которую может использовать текущий проект. Кроме того, эта библиотека не является стандартной библиотекой, которую он должен найти без посторонней помощи?   -  person jeroen.de.smedt    schedule 29.06.2016
comment
Чтобы иметь возможность использовать DLL, вам необходимо связать ее с библиотекой импорта, в данном случае advapi32.lib. Добавьте его в настройках компоновщика проекта. Некоторые из этих библиотек импорта компонуются автоматически, но не все системные библиотеки компонуются автоматически.   -  person Some programmer dude    schedule 29.06.2016
comment
Попробуйте экспортировать функции с помощью __declspec(dllexport) or __declspec(dllimport)   -  person Hannes Hauptmann    schedule 29.06.2016
comment
Да, спасибо @JoachimPileborg! Мне нужно было добавить advapi32.lib в «Дополнительные зависимости» в конфигурации компоновщика. Также; обнаружил, что это дубликат   -  person jeroen.de.smedt    schedule 29.06.2016
comment
@jeroen.desmedt: не прямой дубликат. advapi32.lib символов много, но далеко не все. Так уж получилось, что связанный вопрос нуждался в той же библиотеке, но для разных символов.   -  person MSalters    schedule 29.06.2016