OSDN Git Service

Merge branch 'master' of https://github.com/winmerge/winmerge into jp
[winmerge-jp/winmerge-jp.git] / Src / Environment.cpp
index 3a83376..327f6d7 100644 (file)
@@ -4,6 +4,7 @@
  * @brief Environment related routines.
  */
 
+#include "pch.h"
 #define POCO_NO_UNWINDOWS 1
 #include "Environment.h"
 #include <windows.h>
@@ -69,12 +70,17 @@ String GetTemporaryFileName(const String& lpPathName, const String& lpPrefixStri
        if (lpPathName.length() > MAX_PATH-14)
                return _T(""); // failure
        int rtn = ::GetTempFileName(lpPathName.c_str(), lpPrefixString.c_str(), 0, buffer);
-       if (!rtn)
+       if (rtn == 0)
        {
-               int err = GetLastError();
-               if (pnerr != nullptr)
-                       *pnerr = err;
-               return _T("");
+               paths::CreateIfNeeded(lpPathName);
+               rtn = ::GetTempFileName(lpPathName.c_str(), lpPrefixString.c_str(), 0, buffer);
+               if (rtn == 0)
+               {
+                       int err = GetLastError();
+                       if (pnerr != nullptr)
+                               *pnerr = err;
+                       return _T("");
+               }
        }
        return buffer;
 }
@@ -176,6 +182,19 @@ static bool launchProgram(const String& sCmd, WORD wShowWindow)
        return true;
 }
 
+String ExpandEnvironmentVariables(const String& text)
+{
+       TCHAR buf[512];
+       buf[0] = 0;
+       const unsigned size = sizeof(buf) / sizeof(buf[0]);
+       const unsigned expandedSize = ::ExpandEnvironmentStrings(text.c_str(), buf, size);
+       if (expandedSize <= size)
+               return buf;
+       std::vector<TCHAR> newbuf(expandedSize);
+       ::ExpandEnvironmentStrings(text.c_str(), newbuf.data(), expandedSize);
+       return newbuf.data();
+}
+
 /**
  * @brief Load registry keys from .reg file if existing .reg file
  */