2017-02-10 63 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