You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用UuidToStringW生成完整UUID字符串遇到问题求助

宽字符版本UUID仅输出前半部分的问题

我正计划将主代码库中的部分ID替换为UUID,以便在软件多实例环境中使用该ID。在添加此功能前,我先在控制台应用中测试相关调用。ASCII版本可以正常工作,但宽字符版本无法生成完整UUID,仅输出字符串的前半部分。以下是VS2019中编译运行的测试代码:

#include <iostream>
#include <rpc.h>
#pragma comment(lib,"Rpcrt4.lib")

int main()
{
    //-------------------------------------------------------------------------
    // Generate the UUID
    //-------------------------------------------------------------------------
    UUID newUUID;
    RPC_STATUS resultTypeCreate = UuidCreate(&newUUID);
    switch (resultTypeCreate)
    {
        case RPC_S_OK:
            std::cout << "UUID generated properly\n";
            break;
        case RPC_S_UUID_LOCAL_ONLY:
            std::cout << "UUID good for local only\n";
            break;
        case RPC_S_UUID_NO_ADDRESS:
            std::cout << "No hardware address for the UUID generation\n";
            break;
        default:
            std::cout << "Unknown UUID error\n";
    }

    //-------------------------------------------------------------------------
    // ASCII version of the UUID String.
    //-------------------------------------------------------------------------
    std::wcout << "Ascii Version\n";
    RPC_CSTR uuidAsciiString;
    RPC_STATUS resultTypeA = UuidToStringA(&newUUID, &uuidAsciiString);

    switch (resultTypeA)
    {
    case RPC_S_OK:
        std::cout << "UUID string generated properly\n";
        break;
    case RPC_S_OUT_OF_MEMORY:
        std::cout << "Out of memory\n";
        break;
    default:
        std::cout << "Unknown UUID string error\n";
    }

    std::cout << uuidAsciiString;

    resultTypeA = RpcStringFreeA(&uuidAsciiString);

    //-------------------------------------------------------------------------
    // Wide character version of the UUID string
    //-------------------------------------------------------------------------
    std::cout << "\n\n";

    std::wcout << "Wide Character Version\n";
    RPC_WSTR uuidString;
    RPC_STATUS resultTypeW = UuidToStringW(&newUUID, &uuidString);

    switch (resultTypeW)
    {
    case RPC_S_OK:
        std::cout << "UUID string generated properly\n";
        break;
    case RPC_S_OUT_OF_MEMORY:
        std::cout << "Out of memory\n";
        break;
    default:
        std::cout << "Unknown UUID string error\n";
    }

    std::wcout << uuidString;

    resultTypeW = RpcStringFree(&uuidString);
}

输出结果:
UUID generated properly
Ascii Version
UUID string generated properly
26d205a4-d4d5-4aa4-8837-38e91c507abc

Wide Character Version
UUID string generated properly
00B35B58


问题原因

问题出在混合使用std::cout和std::wcout时的流状态冲突。当先用std::cout输出ASCII内容后,再用std::wcout输出宽字符字符串,流的内部状态会被干扰,导致宽字符输出被截断。另外,调用RpcStringFree时未对应宽字符版本的RpcStringFreeW,存在潜在内存释放问题。

修复后的代码

#include <iostream>
#include <rpc.h>
#pragma comment(lib,"Rpcrt4.lib")

int main()
{
    //-------------------------------------------------------------------------
    // Generate the UUID
    //-------------------------------------------------------------------------
    UUID newUUID;
    RPC_STATUS resultTypeCreate = UuidCreate(&newUUID);
    switch (resultTypeCreate)
    {
        case RPC_S_OK:
            std::wcout << L"UUID generated properly\n";
            break;
        case RPC_S_UUID_LOCAL_ONLY:
            std::wcout << L"UUID good for local only\n";
            break;
        case RPC_S_UUID_NO_ADDRESS:
            std::wcout << L"No hardware address for the UUID generation\n";
            break;
        default:
            std::wcout << L"Unknown UUID error\n";
    }

    //-------------------------------------------------------------------------
    // ASCII version of the UUID String.
    //-------------------------------------------------------------------------
    std::wcout << L"Ascii Version\n";
    RPC_CSTR uuidAsciiString;
    RPC_STATUS resultTypeA = UuidToStringA(&newUUID, &uuidAsciiString);

    switch (resultTypeA)
    {
    case RPC_S_OK:
        std::wcout << L"UUID string generated properly\n";
        break;
    case RPC_S_OUT_OF_MEMORY:
        std::wcout << L"Out of memory\n";
        break;
    default:
        std::wcout << L"Unknown UUID string error\n";
    }

    // 将ASCII字符串转换为宽字符后输出,保持流一致性
    std::wcout << reinterpret_cast<const wchar_t*>(uuidAsciiString) << L"\n";

    resultTypeA = RpcStringFreeA(&uuidAsciiString);

    //-------------------------------------------------------------------------
    // Wide character version of the UUID string
    //-------------------------------------------------------------------------
    std::wcout << L"\n";

    std::wcout << L"Wide Character Version\n";
    RPC_WSTR uuidString;
    RPC_STATUS resultTypeW = UuidToStringW(&newUUID, &uuidString);

    switch (resultTypeW)
    {
    case RPC_S_OK:
        std::wcout << L"UUID string generated properly\n";
        break;
    case RPC_S_OUT_OF_MEMORY:
        std::wcout << L"Out of memory\n";
        break;
    default:
        std::wcout << L"Unknown UUID string error\n";
    }

    std::wcout << uuidString << L"\n";

    // 使用宽字符版本的释放函数
    resultTypeW = RpcStringFreeW(&uuidString);
}

关键修复点

  • 统一使用std::wcout输出所有内容,避免ASCII和宽字符流的状态冲突
  • 将ASCII版本的UUID字符串转换为宽字符后再输出,保持流的一致性
  • 宽字符版本的字符串释放对应使用RpcStringFreeW,确保内存正确释放

内容的提问来源于stack exchange,提问作者Friddy

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.16 08:05:29