【问题标题】:Error C2664 'BOOL CryptBinaryToStringW(const BYTE *,DWORD,DWORD,LPWSTR,DWORD *)': cannot convert argument 4 from 'std::unique_ptr' to 'LPWSTR'错误 C2664 'BOOL CryptBinaryToStringW(const BYTE *,DWORD,DWORD,LPWSTR,DWORD *)':无法将参数 4 从 'std::unique_ptr' 转换为 'LPWSTR'
【发布时间】:2019-09-20 16:36:55
【问题描述】:

编译 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) 为什么是std::unique_ptr&lt;std::wstring&gt; 而不是std::wstring? 2) 错误有什么不清楚的地方?在CryptBinaryToString 调用中pwszBuffer-&gt;data () 而不是pwszBuffer(注意,要使用它,你需要用C++-17 编译你的程序)?

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


【解决方案1】:

您正在将 std::unique_ptr&lt;wstring&gt; 对象分配给不允许的 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,您不应该使用它从 func 中取出。

related

【讨论】:

  • 谢谢@Mrazimi,我也收到以下错误:错误 C2664 'BOOL CryptBinaryToStringW(const BYTE *,DWORD,DWORD,LPWSTR,DWORD *)': cannot convert argument 4 from 'std: :unique_ptr<:wstring>>' 到 'LPWSTR'
  • 在下面的代码行中:CryptBinaryToString(reinterpret_cast(strData.c_str()), dwSize, dwOptions, pwszBuffer, &dwLength);
  • @JohnPaulCoder 我已经编辑了答案并添加了此错误的解决方案。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-11-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多