首页 > 解决方案 > 错误 C2664 'BOOL CryptBinaryToStringW(const BYTE *,DWORD,DWORD,LPWSTR,DWORD *)':无法将参数 4 从 'std::unique_ptr' 转换为 'LPWSTR'

问题描述

编译 C++ 项目时出现以下错误。

错误 C2664 'BOOL CryptBinaryToStringW(const BYTE *,DWORD,DWORD,LPWSTR,DWORD *)':无法将参数 4 从 'std::unique_ptr>' 转换为 'LPWSTR'

在下面的代码行:

CryptBinaryToString(reinterpret_cast<const BYTE*>(strData.c_str()), dwSize,
        dwOptions, pwszBuffer, &dwLength);

而且我收到以下错误:

错误 C2679 二进制“=”:未找到采用“std::unique_ptr>”类型右侧操作数的运算符(或没有可接受的转换)

在下面一行:

sBase64 = pwszBuffer;

下面是完整的代码:

bool EMRReader::EncodeBase64(DWORD dwSize, const std::string& strData, wstring& sBase64)
{
    DWORD dwOptions = CRYPT_STRING_BASE64 | CRYPT_STRING_NOCRLF;
    DWORD dwLength = 0;

    BOOL bRet = CryptBinaryToString(reinterpret_cast<const BYTE*>(strData.c_str()), dwSize,
        dwOptions, 0, &dwLength);

    if (!bRet)
        return bRet;

    std::unique_ptr<std::wstring> pwszBuffer = std::make_unique<std::wstring>(dwLength + 1);
    if (!pwszBuffer)
        return FALSE;

    SecureZeroMemory(pwszBuffer.get(), (dwLength + 1) * sizeof(wchar_t));
    CryptBinaryToString(reinterpret_cast<const BYTE*>(strData.c_str()), dwSize,
        dwOptions, pwszBuffer, &dwLength);

    sBase64 = pwszBuffer;

    return TRUE;
}

谁能帮我解决这些错误?

标签: c++c++11compiler-errors

解决方案


您正在将一个对象分配给一个不允许的类型变量。如果要将 的值分配给类型的变量,则应获取的值,然后将其分配给变量。std::unique_ptr<wstring>wstringpwszBufferwstringunique_ptr

你可以std::unique_ptr通过调用它的*操作符来获取它的值:

sBase64 = *pwszBuffer;


编辑:如果要将 a 传递std::unique_ptr给函数,有两种方法:

  1. 通过引用传递它:
void func(std::unique_ptr<std::wstring>& input_ptr) {
    // Do something...
}

然后简单地使用它:

std::unique_ptr<std::wstring> function_input;
func(function_input);

或者2.如果要按值传递,移动它:

void func(std::unique_ptr<std::wstring>& 
input_ptr) {
    // Do something...
}

然后通过它std::move

std::unique_ptr<std::wstring> function_input;
func(std::move(function_input));

您应该知道,在这种情况下,在移动 之后function_input,它什么都不拥有并持有 anullptr并且您不应该func.

有关的


推荐阅读