Winapi 如何将LPWSTR转换为LPBYTE

Winapi 如何将LPWSTR转换为LPBYTE,winapi,registry,Winapi,Registry,我发现了许多关于如何将LPBYTE转换为LPWSTR的信息,但没有关于反向过程的信息。我自己尝试过,并测试过这些方法: // my_documents declaration: WCHAR my_documents[MAX_PATH]; //1st const int size = WideCharToMultiByte(CP_UTF8, 0, my_documents, -1, NULL, 0, 0, NULL); char *path = (char *)malloc( size ); W

我发现了许多关于如何将LPBYTE转换为LPWSTR的信息,但没有关于反向过程的信息。我自己尝试过,并测试过这些方法:

// my_documents declaration:
WCHAR my_documents[MAX_PATH];
//1st
const int size = WideCharToMultiByte(CP_UTF8, 0, my_documents, -1, NULL, 0, 0, NULL);
char *path = (char *)malloc( size ); 
WideCharToMultiByte(CP_UTF8, 0, my_documents, -1, path, size, 0, NULL);
//2nd
size_t i;
char *pMBBuffer = (char *)malloc( MAX_PATH );
cstombs_s(&i, pMBBuffer, MAX_PATH, my_documents, MAX_PATH-1 );
但当我将它们写入注册表时,它们是不可读的。这就是我将它们写入注册表的方式:

BOOL SetKeyData(HKEY hRootKey, WCHAR *subKey, DWORD dwType, WCHAR *value, LPBYTE data, DWORD cbData)
{
    HKEY hKey;
    if(RegCreateKeyW(hRootKey, subKey, &hKey) != ERROR_SUCCESS)
        return FALSE;
    LSTATUS status = RegSetValueExW(hKey, value, 0, dwType, data, cbData);
    if(status != ERROR_SUCCESS)
    {
        RegCloseKey(hKey);
        return FALSE;
    }
    RegCloseKey(hKey);
    return TRUE;
}

SetKeyData(HKEY_CURRENT_USER, L"Software\\Microsoft\\Windows\\CurrentVersion\\Run", REG_SZ, L"My program", (LPBYTE)path, size)

转换没有问题,但当我尝试将其写入注册表时,我会得到一些奇怪的字符

当您将字符串写入宽注册表函数时,您不应该转换,而应该传递一个普通的WCHAR*,只转换为LPBYTE。记住要把尺寸弄对。LPBYTE确实适用于当您编写二进制blob时,所有其他类型都必须强制转换…

完全不要转换,Windows的核心是Unicode。编写字符串时,RegSetValueExW()需要WCHAR*。只需强制转换到LPBYTE以使编译器满意。