使用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-38e91c507abcWide 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
相关产品推荐
相关产品推荐

