Неразрешенный внешний символ IID_IAD?

Я пробую приведенный ниже пример программы, но он не ссылается из-за неразрешенного внешнего символа как для IID_IADs, так и для IID_IADsContainer.

Какую библиотеку я могу включить, чтобы решить эту проблему?

#include <windows.h>
#include <activeds.h>
#include <comdef.h>
#include <iostream>

#pragma comment(lib, "Activeds.lib")

int main() {
    HRESULT hr = CoInitialize(NULL);
    if (FAILED(hr)) {
        std::cout << "Failed to initialize COM library." << std::endl;
        return 1;
    }

    IADsContainer* pContainer = NULL;
    hr = ADsOpenObject(L"LDAP://DC=mydomain,DC=com", NULL, NULL, ADS_SECURE_AUTHENTICATION, IID_IADsContainer, (void**)&pContainer);
    if (FAILED(hr)) {
        std::cout << "Failed to bind to Active Directory." << std::endl;
        CoUninitialize();
        return 1;
    }

    IEnumVARIANT* pEnum = NULL;
    hr = ADsBuildEnumerator(pContainer, &pEnum);
    if (FAILED(hr)) {
        std::cout << "Failed to get enumerator." << std::endl;
        pContainer->Release();
        CoUninitialize();
        return 1;
    }

    VARIANT var;
    ULONG lFetch;
    IDispatch* pDispatch = NULL;
    IADs* pADs = NULL;
    BSTR bstrClass;

    while (S_OK == ADsEnumerateNext(pEnum, 1, &var, &lFetch)) {
        pDispatch = V_DISPATCH(&var);
        hr = pDispatch->QueryInterface(IID_IADs, (void**)&pADs);
        if (SUCCEEDED(hr)) {
            hr = pADs->get_Class(&bstrClass);
            if (SUCCEEDED(hr)) {
                if (_wcsicmp(bstrClass, L"computer") == 0) {
                    BSTR bstrName;
                    hr = pADs->get_Name(&bstrName);
                    if (SUCCEEDED(hr)) {
                        std::wcout << L"Computer: " << bstrName << std::endl;
                        SysFreeString(bstrName);
                    }
                }
                SysFreeString(bstrClass);
            }
            pADs->Release();
        }
        VariantClear(&var);
    }

    ADsFreeEnumerator(pEnum);
    pContainer->Release();
    CoUninitialize();
    return 0;
}

используйте __uuidof(IADsContainer) и __uuidof(IADs). или ссылку на ADSIid.Lib, но лучше используйте __uuiodf

RbMm 27.06.2024 09:37

@RbMm, использующий __uuidof, жалуется на ошибку C2787: «_GUID»: с этим объектом не связан ни один GUID. Ошибка C2660: «ADsOpenObject»: функция не принимает 5 аргументов. Ошибка C2787: «_GUID»: с этим объектом не связан ни один GUID.. . но связывание с ADSIid.lib сработало (как вы это обнаружили?)

user3161924 27.06.2024 09:40

В образце программы все равно не перечислены компьютеры...

user3161924 27.06.2024 09:43

какой компилятор вы используете? вместо IID_PPV_ARGS(&pContainer)IID_IADsContainer, (void**)&pContainer должен работать на CL(msvc). IID_PPV_ARGS(&pContainer) равен __uuidof(IADsContainer), (void**)&pContainer

RbMm 27.06.2024 09:46

эта программа все равно не выводит список компьютеров - это уже совсем другой вопрос. как ты это нашел (ADSIid.lib)? это не тривиально, если подумать?

RbMm 27.06.2024 09:48

Он работает с WinNT вместо LDAP. VS2022 я собирал.

user3161924 27.06.2024 09:56

VS2022, который я использовал для сборки - c или c++? msvc или clang? (MSVC поддерживает оба). если msvc c++ - __uuidof(IADsContainer), (void**)&pContainer или IID_PPV_ARGS(&pContainer) должно работать. вероятно, вы используете c

RbMm 27.06.2024 09:59

Я вполне уверен, что компилятор C отклонит std::cout << "whatever";, потому что это недопустимый C.

IInspectable 27.06.2024 10:09

@user3161924 user3161924 «связывание с ADSIid.lib сработало (как вы это обнаружили?)» - Вы читали документацию? Настройка Visual C++ 6.0 для разработки ADSI

Remy Lebeau 27.06.2024 20:35

Модуль c++ 14, msvc, __uuidof не работал, связывание с adsiid.lib работало.

user3161924 27.06.2024 22:50
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
10
74
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

@RemyLebeau указал на правильное решение , Настройка среды разработки Microsoft Visual C++ 6.0.

  1. Укажите каталог включения и библиотеки. Выберите Инструменты | Параметры. Перейдите на вкладку «Каталог» и укажите путь к ADSI. заголовочные файлы.
  2. Включите файл Activeds.h в свой проект.
  3. Добавьте файлы Activeds.lib и Adsiid.lib во входные данные компоновщика для ваш проект.

Другие вопросы по теме