2017-05-16 4 views
1

私はstd :: stringからC++でGUID構造体(https://msdn.microsoft.com/fr-fr/library/windows/desktop/aa373931(v=vs.85).aspx)を埋めようとしています。C++でGUIDを埋めているときのエラー

私はexemple(文字列は、実際の関数のパラメータに渡されます)として次の文字列をしようとしている:"eec5ad98-8080-425f-922a-dabf3de3f69a" が、まだ私はまだ空のGUIDを取得します。

私は、関数CLSIDFromStringは、MSDNフォーラムでこの目的のために使用することができました。https://social.msdn.microsoft.com/Forums/en-US/58fbd857-edef-4e77-8355-c426523cf06f/how-to-convert-cstring-to-guid-?forum=vcmfcatl

コード:

int main() 
{ 
    std::string sGuid = "eec5ad98-8080-425f-922a-dabf3de3f69a"; 
    fromStringToGuid(sGuid); 
} 

GUID fromStringToGuid(std::string sGuid) 
{ 
    GUID guid; 
    LPCOLESTR lpcGuid = (LPWSTR) sGuid.c_str(); 

    std::cout << "LpcGuid : " << lpcGuid << std::endl; 
    std::cout << "String GUID : " << sGuid << std::endl; 

    CLSIDFromString(lpcGuid, &guid); 

    std::cout << "GUID : " << std::hex << guid.Data1 << " " << guid.Data2 << " " << guid.Data3 << " " << guid.Data4; 

    return guid; 
} 

結果:

LpcGuid : 0428ABC0 
String GUID : eec5ad98-8080-425f-922a-dabf3de3f69a 
GUID : 0 0 0 i = 0 

GUIDを持つべきです例えば、0の代わりにeec5ad98の10進値。

EDIT:

試み@JeffDavies方法:

GUID guid; 
const OLECHAR aoleGuid[] = OLESTR("eec5ad98-8080-425f-922a-dabf3de3f69a"); 

std::cout << "GUID before : " << guid.Data1 << " " << guid.Data2 << " " << guid.Data3 << " " << guid.Data4 << std::endl; 
CLSIDFromProgID(aoleGuid, &guid); 
std::cout << "GUID after : " << guid.Data1 << " " << guid.Data2 << " " << guid.Data3 << " " << guid.Data4 << std::endl; 

Iは、関数の前にGUIDのプリントを加え、私は同じ結果を有する:に従って

GUID before : 1505448 30982 184 `3À 
GUID after : 0 0 0 i = 0 
+0

sGuidあなたはその 'c_str()' このようにキャストしたい場合は、 'wstringの' すべきです。 –

+0

キャストがコンパイラに「あなたがいないところでさえ私がやっていることを知っていることを知っている」と言っているちょっとしたケース。デバッガで 'lpcGuid'を見たことがありますか?私はいくつかのランダムな中国語の文字列だと思う。 – MSalters

+0

@MSaltersランダムに変換を行っていない、このスタックオーバーフローのコメントでそれを見た:http://stackoverflow.com/a/23973050/5271942 – sh5164

答えて

0

私は何かを見つけることができませんでしたので、私はGUIDフォーマットのすべてについての研究をしたので、私は、私は同じ問題を抱えて次の人のために何をしたか掲載します私が持っていたように。

GUID構造は、4つの変数で構成されている:

  • のData1(unsigned long型)
  • データ2(unsigned long型)
  • データ3(unsigned long型)
  • DATA4 [8](unsigned long型配列)

文字列を "00000000-0000-0000-0000-000000000000"という形式で分解するには、最初の00000000をDat a1は、Data2の次の0000とData3の次の0000で、すべて16進数から10進の変換になります。

data4の場合、2番目の最初のバイトは次の0000に対応し、その他は000000000000の部分の2つずつの数字 です。

C++コード:

GUID   fromStringToGUID(std::string strguid) 
{ 
    GUID guid; 

    int i = 2; 
    std::vector<std::string> bytes = split(strguid, "-"); 
    std::string last = bytes[bytes.size() - 1]; 

    guid.Data1 = fromStringToHex(bytes[0]); 
    guid.Data2 = fromStringToHex(bytes[1]); 
    guid.Data3 = fromStringToHex(bytes[2]); 

    guid.Data4[0] = fromStringToHex(bytes[3].substr(0, 2)); 
    guid.Data4[1] = fromStringToHex(bytes[3].substr(2, 2)); 

    for (int j = 0; j < last.size(); j+=2) 
    { 
     guid.Data4[i] = fromStringToHex(last.substr(j, 2)); 
     i++; 
    } 
    return guid; 
} 

std::vector<std::string> split(std::string str, std::string sep) 
{ 
    std::vector<std::string> result; 
    int from; 
    int i; 
    int to; 

    from = 0; 
    to = 0; 
    for (i = 0; i < str.size(); i++) 
    { 
     if (str[i] == sep[0]) 
     { 
      to = i; 
      result.push_back(str.substr(from, to - from)); 
      from = i + 1; 
     } 
    } 
    result.push_back(str.substr(from, to - from)); 
    return result; 
} 

unsigned long fromStringToHex(std::string number) 
{ 
    std::stringstream sts; 
    unsigned long value; 

    sts << number; 
    sts >> std::hex >> value; 

    return value; 
} 
0

をこのページは、これを行うための1つの方法である必要があります:(キャストは正しく動作していないようですので、おそらく正しいフォーマットのUnicodeではありません。それはUTF16を探しているスメが、あるかもしれないUTF8)

// substitute in std::string for the literal 
const OLECHAR wszGuid[] = OLESTR("eec5ad98-8080-425f-922a-dabf3de3f69a"); 
CLSIDFromString(wszGuid, &guid); 

http://forums.codeguru.com/showthread.php?224120-What-s-the-type-quot-LPCOLESTR-quot

これがchar/w_charがautoswitchedされていることを意味しますが、メモリはおそらく、(それゆえOLESTRで包む)特別な方法で割り当てられている必要がありますc_strは特別な方法では割り当てません。

What's the meaning of BSTR, LPCOLESTR, and others?

+0

これはうまくいかず、コードと結果を見ることができるように私の投稿を編集しました。 – sh5164

+0

@ sh5164偶然、CLSIDFromStringではなくCLSIDFromProgIDを使用していました。私はそのレジストリか何かのクラスを見つけることを試みると思う。 –

0

https://msdn.microsoft.com/en-us/library/windows/hardware/ff542998(v=vs.85).aspx

//#include <initguid.h> //application call header 
//#include <guiddef.h> //macro definition 
DEFINE_GUID(GUID_BUS_TYPE_PCMCIA, 0x09343630L, 0xaf9f, 0x11d0, 
    0x92,0x9f, 0x00, 0xc0, 0x4f, 0xc3, 0x40, 0xb1); 
+0

静的なGUIDを宣言する場合に便利です。正確に質問を編集します。このメソッドを必要なだけ多く使用する必要があります。 – sh5164

関連する問題