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したほうが処理速いし見やすい。