2009-08-25 33 views
32

アンマネージドWindows C++プロジェクトにGUIDを作成する必要があります。私はGuid.NewGuid()を使用するC#に慣れています。管理されていないWindowsのC++バージョンとは何ですか?Guid.NewGuid()のC++バージョンとは何ですか?

+0

C++では定義されていません。サードパーティのライブラリやプラットフォーム固有のOS提供APIに頼る必要があります – jalf

答えて

27

私が考えているのはCoCreateGuidです。例:

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

これは内部的にUuidCreate()を呼び出します。 – sharptooth

+1

@sharptooth:それは真実の半分に過ぎません。 'CoCreateGuid'は' UuidCreate'を呼び出しますが、一意性に関してより強い保証を提供します。 [CoCreateGuid](https://msdn.microsoft.com/en-us/library/ms688568.aspx):*「** CoCreateGuid **」は、永続的な識別子として絶対的に一意の番号が必要な場合に使用します。分散環境。* – IInspectable

+1

CoInitialize()への事前コールが必要ですか? –

34

UuidCreate()では、Win32 APIとまったく同じ効果があります。私はGuid.NewGuid()は単に.NETランタイムの内部でその上にマッピングし信じる

UUID newId; 
UuidCreate(&newId); 

:しかし、あなたは、生成された値を受け取る変数のアドレスを渡す必要があります。

+0

これはGUID構造ではなくUUID構造を作成します。 – Simon

+4

彼らは同じで、単純に異なるtypedefの名前です! –

+25

はい、GUIDはグローバルに一意であると主張します。ユニークなユニークさを持つ契約主義によるUUID!ですから、複数の惑星でコードを実行したい場合は、後者を使うべきです。 (残念ながら、後者でさえ、量子コンピューティングが成立し、多くの宇宙の解釈が真実であると判明した場合には、不十分であるかもしれません...) – BrendanMcK

13

ここで生成されたGUIDの結果の文字列値を取得するためのコードの抜粋です:

// For UUID 
#include <Rpc.h> 
#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リファレンス:

4

Windowsで新しいGUIDを生成し、結果の値を文字列として取得するには、次のように入力します。また

#include <string> 
#include <sstream> 
#include <iostream> 
#include <windows.h> 
#include <iomanip> 

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<short>(guid.Data4[0]); 
    os << std::hex << std::setw(2) << std::setfill('0') << static_cast<short>(guid.Data4[1]); 
    os << '-'; 
    os << std::hex << std::setw(2) << std::setfill('0') << static_cast<short>(guid.Data4[2]); 
    os << std::hex << std::setw(2) << std::setfill('0') << static_cast<short>(guid.Data4[3]); 
    os << std::hex << std::setw(2) << std::setfill('0') << static_cast<short>(guid.Data4[4]); 
    os << std::hex << std::setw(2) << std::setfill('0') << static_cast<short>(guid.Data4[5]); 
    os << std::hex << std::setw(2) << std::setfill('0') << static_cast<short>(guid.Data4[6]); 
    os << std::hex << std::setw(2) << std::setfill('0') << static_cast<short>(guid.Data4[7]); 

    std::string s(os.str()); 
    std::cout << s << std::endl; 
} 

、あなたはGuid.NewGuidのドキュメントは、それが実装されているか、指摘文字列変換

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

ためsprintf_sを使用することができます。

これは便利静的方法であり、あなたは新しいGuidを得るために電話することができます。このメソッドは、Windows CoCreateGuid関数に呼び出しをラップします。

したがって、Guid.NewGuid()に相当するネイティブは、CoCreateGuide()です。


CoCreateGuidを呼び出して、GUIDを生成します。ただし、どちらのAPI呼び出しも若干異なります。 UuidCreateはUUIDを返しますが、これは作成したコンピュータに一意であることが保証されています。 CoCreateGuidはGUIDを生成します。

使用するAPIを決定する必要がある場合は、ドキュメントの該当するセクションをここに示します。

UuidCreate:セキュリティ上の理由から

、会社や組織の外に利用可能になってから、ネットワーク上のイーサネットアドレスを維持することが望ましい場合が多いです。 UuidCreate関数は、生成されたコンピュータのイーサネットアドレスをトレースできないUUIDを生成します。同じコンピュータ上に作成された他のUUIDと関連付けることもできません。

CoCreateGuid

CoCreateGuid機能はGUID、グローバルに一意の128ビット整数を作成RPC関数UuidCreateを呼び出します。分散環境で永続的な識別子として使用する絶対的に一意な番号が必要な場合は、CoCreateGuidを使用してください。

関連する問題