X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/64accea5fae6a4ad5303d2b513043fd39a3b383b..e77cba1a9c2085b15789bbdc3d38697c4670d2a7:/src/msw/utils.cpp?ds=sidebyside diff --git a/src/msw/utils.cpp b/src/msw/utils.cpp index f6097b5801..7779e616da 100644 --- a/src/msw/utils.cpp +++ b/src/msw/utils.cpp @@ -36,6 +36,7 @@ #include "wx/dynlib.h" #include "wx/dynload.h" #include "wx/scopeguard.h" +#include "wx/filename.h" #include "wx/confbase.h" // for wxExpandEnvVars() @@ -431,7 +432,7 @@ const wxChar* wxGetHomeDir(wxString *pstr) else // fall back to the program directory { // extract the directory component of the program file name - wxSplitPath(wxGetFullModuleName(), &strDir, NULL, NULL); + wxFileName::SplitPath(wxGetFullModuleName(), &strDir, NULL, NULL); } #endif // UNIX/Win @@ -597,24 +598,43 @@ bool wxGetEnv(const wxString& WXUNUSED_IN_WINCE(var), #endif // WinCE/32 } -bool wxDoSetEnv(const wxString& WXUNUSED_IN_WINCE(var), - const wxChar *WXUNUSED_IN_WINCE(value)) +bool wxDoSetEnv(const wxString& var, const wxChar *value) { - // some compilers have putenv() or _putenv() or _wputenv() but it's better - // to always use Win32 function directly instead of dealing with them #ifdef __WXWINCE__ // no environment variables under CE + wxUnusedVar(var); + wxUnusedVar(value); return false; -#else +#else // !__WXWINCE__ + // update the CRT environment if possible as people expect getenv() to also + // work and it is not affected by Win32 SetEnvironmentVariable() call (OTOH + // the CRT does use Win32 call to update the process environment block so + // there is no need to call it) + // + // TODO: add checks for the other compilers (and update wxSetEnv() + // documentation in interface/wx/utils.h accordingly) +#if defined(__VISUALC__) + // notice that Microsoft _putenv() has different semantics from POSIX + // function with almost the same name: in particular it makes a copy of the + // string instead of using it as part of environment so we can safely call + // it here without going through all the troubles with wxSetEnvModule as in + // src/unix/utilsunx.cpp + wxString envstr = var; + envstr += '='; + if ( value ) + envstr += value; + _tputenv(envstr.t_str()); +#else // other compiler if ( !::SetEnvironmentVariable(var.t_str(), value) ) { wxLogLastError(_T("SetEnvironmentVariable")); return false; } +#endif // compiler return true; -#endif +#endif // __WXWINCE__/!__WXWINCE__ } bool wxSetEnv(const wxString& variable, const wxString& value) @@ -642,7 +662,7 @@ struct wxFindByPidParams // the PID we're looking from DWORD pid; - DECLARE_NO_COPY_CLASS(wxFindByPidParams) + wxDECLARE_NO_COPY_CLASS(wxFindByPidParams); }; // wxKill helper: EnumWindows() callback which is used to find the first (top @@ -944,18 +964,23 @@ bool wxShutdown(int WXUNUSED_IN_WINCE(flags)) TOKEN_PRIVILEGES tkp; // Get the LUID for the shutdown privilege. - ::LookupPrivilegeValue(NULL, SE_SHUTDOWN_NAME, - &tkp.Privileges[0].Luid); + bOK = ::LookupPrivilegeValue(NULL, SE_SHUTDOWN_NAME, + &tkp.Privileges[0].Luid) != 0; - tkp.PrivilegeCount = 1; // one privilege to set - tkp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED; + if ( bOK ) + { + tkp.PrivilegeCount = 1; // one privilege to set + tkp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED; + + // Get the shutdown privilege for this process. + ::AdjustTokenPrivileges(hToken, FALSE, &tkp, 0, + (PTOKEN_PRIVILEGES)NULL, 0); - // Get the shutdown privilege for this process. - ::AdjustTokenPrivileges(hToken, FALSE, &tkp, 0, - (PTOKEN_PRIVILEGES)NULL, 0); + // Cannot test the return value of AdjustTokenPrivileges. + bOK = ::GetLastError() == ERROR_SUCCESS; + } - // Cannot test the return value of AdjustTokenPrivileges. - bOK = ::GetLastError() == ERROR_SUCCESS; + ::CloseHandle(hToken); } }