X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/532d575bd9baedbbf1c52907a66255975f527530..fd0fca1a25931e51d7e56695875fba5030bf3e07:/src/msw/utils.cpp?ds=inline diff --git a/src/msw/utils.cpp b/src/msw/utils.cpp index 6bf3dfd69b..45f268a510 100644 --- a/src/msw/utils.cpp +++ b/src/msw/utils.cpp @@ -1,5 +1,5 @@ ///////////////////////////////////////////////////////////////////////////// -// Name: msw/utils.cpp +// Name: src/msw/utils.cpp // Purpose: Various utilities // Author: Julian Smart // Modified by: @@ -31,9 +31,11 @@ #include "wx/log.h" #endif //WX_PRECOMP +#include "wx/msw/registry.h" #include "wx/apptrait.h" #include "wx/dynlib.h" #include "wx/dynload.h" +#include "wx/scopeguard.h" #include "wx/confbase.h" // for wxExpandEnvVars() @@ -109,8 +111,13 @@ // ---------------------------------------------------------------------------- // In the WIN.INI file +#if (!defined(USE_NET_API) && !defined(__WXWINCE__)) || defined(__WXMICROWIN__) static const wxChar WX_SECTION[] = wxT("wxWindows"); +#endif + +#if (!defined(USE_NET_API) && !defined(__WXWINCE__)) static const wxChar eUSERNAME[] = wxT("UserName"); +#endif // ============================================================================ // implementation @@ -121,12 +128,11 @@ static const wxChar eUSERNAME[] = wxT("UserName"); // ---------------------------------------------------------------------------- // Get hostname only (without domain name) -bool wxGetHostName(wxChar *buf, int maxSize) +bool wxGetHostName(wxChar *WXUNUSED_IN_WINCE(buf), + int WXUNUSED_IN_WINCE(maxSize)) { #if defined(__WXWINCE__) // TODO-CE - wxUnusedVar(buf); - wxUnusedVar(maxSize); return false; #elif defined(__WIN32__) && !defined(__WXMICROWIN__) DWORD nSize = maxSize; @@ -236,12 +242,11 @@ bool wxGetFullHostName(wxChar *buf, int maxSize) } // Get user ID e.g. jacs -bool wxGetUserId(wxChar *buf, int maxSize) +bool wxGetUserId(wxChar *WXUNUSED_IN_WINCE(buf), + int WXUNUSED_IN_WINCE(maxSize)) { #if defined(__WXWINCE__) // TODO-CE - wxUnusedVar(buf); - wxUnusedVar(maxSize); return false; #elif defined(__WIN32__) && !defined(__WXMICROWIN__) DWORD nSize = maxSize; @@ -263,8 +268,8 @@ bool wxGetUserId(wxChar *buf, int maxSize) // Can't assume we have NIS (PC-NFS) or some other ID daemon // So we ... - if ( (user = wxGetenv(wxT("USER"))) == NULL && - (user = wxGetenv(wxT("LOGNAME"))) == NULL ) + if ( (user = wxGetenv(wxT("USER"))) == NULL && + (user = wxGetenv(wxT("LOGNAME"))) == NULL ) { // Use wxWidgets configuration data (comming soon) GetProfileString(WX_SECTION, eUSERID, default_id, buf, maxSize - 1); @@ -281,11 +286,19 @@ bool wxGetUserId(wxChar *buf, int maxSize) // Get user name e.g. Julian Smart bool wxGetUserName(wxChar *buf, int maxSize) { + wxCHECK_MSG( buf && ( maxSize > 0 ), false, + _T("empty buffer in wxGetUserName") ); #if defined(__WXWINCE__) - // TODO-CE - wxUnusedVar(buf); - wxUnusedVar(maxSize); - return false; + wxLogNull noLog; + wxRegKey key(wxRegKey::HKCU, wxT("ControlPanel\\Owner")); + if(!key.Open(wxRegKey::Read)) + return false; + wxString name; + if(!key.QueryValue(wxT("Owner"),name)) + return false; + wxStrncpy(buf, name.c_str(), maxSize-1); + buf[maxSize-1] = _T('\0'); + return true; #elif defined(USE_NET_API) CHAR szUserName[256]; if ( !wxGetUserId(szUserName, WXSIZEOF(szUserName)) ) @@ -466,13 +479,12 @@ wxChar *wxGetUserHome(const wxString& WXUNUSED(user)) return (wxChar *)wxGetHomeDir(&s_home); } -bool wxGetDiskSpace(const wxString& path, wxLongLong *pTotal, wxLongLong *pFree) +bool wxGetDiskSpace(const wxString& WXUNUSED_IN_WINCE(path), + wxLongLong *WXUNUSED_IN_WINCE(pTotal), + wxLongLong *WXUNUSED_IN_WINCE(pFree)) { #ifdef __WXWINCE__ // TODO-CE - wxUnusedVar(path); - wxUnusedVar(pTotal); - wxUnusedVar(pFree); return false; #else if ( path.empty() ) @@ -582,12 +594,11 @@ bool wxGetDiskSpace(const wxString& path, wxLongLong *pTotal, wxLongLong *pFree) // env vars // ---------------------------------------------------------------------------- -bool wxGetEnv(const wxString& var, wxString *value) +bool wxGetEnv(const wxString& WXUNUSED_IN_WINCE(var), + wxString *WXUNUSED_IN_WINCE(value)) { #ifdef __WXWINCE__ // no environment variables under CE - wxUnusedVar(var); - wxUnusedVar(value); return false; #else // Win32 // first get the size of the buffer @@ -608,11 +619,15 @@ bool wxGetEnv(const wxString& var, wxString *value) #endif // WinCE/32 } -bool wxSetEnv(const wxString& var, const wxChar *value) +bool wxSetEnv(const wxString& WXUNUSED_IN_WINCE(var), + const wxChar *WXUNUSED_IN_WINCE(value)) { // some compilers have putenv() or _putenv() or _wputenv() but it's better // to always use Win32 function directly instead of dealing with them -#if defined(__WIN32__) && !defined(__WXWINCE__) +#ifdef __WXWINCE__ + // no environment variables under CE + return false; +#else if ( !::SetEnvironmentVariable(var, value) ) { wxLogLastError(_T("SetEnvironmentVariable")); @@ -621,11 +636,6 @@ bool wxSetEnv(const wxString& var, const wxChar *value) } return true; -#else // no way to set env vars - // no environment variables under CE - wxUnusedVar(var); - wxUnusedVar(value); - return false; #endif } @@ -685,19 +695,19 @@ int wxKill(long pid, wxSignal sig, wxKillError *krc, int flags) { if ( krc ) { - if ( ::GetLastError() == ERROR_ACCESS_DENIED ) - { - *krc = wxKILL_ACCESS_DENIED; - } - else - { - *krc = wxKILL_NO_PROCESS; - } + // recognize wxKILL_ACCESS_DENIED as special because this doesn't + // mean that the process doesn't exist and this is important for + // wxProcess::Exists() + *krc = ::GetLastError() == ERROR_ACCESS_DENIED + ? wxKILL_ACCESS_DENIED + : wxKILL_NO_PROCESS; } return -1; } + wxON_BLOCK_EXIT1(::CloseHandle, hProcess); + bool ok = true; switch ( sig ) { @@ -720,7 +730,9 @@ int wxKill(long pid, wxSignal sig, wxKillError *krc, int flags) case wxSIGNONE: // do nothing, we just want to test for process existence - break; + if ( krc ) + *krc = wxKILL_OK; + return 0; default: // any other signal means "terminate" @@ -757,9 +769,7 @@ int wxKill(long pid, wxSignal sig, wxKillError *krc, int flags) else // no windows for this PID { if ( krc ) - { *krc = wxKILL_ERROR; - } ok = false; } @@ -767,8 +777,7 @@ int wxKill(long pid, wxSignal sig, wxKillError *krc, int flags) } // the return code - DWORD rc; - + DWORD rc wxDUMMY_INITIALIZE(0); if ( ok ) { // as we wait for a short time, we can use just WaitForSingleObject() @@ -793,45 +802,30 @@ int wxKill(long pid, wxSignal sig, wxKillError *krc, int flags) case WAIT_TIMEOUT: if ( krc ) - { *krc = wxKILL_ERROR; - } rc = STILL_ACTIVE; break; } } - else // !ok - { - // just to suppress the warnings about uninitialized variable - rc = 0; - } - ::CloseHandle(hProcess); // the return code is the same as from Unix kill(): 0 if killed // successfully or -1 on error - // - // be careful to interpret rc correctly: for wxSIGNONE we return success if - // the process exists, for all the other sig values -- if it doesn't - if ( ok && - ((sig == wxSIGNONE) == (rc == STILL_ACTIVE)) ) - { - if ( krc ) - { - *krc = wxKILL_OK; - } + if ( !ok || rc == STILL_ACTIVE ) + return -1; - return 0; - } + if ( krc ) + *krc = wxKILL_OK; - // error - return -1; + return 0; } -HANDLE (WINAPI *lpfCreateToolhelp32Snapshot)(DWORD,DWORD) ; -BOOL (WINAPI *lpfProcess32First)(HANDLE,LPPROCESSENTRY32) ; -BOOL (WINAPI *lpfProcess32Next)(HANDLE,LPPROCESSENTRY32) ; +typedef HANDLE (WINAPI *CreateToolhelp32Snapshot_t)(DWORD,DWORD); +typedef BOOL (WINAPI *Process32_t)(HANDLE,LPPROCESSENTRY32); + +CreateToolhelp32Snapshot_t lpfCreateToolhelp32Snapshot; +Process32_t lpfProcess32First, lpfProcess32Next; static void InitToolHelp32() { @@ -846,9 +840,9 @@ static void InitToolHelp32() lpfProcess32First = NULL; lpfProcess32Next = NULL; - HINSTANCE hInstLib = LoadLibrary( wxT("Kernel32.DLL") ) ; - if( hInstLib == NULL ) - return ; +#if wxUSE_DYNLIB_CLASS + + wxDynamicLibrary dllKernel(_T("kernel32.dll"), wxDL_VERBATIM); // Get procedure addresses. // We are linking to these functions of Kernel32 @@ -856,37 +850,16 @@ static void InitToolHelp32() // this code would fail to load under Windows NT, // which does not have the Toolhelp32 // functions in the Kernel 32. - lpfCreateToolhelp32Snapshot= - (HANDLE(WINAPI *)(DWORD,DWORD)) - GetProcAddress( hInstLib, -#ifdef __WXWINCE__ - wxT("CreateToolhelp32Snapshot") -#else - "CreateToolhelp32Snapshot" -#endif - ) ; + lpfCreateToolhelp32Snapshot = + (CreateToolhelp32Snapshot_t)dllKernel.RawGetSymbol(_T("CreateToolhelp32Snapshot")); - lpfProcess32First= - (BOOL(WINAPI *)(HANDLE,LPPROCESSENTRY32)) - GetProcAddress( hInstLib, -#ifdef __WXWINCE__ - wxT("Process32First") -#else - "Process32First" -#endif - ) ; + lpfProcess32First = + (Process32_t)dllKernel.RawGetSymbol(_T("Process32First")); - lpfProcess32Next= - (BOOL(WINAPI *)(HANDLE,LPPROCESSENTRY32)) - GetProcAddress( hInstLib, -#ifdef __WXWINCE__ - wxT("Process32Next") -#else - "Process32Next" -#endif - ) ; + lpfProcess32Next = + (Process32_t)dllKernel.RawGetSymbol(_T("Process32Next")); - FreeLibrary( hInstLib ) ; +#endif // wxUSE_DYNLIB_CLASS } // By John Skiff @@ -963,11 +936,10 @@ bool wxShell(const wxString& command) } // Shutdown or reboot the PC -bool wxShutdown(wxShutdownFlags wFlags) +bool wxShutdown(wxShutdownFlags WXUNUSED_IN_WINCE(wFlags)) { #ifdef __WXWINCE__ // TODO-CE - wxUnusedVar(wFlags); return false; #elif defined(__WIN32__) bool bOK = true; @@ -1587,4 +1559,3 @@ wxCreateHiddenWindow(LPCTSTR *pclassname, LPCTSTR classname, WNDPROC wndproc) return hwnd; } -