我正在使用JNI接口开发一个具有活动目录的java web应用程序。我希望获得活动目录用户的图片,并发现图片存储为一个八进制字符串。我使用IADsUser获取图片的值,但找不到任何文档或代码如何使用该值。我想通过jni将这些数据发送到java,在那里我可以渲染图片。我用来拍照片的代码。
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中的值。谢谢。
发布于 2022-09-22 14:48:39
我有一个老的C++项目,在那里我已经从AD获得数据,所以我决定尝试这个项目。这就是我想出的将数据放入字节数组并将其写入文件的方法:
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。您需要使用SafeArrayGetLBound和SafeArrayGetUBound来获得下限(可能总是0)和上限(长度)。
https://stackoverflow.com/questions/73796970
复制相似问题