Ошибка C2664 «BOOL CryptBinaryToStringW (const BYTE *, DWORD, DWORD, LPWSTR, DWORD *)»: невозможно преобразовать аргумент 4 из «std :: unique_ptr» в «LPWSTR» - PullRequest
0 голосов
/ 20 сентября 2019

Я получаю следующую ошибку при компиляции проекта 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 голосов
/ 20 сентября 2019

Вы присваиваете объект 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, и вы не должны использовать из func.

связанных

...