我需要GUID
在一个非托管的Windows C++项目中创建一个.我已经习惯了C#,我会用它Guid.NewGuid()
.什么是(非托管窗口)C++版本?
Win32 API中的UuidCreate()具有完全相同的效果.但是,您需要传递将接收生成值的变量的地址:
UUID newId; UuidCreate( &newId );
我相信Guid.NewGuid()只是在.NET运行时内映射到它.
我想CoCreateGuid
你正在追求的是什么.例:
GUID gidReference; HRESULT hCreateGuid = CoCreateGuid( &gidReference );
这是一段代码,用于获取生成的GUID的结果字符串值:
// For UUID #include#pragma comment(lib, "Rpcrt4.lib") int _tmain(int argc, _TCHAR* argv[]) { // Create a new uuid UUID uuid; RPC_STATUS ret_val = ::UuidCreate(&uuid); if (ret_val == RPC_S_OK) { // convert UUID to LPWSTR WCHAR* wszUuid = NULL; ::UuidToStringW(&uuid, (RPC_WSTR*)&wszUuid); if (wszUuid != NULL) { //TODO: do something with wszUuid // free up the allocated string ::RpcStringFreeW((RPC_WSTR*)&wszUuid); wszUuid = NULL; } else { //TODO: uh oh, couldn't convert the GUID to string (a result of not enough free memory) } } else { //TODO: uh oh, couldn't create the GUID, handle this however you need to } return 0; }
API参考:
UuidCreate
UuidToString
RpcStringFree
Guid.NewGuid的文档指出了它是如何实现的:
这是一个方便的静态方法,您可以调用它来获取新的Guid.该方法包装对Windows CoCreateGuid函数的调用.
所以本机相当于Guid.NewGuid()
是CoCreateGuide()
.
UuidCreate
返回一个UUID,但保证对创建它的计算机是唯一的,因此CoCreateGuid
生成一个绝对唯一的GUID.
如果您需要决定使用哪种API,请参阅文档中的相关部分.
UuidCreate:
出于安全原因,通常希望保持网络上的以太网地址不会在公司或组织外部可用.所述UuidCreate函数生成一个UUID无法追踪到在其上生成的计算机的以太网地址.它也不能与在同一台计算机上创建的其他UUID相关联.
CoCreateGuid:
的CoCreateGuid函数调用RPC功能UuidCreate,它创建了一个GUID,全局唯一的128位的整数.当您需要一个绝对唯一的编号时,请使用CoCreateGuid,您将在分布式环境中将其用作持久标识符.
在Windows中生成新的guid并将结果值作为字符串.
#include#include #include #include #include int main() { GUID guid; CoCreateGuid(&guid); std::ostringstream os; os << std::hex << std::setw(8) << std::setfill('0') << guid.Data1; os << '-'; os << std::hex << std::setw(4) << std::setfill('0') << guid.Data2; os << '-'; os << std::hex << std::setw(4) << std::setfill('0') << guid.Data3; os << '-'; os << std::hex << std::setw(2) << std::setfill('0') << static_cast (guid.Data4[0]); os << std::hex << std::setw(2) << std::setfill('0') << static_cast (guid.Data4[1]); os << '-'; os << std::hex << std::setw(2) << std::setfill('0') << static_cast (guid.Data4[2]); os << std::hex << std::setw(2) << std::setfill('0') << static_cast (guid.Data4[3]); os << std::hex << std::setw(2) << std::setfill('0') << static_cast (guid.Data4[4]); os << std::hex << std::setw(2) << std::setfill('0') << static_cast (guid.Data4[5]); os << std::hex << std::setw(2) << std::setfill('0') << static_cast (guid.Data4[6]); os << std::hex << std::setw(2) << std::setfill('0') << static_cast (guid.Data4[7]); std::string s(os.str()); std::cout << s << std::endl; }
或者,您可以使用sprintf_s
字符串转换
GUID guid; CoCreateGuid(&guid); char guidStr[37]; sprintf_s( guidStr, "%08lX-%04hX-%04hX-%02hhX%02hhX-%02hhX%02hhX%02hhX%02hhX%02hhX%02hhX", guid.Data1, guid.Data2, guid.Data3, guid.Data4[0], guid.Data4[1], guid.Data4[2], guid.Data4[3], guid.Data4[4], guid.Data4[5], guid.Data4[6], guid.Data4[7]); std::string s(guidStr);