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

时间:2019-09-20 16:36:55

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

编译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;
}

有人可以帮我解决这些错误吗?

1 个答案:

答案 0 :(得分:0)

您正在将std::unique_ptr <wstring>对象分配给wstring类型的变量。如果要将pwszBuffer的值分配给类型为wstring的变量,则应获取unique_ptr的值,然后将其分配给该变量。

您可以通过调用std::unique_ptr运算符来获取*的值:

sBase64 = *pwszBuffer;


编辑:如果要将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后,它一无所有并持有nullptr,并且您不应使用将其从{{ 1}}。

related