当前位置:  开发笔记 > 编程语言 > 正文

什么是Guid.NewGuid()的C++版本?

如何解决《什么是Guid.NewGuid()的C++版本?》经验,为你挑选了5个好方法。

我需要GUID在一个非托管的Windows C++项目中创建一个.我已经习惯了C#,我会用它Guid.NewGuid().什么是(非托管窗口)C++版本?



1> sharptooth..:

Win32 API中的UuidCreate()具有完全相同的效果.但是,您需要传递将接收生成值的变量的地址:

UUID newId;
UuidCreate( &newId );

我相信Guid.NewGuid()只是在.NET运行时内映射到它.


是的,但GUID仅声称是全球独一无二的; 合同中的UUID声称具有通用唯一性!因此,如果您希望您的代码在多个星球上运行,那么显然您应该使用后者!(不幸的是,如果量子计算能够发挥作用,并且许多宇宙的解释证明是正确的话,即使后者也可能证明是不够的......)
它们是相同的,只是不同的typedef名称!
不是这种情况.[Guid.NewGuid](https://msdn.microsoft.com/en-us/library/system.guid.newguid.aspx)调用[CoCreateGuid](https://msdn.microsoft.com/library/windows/desktop /ms688568.aspx)(反过来调用UuidCreate,可能不止一次).不同之处在于,CoCreateGuid在唯一性方面提供了更强的保证,因此差异很重要.

2> Alan..:

我想CoCreateGuid你正在追求的是什么.例:

GUID gidReference;
HRESULT hCreateGuid = CoCreateGuid( &gidReference );


它无论如何都在内部调用UuidCreate().
是否需要事先调用CoInitialize()?
@sharptooth:这只是事实的一半.虽然`CoCreateGuid`确实称为'UuidCreate`,但它在唯一性方面提供了更强的保证.[CoCreateGuid](https://msdn.microsoft.com/en-us/library/ms688568.aspx):*"当您需要一个绝对唯一的数字时,请使用**CoCreateGuid**,您将在其中用作持久性标识符分布式环境."*

3> Wyatt O'Day..:

这是一段代码,用于获取生成的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



4> IInspectable..:

Guid.NewGuid的文档指出了它是如何实现的:

这是一个方便的静态方法,您可以调用它来获取新的Guid.该方法包装对Windows CoCreateGuid函数的调用.

所以本机相当于Guid.NewGuid()CoCreateGuide().


CoCreateGuid调用UuidCreate来生成GUID.但是,这两个API调用稍有不同:虽然UuidCreate返回一个UUID,但保证对创建它的计算机是唯一的,因此CoCreateGuid生成一个绝对唯一的GUID.

如果您需要决定使用哪种API,请参阅文档中的相关部分.

UuidCreate:

出于安全原因,通常希望保持网络上的以太网地址不会在公司或组织外部可用.所述UuidCreate函数生成一个UUID无法追踪到在其上生成的计算机的以太网地址.它也不能与在同一台计算机上创建的其他UUID相关联.

CoCreateGuid:

CoCreateGuid函数调用RPC功能UuidCreate,它创建了一个GUID,全局唯一的128位的整数.当您需要一个绝对唯一的编号时,请使用CoCreateGuid,您将在分布式环境中将其用作持久标识符.



5> tcb..:

在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);

推荐阅读
殉情放开那只小兔子
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有