GUID を生成する COM オブジェクトが必要です。私は C# 開発者ですが、これは unix 環境でデプロイされるので、C++ でビルドする必要があると考えています。これは私の最初の Visual C++ プロジェクトであり、完成させるのに苦労しています。
私が取ったステップ:
Visual Studio で新しい ATL プロジェクトを作成しました (ダイナミック リンク ライブラリ - 他のオプションはありません)
プロジェクトを右クリック -> クラスの追加 -> ATL シンプル オブジェクト (短い名前: GuidGenerator; ProgID: InfaGuidGenerator)
View -> ClassView -> IGuidGenerator -> Add Method (メソッド名: Generate; パラメーター タイプ: BSTR* [out]; パラメーター名: retGuid)
プラットフォームに依存しない UUID ジェネレーターを取得する Boost を追加しました。
// GuidGenerator.cpp : Implementation of CGuidGenerator
#include "stdafx.h"
#include "GuidGenerator.h"
#include <boost/lexical_cast.hpp>
#include <boost/uuid/uuid.hpp> // uuid class
#include <boost/uuid/uuid_generators.hpp> // generators
#include <boost/uuid/uuid_io.hpp> // streaming operators etc.
STDMETHODIMP CGuidGenerator::Generate(BSTR* retGuid)
{
boost::uuids::uuid uuid = boost::uuids::random_generator()();
std::string uuidStr = boost::lexical_cast<std::string>(uuid);
//not really sure what to do from here.
//I've tried to convert to BSTR.
//When I assign the resulting value to retGuid, I often get an error:
//A value of type BSTR cannot be assigned to an entity of type BSTR*
return S_OK;
}
次のステップについて誰かが私にいくつかのガイダンスを提供できますか?
ありがとう。
コメントから編集:
以下を使用して BSTR に変換しようとしましたが、エラーが発生します。
STDMETHODIMP CGuidGenerator::Generate(BSTR* retGuid)
{
boost::uuids::uuid uuid = boost::uuids::random_generator()();
std::string uuidStr = boost::lexical_cast<std::string>(uuid);
int wslen = ::MultiByteToWideChar(CP_ACP, 0 /* no flags */,
uuidStr.data(), uuidStr.length(),
NULL, 0);
BSTR wsdata = ::SysAllocStringLen(NULL, wslen);
::MultiByteToWideChar(CP_ACP, 0 /* no flags */,
uuidStr.data(), uuidStr.length(),
wsdata, wslen);
retGuid = wsdata;
//ERROR: A value of type BSTR cannot be assigned to an entity of type BSTR*
return S_OK;
}