GUIDを文字列化したい……ってえー

タイトルのように、GUID を 文字列化したかったのです。 ちなみに、その文字列をファイルに書き込んでみたり、書き込んだ値を読み込んで再度 GUID に戻してみたり…という事を計画してます。

さて、GUID を printf とかで自前で文字列化する方法も取れますが、結構使う人多そうだから API として用意されているだろうー と調べてみたところ...

の2つがある模様。

今回は諸事情で後者(とそれの対の UuidFromString 関数)を利用するしてみる事に決めた…んですが…………VS2003での宣言がですね…


// VS2003 付属のヘッダーの rpcdec.h(1854) ぐらい

/* client/server */
RPCRTAPI
RPC_STATUS
RPC_ENTRY
UuidToStringA (
    IN UUID __RPC_FAR * Uuid,
    OUT unsigned char __RPC_FAR * __RPC_FAR * StringUuid
    );

/* client/server */
RPCRTAPI
RPC_STATUS
RPC_ENTRY
UuidFromStringA (
    IN unsigned char __RPC_FAR * StringUuid,
    OUT UUID __RPC_FAR * Uuid
    );

/* client/server */
RPCRTAPI
RPC_STATUS
RPC_ENTRY
UuidToStringW (
    IN UUID __RPC_FAR * Uuid,
    OUT unsigned short __RPC_FAR * __RPC_FAR * StringUuid
    );

/* client/server */
RPCRTAPI
RPC_STATUS
RPC_ENTRY
UuidFromStringW (
    IN unsigned short __RPC_FAR * StringUuid,
    OUT UUID __RPC_FAR * Uuid
    );

ASCII版が unsinged char なので、TCHAR 使いつつ ASCII ビルドすると char になる故に型が一致しなくてコンパイルが通らない! orz*1


文字列バッファ要求してるのに unsigned char な事実に狂気を感じる。


キャスト一つかませば問題は解決できるのですが、ちょーっと嫌な感じ。


余談

ちなみに、VS2005 での宣言なんですが…


// VS2005 付属のヘッダーの rpcdec.h(51) ぐらい

typedef __nullterminated unsigned char __RPC_FAR *RPC_CSTR;
typedef __nullterminated unsigned short __RPC_FAR *RPC_WSTR;


// VS2005 付属のヘッダーの rpcdec.h(1880) ぐらい

/* client/server */
RPCRTAPI
RPC_STATUS
RPC_ENTRY
UuidToStringA (
    __in UUID __RPC_FAR *Uuid,
    __deref_out RPC_CSTR __RPC_FAR *StringUuid
    );

/* client/server */
RPCRTAPI
RPC_STATUS
RPC_ENTRY
UuidFromStringA (
    __in RPC_CSTR StringUuid,
    __out UUID __RPC_FAR *Uuid
    );

/* client/server */
RPCRTAPI
RPC_STATUS
RPC_ENTRY
UuidToStringW (
    __in UUID __RPC_FAR *Uuid,
    __deref_out RPC_WSTR __RPC_FAR *StringUuid
    );

/* client/server */
RPCRTAPI
RPC_STATUS
RPC_ENTRY
UuidFromStringW (
    __in_opt RPC_WSTR StringUuid,
    __out UUID __RPC_FAR *Uuid
    );

宣言がちょっと変わってる。orz

んまぁ、結局は unsigned char とかになる故に物凄い厳密に困る訳ではないのですが……

やっぱりちょっといやんな感じ。orz

*1:本当は UNICODE ビルドしたいんだけど、昔ながらのプロジェクトなので今更変更するのは危険なのです…^^;