2012-01-17 4 views
-1

私は、UUIDを作成し、人間が読める形式で事前に割り当てられたバッファに書き込むために、次の関数を使用しています。何かがおかしい。この方法の終わりにreinterpret_castはcharとunsigned charの間のポインタを落としますか?

void createUUID(char* pDst) 
{ 
    UUID lUUIDObj; 
    UuidCreate(&lUUIDObj); 
    unsigned char* lDest = reinterpret_cast<unsigned char*>(pDst); 
    UuidToStringA(&lUUIDObj, &lDest) 
} 

、デバッガは言う:

  • lDest = 0x01fe4fd8 "df4a5ed8-c0d2-495a-84d7-ce0e07cf2113"
  • をpDst = 0x0012ec7c "ÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌ"

私は両方とも同じコンテンツを持っていると思っていましたが、それはcaではありませんse。

どうしましたか?ありがとうございます。

+0

あなたは最適化されたビルドをデバッグしていますか?それは 'lDest'への代入の後に必要ではないので、最終関数呼び出しの間に' pDst'を保持することはおそらく気にしません。関数から抜け出し、呼び出し元の視点から結果を確認するとどうなりますか? –

+0

これはデバッグビルド(/ MDd)であり、一度返されると、私のバッファ内の値もまたです。 – moala

答えて

5

UuidToStringAためdocumentationを見ると、それは言う:

RPCランタイムライブラリがStringUuidパラメータに返される文字列のためのメモリを割り当てます。

これは、呼び出しの後lDestpDstにもはやポイントを行わないことを意味します。

+1

うわー、ありがとう。私はRTMする必要があります。 – moala

1
void createUUID(char* pDst) 
{ 
    UUID lUUIDObj; 
    UuidCreate(&lUUIDObj); 
    unsigned char* lDest = reinterpret_cast<unsigned char*>(pDst); 
    //UuidToStringA(&lUUIDObj, &lDest); 
    UuidToStringA(&lUUIDObj, lDest); 
} 

あなたはそれが元々指さ値を変更せずにlDestを上書きさのように見えます。

+0

私はポインタ値を読んでいて、少なくとも私はそれがUuidToStringA呼び出しで変化していることがわかったはずです。 – moala

0

Joachim Pileborg's answerを完了するために、ここでの修正機能は次のとおりです。

void createUUID(char* pDst) 
{ 
    UUID lUUIDObj; 
    UuidCreate(&lUUIDObj); 
    unsigned char* lTmpStr; 
    UuidToStringA(&lUUIDObj, &lTmpStr); 
    sprintf(pDst, reinterpret_cast<char*>(lTmpStr)); 
    RpcStringFreeA(&lTmpStr); 
} 
関連する問題