“BOOL CryptBinaryToStringW(const BYTE *,DWORD,DWORD,LPWSTR,DWORD *)”: 无法将参数 4 从“LPSTR”转换为“LPWSTR”
时间: 2023-10-08 12:13:23 浏览: 105
这个错误是因为函数 `CryptBinaryToString` 的第四个参数需要的是 `LPWSTR` 类型的指针,而不是 `LPSTR` 类型的指针。
解决这个问题的方法是将第四个参数从 `LPSTR` 类型的指针转换成 `LPWSTR` 类型的指针,可以使用 `MultiByteToWideChar` 函数进行转换。以下是修改后的代码:
```cpp
// Base64 编码
CString EncodeBase64(const CString& str)
{
DWORD dwSize = 0;
CryptBinaryToString((BYTE*)str.GetString(), str.GetLength(), CRYPT_STRING_BASE64, NULL, &dwSize);
LPSTR lpstr = new CHAR[dwSize];
CryptBinaryToString((BYTE*)str.GetString(), str.GetLength(), CRYPT_STRING_BASE64, lpstr, &dwSize);
// 转换 LPSTR 到 LPWSTR
int nLen = MultiByteToWideChar(CP_ACP, 0, lpstr, -1, NULL, 0);
LPWSTR lpwstr = new WCHAR[nLen];
MultiByteToWideChar(CP_ACP, 0, lpstr, -1, lpwstr, nLen);
CString result(lpwstr, dwSize);
delete[] lpstr;
delete[] lpwstr;
return result;
}
// Base64 解码
CString DecodeBase64(const CString& str)
{
DWORD dwSize = 0;
CryptStringToBinary(str, 0, CRYPT_STRING_BASE64, NULL, &dwSize, NULL, NULL);
LPBYTE lpbyte = new BYTE[dwSize];
CryptStringToBinary(str, 0, CRYPT_STRING_BASE64, lpbyte, &dwSize, NULL, NULL);
CString result((LPCTSTR)lpbyte, dwSize);
delete[] lpbyte;
return result;
}
```
使用时可以这样调用:
```cpp
CString str = "Hello, world!";
CString encodedStr = EncodeBase64(str);
CString decodedStr = DecodeBase64(encodedStr);
```
其中 `str` 是待编码的字符串,`encodedStr` 是编码后的字符串,`decodedStr` 是解码后的字符串。
阅读全文