2017-02-10 3 views
-1

erzeugen Ich möchte einen temporären Dateinamen, der mit der Erweiterung .ico mit der Windows-C-API endet.temporäre Dateinamen mit .ico Erweiterung auf Windows

Ich habe GetTempFileName versucht, aber dann kann ich die Erweiterung nicht steuern.

+0

Warum nicht 'GetTempFileName' und dann verketten' „ICO“ ', um es? – DyZ

+0

@ DYZ: Weil das bricht, warum Sie "GetTempFileName" an erster Stelle verwenden (d. H. Der zurückgegebene Dateiname ist nicht länger garantiert eindeutig). – IInspectable

+0

Ich übergebe die Datei später an LoadImage, die die Erweiterung zu verwenden scheint, um zu entscheiden, in welchem ​​Format die Datei ist. Deshalb brauche ich die Erweiterung ".ico". –

Antwort

2

Die einzigen Gründe, warum Sie GetTempFileName verwenden möchten, ist, weil es garantiert, einen eindeutigen Dateinamen zu erzeugen. Das Anhängen einer beliebigen Erweiterung bricht diese Invariante, so dass dies keine Lösung ist.

Sie benötigen also eine Lösung, die einen eindeutigen Dateinamen erzeugt. Mit Hilfe der String-Darstellung eines GUID ist ein gemeinsamer Weg, dass zu bekommen:

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

Eine C++ Antwort auf eine C Frage? Hmm ... – alk

+0

@alk: Ich bin mir ziemlich sicher, dass sich das geändert hat, als ich anfing, die Frage zu beantworten und die Antwort zu veröffentlichen. Wenn Sie eine C-Lösung benötigen, wissen Sie, welche API-Aufrufe verwendet werden sollen. – IInspectable

Verwandte Themen