2017-02-10 77 views
-1

我希望生成一個臨時文件名,以擴展.ico使用Windows C API結尾。在Windows上生成臨時文件名與.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