首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用c++代码获取活动目录图片

使用c++代码获取活动目录图片
EN

Stack Overflow用户
提问于 2022-09-21 07:34:48
回答 1查看 68关注 0票数 1

我正在使用JNI接口开发一个具有活动目录的java web应用程序。我希望获得活动目录用户的图片,并发现图片存储为一个八进制字符串。我使用IADsUser获取图片的值,但找不到任何文档或代码如何使用该值。我想通过jni将这些数据发送到java,在那里我可以渲染图片。我用来拍照片的代码。

代码语言:javascript
复制
HRESULT GetUserObject()
{
    IADsUser* pUser;
    CoInitialize(NULL);
    CComBSTR  path = L"LDAP://WIN-F94H2MP3UJR.Test.local/CN=SomeOne";
    path += L",CN=Users,DC=Test,DC=local";
    HRESULT hr = ADsOpenObject(path, L"Administrator", L"pass@12",
        ADS_SECURE_AUTHENTICATION, // For secure authentication
        IID_IADsUser,
        (void**)&pUser);
    if (FAILED(hr)) { return NULL; }
    VARIANT var;
    hr = pUser->get_Picture((VARIANT*)&var);
    std::string message = std::system_category().message(hr);
    std::cout << message << std::endl;
    return hr;
}

微软文档,我曾经为这个链接编写代码。在这个文档中,他们指定了Get图片方法,这就是我要找的东西。在这里,hr打印操作成功完成。帮助我如何处理这个值,或者至少帮助我打印存储在c++中var中的值。谢谢。

EN

回答 1

Stack Overflow用户

发布于 2022-09-22 14:48:39

我有一个老的C++项目,在那里我已经从AD获得数据,所以我决定尝试这个项目。这就是我想出的将数据放入字节数组并将其写入文件的方法:

代码语言:javascript
复制
VariantInit(&var);
LONG lBound = 0;
LONG uBound = 0;

if (FAILED(pUser->get_Picture(&var)) ||
    FAILED(SafeArrayLock(var.parray)) ||
    FAILED(SafeArrayGetLBound(var.parray, 1, &lBound)) ||
    FAILED(SafeArrayGetUBound(var.parray, 1, &uBound))) {
    //handle failure
}

if (var.vt != VT_EMPTY) {
    const char* pData = static_cast<const char*>(var.parray->pvData);

    std::ofstream file("picture.jpg", std::ios::binary);
    file.write(pData, uBound);
    file.close();

    SafeArrayUnlock(var.parray);
}
VariantClear(&var);

如果没有图片,vt属性将是VT_EMPTY,如果有图片,则为VT_ARRAY | VT_UI1。数据是一个SAFEARRAY。您需要使用SafeArrayGetLBoundSafeArrayGetUBound来获得下限(可能总是0)和上限(长度)。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/73796970

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档