アンマネージドWindows C++プロジェクトにGUID
を作成する必要があります。私はGuid.NewGuid()
を使用するC#に慣れています。管理されていないWindowsのC++バージョンとは何ですか?Guid.NewGuid()のC++バージョンとは何ですか?
答えて
私が考えているのはCoCreateGuid
です。例:
GUID gidReference;
HRESULT hCreateGuid = CoCreateGuid(&gidReference);
これは内部的にUuidCreate()を呼び出します。 – sharptooth
@sharptooth:それは真実の半分に過ぎません。 'CoCreateGuid'は' UuidCreate'を呼び出しますが、一意性に関してより強い保証を提供します。 [CoCreateGuid](https://msdn.microsoft.com/en-us/library/ms688568.aspx):*「** CoCreateGuid **」は、永続的な識別子として絶対的に一意の番号が必要な場合に使用します。分散環境。* – IInspectable
CoInitialize()への事前コールが必要ですか? –
UuidCreate()では、Win32 APIとまったく同じ効果があります。私はGuid.NewGuid()は単に.NETランタイムの内部でその上にマッピングし信じる
UUID newId;
UuidCreate(&newId);
:しかし、あなたは、生成された値を受け取る変数のアドレスを渡す必要があります。
これはGUID構造ではなくUUID構造を作成します。 – Simon
彼らは同じで、単純に異なるtypedefの名前です! –
はい、GUIDはグローバルに一意であると主張します。ユニークなユニークさを持つ契約主義によるUUID!ですから、複数の惑星でコードを実行したい場合は、後者を使うべきです。 (残念ながら、後者でさえ、量子コンピューティングが成立し、多くの宇宙の解釈が真実であると判明した場合には、不十分であるかもしれません...) – BrendanMcK
ここで生成された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リファレンス:
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);
ためsprintf_s
を使用することができます。
これは便利静的方法であり、あなたは新しいGuidを得るために電話することができます。このメソッドは、Windows CoCreateGuid関数に呼び出しをラップします。
したがって、Guid.NewGuid()
に相当するネイティブは、CoCreateGuide()
です。
CoCreateGuidを呼び出して、GUIDを生成します。ただし、どちらのAPI呼び出しも若干異なります。
UuidCreate
はUUIDを返しますが、これは作成したコンピュータに一意であることが保証されています。
CoCreateGuid
はGUIDを生成します。
使用するAPIを決定する必要がある場合は、ドキュメントの該当するセクションをここに示します。
UuidCreate:セキュリティ上の理由から
、会社や組織の外に利用可能になってから、ネットワーク上のイーサネットアドレスを維持することが望ましい場合が多いです。 UuidCreate関数は、生成されたコンピュータのイーサネットアドレスをトレースできないUUIDを生成します。同じコンピュータ上に作成された他のUUIDと関連付けることもできません。
CoCreateGuid機能はGUID、グローバルに一意の128ビット整数を作成RPC関数UuidCreateを呼び出します。分散環境で永続的な識別子として使用する絶対的に一意な番号が必要な場合は、CoCreateGuidを使用してください。
- 1. (c#)キャストのVb.netバージョンは何ですか?
- 2. Strange Guid.NewGuid()の動作
- 3. JavaScriptのバージョン番号とECMAScriptのバージョンは何ですか?
- 4. JSTLのrtバージョンとelバージョンの違いは何ですか?
- 5. Androidで使用されるデフォルトのC++バージョンは何ですか?
- 6. iOS/Objective-CのNSScannerのAndroid/Javaバージョンは何ですか?
- 7. gitバージョン1.7.1のgit clone -cの古いコマンドは何ですか
- 8. `printf`の%* c%* cとは何ですか?
- 9. Objective-Cの最新バージョンは何ですか?
- 10. C++ - temp.pushback(temp [i])のポインタ配列バージョンは何ですか?
- 11. jqueryバージョン1、バージョン2、バージョン3のリリースとの違いは何ですか?
- 12. aws_sdkがC++に使用するopensslバージョンは何ですか?
- 13. nutch1.10のelasticsearchのバージョンは何ですか?
- 14. RESTEasyのNettyのバージョンは何ですか?
- 15. ASP.NETのコアフレームワークのバージョンは何ですか?
- 16. スパークストリーミングカフカの必要バージョンは何ですか?
- 17. this.GetType()。Assembly.GetName()。VersionとAssembly.GetExecutingAssembly()。GetName()。バージョンとの違いは何ですか?
- 18. C#ではString *とは何ですか?
- 19. JavaのinstanceofのC++バージョンは何ですか? :キャストしないでチェックする
- 20. MongoMapperのバージョン管理またはリビジョンパッケージとは何ですか?
- 21. C++のセグメンテーションフォールトとは何ですか?mysql?
- 22. Objective-CのretainCountとは何ですか?
- 23. C++のハンドルとは何ですか?
- 24. Objective-Cの "カテゴリ"とは何ですか?
- 25. C#のArccosメソッドとは何ですか?
- 26. Cの「プライベートヘッダ」とは何ですか?
- 27. Objective-Cの "@private"とは何ですか?
- 28. objective-cのメッセージとは何ですか?
- 29. C#のマスタークラスとは何ですか?
- 30. C++/CLIのプロパティとは何ですか?
C++では定義されていません。サードパーティのライブラリやプラットフォーム固有のOS提供APIに頼る必要があります – jalf