GUIDの変換ってなんで標準関数で用意されてないんだ...w

RtlStringFromGUID() はカーネルモード呼び出しだし、
StringFromIID() は使い方不明w
このあたりを使うのかな!!!

WINOLEAPI StringFromCLSID(IN REFCLSID rclsid, OUT LPOLESTR FAR* lplpsz);
WINOLEAPI CLSIDFromString(IN LPOLESTR lpsz, OUT LPCLSID pclsid);
WINOLEAPI StringFromIID(IN REFIID rclsid, OUT LPOLESTR FAR* lplpsz);
WINOLEAPI IIDFromString(IN LPOLESTR lpsz, OUT LPIID lpiid);

まぁよくわからんので、以下のようにしたゲソ

// BSD/MIT license
static UCHAR XtoB(TCHAR c)
{
	if(c==_T('0')) return 0x00;
	if(c==_T('1')) return 0x01;
	if(c==_T('2')) return 0x02;
	if(c==_T('3')) return 0x03;
	if(c==_T('4')) return 0x04;
	if(c==_T('5')) return 0x05;
	if(c==_T('6')) return 0x06;
	if(c==_T('7')) return 0x07;
	if(c==_T('8')) return 0x08;
	if(c==_T('9')) return 0x09;
	if(c==_T('A')) return 0x0A;
	if(c==_T('B')) return 0x0B;
	if(c==_T('C')) return 0x0C;
	if(c==_T('D')) return 0x0D;
	if(c==_T('E')) return 0x0E;
	if(c==_T('F')) return 0x0F;
	if(c==_T('a')) return 0x0a;
	if(c==_T('b')) return 0x0b;
	if(c==_T('c')) return 0x0c;
	if(c==_T('d')) return 0x0d;
	if(c==_T('e')) return 0x0e;
	if(c==_T('f')) return 0x0f;
	return 0;
}

BOOL StrToGuid(LPCTSTR strGUID, GUID *guid)
{
	//                01234567
	//+		strGUID	"{XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX}"
	//+              01234567890123456789012345678901234567890
	//+              0         1         2         3         4

	if(  strGUID[0] != _T('{')) return FALSE;
	if( strGUID[37] != _T('}')) return FALSE;
	if(  strGUID[9] != _T('-')) return FALSE;
	if( strGUID[14] != _T('-')) return FALSE;
	if( strGUID[19] != _T('-')) return FALSE; 
	if( strGUID[24] != _T('-')) return FALSE;

	guid->Data1 = (XtoB(strGUID[1])<<28)+(XtoB(strGUID[2])<<24)+
		(XtoB(strGUID[3])<<20)+(XtoB(strGUID[4])<<16)+
		(XtoB(strGUID[5])<<12)+(XtoB(strGUID[6])<<8)+
		(XtoB(strGUID[7])<<4)+XtoB(strGUID[8]);

	guid->Data2 = 		(XtoB(strGUID[10])<<12)+(XtoB(strGUID[11])<<8)+
		(XtoB(strGUID[12])<<4)+XtoB(strGUID[13]);

	guid->Data3 = 		(XtoB(strGUID[15])<<12)+(XtoB(strGUID[16])<<8)+
		(XtoB(strGUID[17])<<4)+XtoB(strGUID[18]);

	guid->Data4[0] = (XtoB(strGUID[20])<<4) + XtoB(strGUID[21]) ;
	guid->Data4[1] = (XtoB(strGUID[22])<<4) + XtoB(strGUID[23]) ;
	guid->Data4[2] = (XtoB(strGUID[25])<<4) + XtoB(strGUID[26]) ;
	guid->Data4[3] = (XtoB(strGUID[27])<<4) + XtoB(strGUID[28]) ;
	guid->Data4[4] = (XtoB(strGUID[29])<<4) + XtoB(strGUID[30]) ;
	guid->Data4[5] = (XtoB(strGUID[31])<<4) + XtoB(strGUID[32]) ;
	guid->Data4[6] = (XtoB(strGUID[33])<<4) + XtoB(strGUID[34]) ;
	guid->Data4[7] = (XtoB(strGUID[35])<<4) + XtoB(strGUID[36]) ;
	return TRUE;
}
BOOL GuidToStr(CString &strGUID, const GUID *guid)
{
	strGUID.Format(
		_T("{%08X-%04X-%04X-%02X%02X-%02X%02X%02X%02X%02X%02X}"),
		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]);
	return TRUE;
}

ニブル読みにした。
error C2664: 'StrToGuid' : 1 番目の引数を 'CString' から 'LPTSTR' に変換できません。と言われなくて済むメリット!
XtoBは t="0123456789ABCDEF0123456789abcdef"; (strchr(t,x) - x) % 17 とどっちにしようか悩んだがw
コードをシンプルに書くのはふつうにifでreturnしたほうが処理速いし見やすい。