2017-02-10 10 views
-1

Я хочу сгенерировать временное имя файла, которое заканчивается расширением .ico, используя API Windows C.генерировать временное имя файла с расширением .ico на окнах

Я попытался использовать GetTempFileName, но тогда я не могу управлять расширением.

+0

Почему бы не использовать 'GetTempFileName', а затем сцепить' «.ico» 'к нему? – DyZ

+0

@DYZ: Потому что это ломается, почему вы сначала используете 'GetTempFileName' (т. Е. Имя возвращаемого файла больше не будет гарантировано уникальным). – IInspectable

+0

Я передаю файл позже LoadImage, который, как представляется, использует расширение, чтобы определить, в каком формате находится файл. Вот почему мне нужно расширение, которое будет '.ico'. –

ответ

2

Единственными причинами, по которым вы хотите использовать GetTempFileName, является то, что он гарантирует создание уникального имени файла. Добавление произвольного расширения нарушает этот инвариант, так что это не решение.

Для этого вам нужно решение, которое создает уникальное имя файла. Используя строковое представление GUID является обычным способом, чтобы получить, что:

std::wstring GetUniqueFileName(const std::wstring& extension = std::wstring()) { 
    GUID guid{ 0 }; 
    _com_util::CheckError(::CoCreateGuid(&guid)); 
    wchar_t buffer[39]; 
    if (!::StringFromGUID2(guid, buffer, sizeof(buffer)/sizeof(*buffer))) { 
     throw std::runtime_error("StringFromGUID2() failed."); 
    } 
    std::wstring retVal{ buffer }; 
    retVal += extension; 
    return retVal; 
} 
+0

Ответ C++ на вопрос C? Хмм ... – alk

+0

@alk: Я уверен, что это было изменено между мной, начиная отвечать на вопрос и публиковать ответ. Если вам нужен C-решение, вы знаете, какие API-вызовы использовать. – IInspectable