Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Общие вопросы > GUIDfromString


Автор: Miyka 22.7.2011, 09:45
Здравствуйте. Не очень понимаю как пользоватся функцией GUIDFromString. Добавил ObjBase.h, но компилятор все равно говорит что функция не инициализованна. Будет ли рабоать такой код?
Код

    LPGUID GUID = 0;
    char sGUID[] = "11111111-1111-1111-1111-111111111111"
    GUIDFromString(sGUID, GUID);

    printf("%s",GUID);

Спасибо.

Автор: borisbn 22.7.2011, 14:04
Miyka, 
1. LPGUID GUID = 0;
    LP означает длинный указатель (long pointer), т.е. ты просто объявил указатель, и сказал, что он не будет никуда показывать ( = 0 )

    Делать нужно так
Код

GUID guid;

2. char sGUID[] = "11111111-1111-1111-1111-111111111111"
    в конце должна быть точка с запятой, и в доке к функции сказано
Цитата

  [in] A pointer to the null-terminated string to convert. The string should be in the following form: 
       {00000000-0000-0000-0000-000000000000}

    т.е. у тебя ещё и внутри ковычек фигурных скобок не хватает. др. словами должно быть так
Код

char sGUID[] = "{11111111-1111-1111-1111-111111111111}";

3. Вызов функции теперь должен выглядеть так
Код

GUIDFromString( sGUID, & guid );

4. printf("%s",GUID);
    так нельзя. printf умеет печатать только простые типы.
    печатать нужно так
Код

printf( "%X-%X-%X-%X%X%X%X%X%X%X%X", 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 ]
);

итого (как должно было быть) :

Код

GUID guid;
char sGUID[] = "{11111111-1111-1111-1111-111111111111}";
GUIDFromString( sGUID, & guid );
printf( "%X-%X-%X-%X%X%X%X%X%X%X%X", 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 ]
);



P.S. Только щаз заметил
Цитата

Deprecated. Converts a string to a GUID. The supported interface for converting a string to a GUID is IIDFromString.


так что придётся переписывать :(

Автор: Miyka 22.7.2011, 16:54
Спасибо, я понял. Про точку с запятой извинюясь, потому что эту строку писал уже тут. Эту строку я считываю с экрана и теперь не очень понимаю как лучше добавить ковычки, но это не критично. Критично то, что эту функцию, компилятор не знает, какие библиотеки надо подключить?

Автор: bsa 22.7.2011, 17:00
подозреваю, что shell.h

Автор: borisbn 22.7.2011, 17:01
Цитата(borisbn @  22.7.2011,  14:04 Найти цитируемый пост)

Только щаз заметил
Deprecated. Converts a string to a GUID. The supported interface for converting a string to a GUID is IIDFromString.
так что придётся переписывать :(

Цитата

[GUIDFromString is available through Windows XP with Service Pack 2 (SP2) or Windows Vista. It might be altered or unavailable in subsequent versions. Applications should use CLSIDFromString or IIDFromString in place of this function.]

см. http://msdn.microsoft.com/en-us/library/ms680589(v=vs.85).aspx

Автор: Miyka 22.7.2011, 18:23
CLSIDFromString выводит 0-0-0-00000000. 
Правильно ли я понимаю, что входящая страко это 32 символа т.е. 255 бит, а выходящая это 16 символов т.е. 128 бит?
Мне нужно GUID введенный пользователем, выводить в файл в таком виде что вы его понял комп, другими словами в 128 битным значением








Автор: borisbn 22.7.2011, 18:33
нули выводятся из-за того, что нет фигурных скобок. их нужно добавить
Код

CLSID guid;
std::string quoteGUID = std::string( "{" ) + sGUID + std::string( "}" );
CLSIDFromString( quoteGUID.c_str(), & guid );

Цитата(Miyka @  22.7.2011,  18:23 Найти цитируемый пост)
выводить в файл в таком виде что вы его понял комп, другими словами в 128 битным значением

тогда printf тебе не нужен, т.к. он выводит в символьном виде...
пиши в файл в бинарном
Код

FILE * f_out = fopen( "out_file_name.guid", "wb" );
if ( f_out ) {
    fwrite( &guid, sizeof( guid ), 1, f_fout );
    fclose( f_out );
}

Автор: Miyka 22.7.2011, 19:45
char sGUID[] = "{11111111-1111-1111-1111-111111112222}"; 
А так нельзя?

Автор: borisbn 22.7.2011, 20:18
Цитата(Miyka @  22.7.2011,  19:45 Найти цитируемый пост)
char sGUID[] = "{11111111-1111-1111-1111-111111112222}"; А так нельзя?

можно, но ты же сам говорил

Цитата(Miyka @  22.7.2011,  18:23 Найти цитируемый пост)
Мне нужно GUID введенный пользователем


Автор: Miyka 22.7.2011, 20:47
Это для теста и все равно вылазят нули.

Автор: volatile 23.7.2011, 02:34
Цитата(Miyka @  22.7.2011,  20:47 Найти цитируемый пост)
Это для теста и все равно вылазят нули. 

Все должно работать!
Код

wchar_t sGUID[] = L"{11111111-1111-1111-1111-111111112222}";
GUID guid;
IIDFromString (sGUID, &guid);
printf( "%X-%X-%X-%X%X%X%X%X%X%X%X", 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 ]
);

код скомпоновал из вышеприведенных фрагментов, так что копирайты сохраняются за borisbn.
мой здесь только 'L' (перед строкой.)
на этот L - лицензия "public domain" smile 


Автор: Miyka 23.7.2011, 20:18
Короче под мои задачи пришлось написать свой конвертер. Большое спасибо всем ответившим. Последний вариант рабочий. Еще раз спасибо smile

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)