fixed GetLongPath(): it never used ::GetLongPath() before and didn't work at all when called for the first time

git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@33950 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
Vadim Zeitlin
2005-05-04 19:36:25 +00:00
parent 6c0b29749c
commit 2f3d9587ab
2 changed files with 97 additions and 99 deletions

View File

@@ -26,7 +26,8 @@ wxMSW:
- Worked around an apparent bug in deferred window positioning (moving a - Worked around an apparent bug in deferred window positioning (moving a
window from (x, y) to (a, b) and back to (x, y) misses the last step) by window from (x, y) to (a, b) and back to (x, y) misses the last step) by
checking window positions against corresponding sizer state, if any. checking window positions against corresponding sizer state, if any.
- A control's text colour now reflects the system colour setting. - A control's text colour now reflects the system colour setting again.
- Fixed wxFileName::GetLongPath() to behave correctly during the first call too
wxMac: wxMac:

View File

@@ -1502,27 +1502,26 @@ wxString wxFileName::GetFullPath( wxPathFormat format ) const
// Return the short form of the path (returns identity on non-Windows platforms) // Return the short form of the path (returns identity on non-Windows platforms)
wxString wxFileName::GetShortPath() const wxString wxFileName::GetShortPath() const
{ {
#if defined(__WXMSW__) && defined(__WIN32__) && !defined(__WXMICROWIN__) && !defined(__WXWINCE__)
wxString path(GetFullPath()); wxString path(GetFullPath());
wxString pathOut;
#if defined(__WXMSW__) && defined(__WIN32__) && !defined(__WXMICROWIN__) && !defined(__WXWINCE__)
DWORD sz = ::GetShortPathName(path, NULL, 0); DWORD sz = ::GetShortPathName(path, NULL, 0);
bool ok = sz != 0; if ( sz != 0 )
if ( ok )
{ {
ok = ::GetShortPathName wxString pathOut;
if ( ::GetShortPathName
( (
path, path,
wxStringBuffer(pathOut, sz), wxStringBuffer(pathOut, sz),
sz sz
) != 0; ) != 0 )
} {
if (ok)
return pathOut; return pathOut;
}
}
#endif // Windows
return path; return path;
#else
return GetFullPath();
#endif
} }
// Return the long form of the path (returns identity on non-Windows platforms) // Return the long form of the path (returns identity on non-Windows platforms)
@@ -1532,60 +1531,59 @@ wxString wxFileName::GetLongPath() const
path = GetFullPath(); path = GetFullPath();
#if defined(__WIN32__) && !defined(__WXMICROWIN__) #if defined(__WIN32__) && !defined(__WXMICROWIN__)
bool success = false;
#if wxUSE_DYNAMIC_LOADER #if wxUSE_DYNAMIC_LOADER
typedef DWORD (WINAPI *GET_LONG_PATH_NAME)(const wxChar *, wxChar *, DWORD); typedef DWORD (WINAPI *GET_LONG_PATH_NAME)(const wxChar *, wxChar *, DWORD);
// this is MT-safe as in the worst case we're going to resolve the function
// twice -- but as the result is the same in both threads, it's ok
static GET_LONG_PATH_NAME s_pfnGetLongPathName = NULL;
if ( !s_pfnGetLongPathName )
{
static bool s_triedToLoad = false; static bool s_triedToLoad = false;
if ( !s_triedToLoad ) if ( !s_triedToLoad )
{ {
// suppress the errors about missing GetLongPathName[AW]
wxLogNull noLog;
s_triedToLoad = true; s_triedToLoad = true;
wxDynamicLibrary dllKernel(_T("kernel32")); wxDynamicLibrary dllKernel(_T("kernel32"));
if ( dllKernel.IsLoaded() )
{
// may succeed or fail depending on the Windows version
static GET_LONG_PATH_NAME s_pfnGetLongPathName = NULL;
#ifdef _UNICODE #ifdef _UNICODE
s_pfnGetLongPathName = (GET_LONG_PATH_NAME) dllKernel.GetSymbol(_T("GetLongPathNameW")); #define ADD_STR_SFX(name) L#name L"W"
#else #else
s_pfnGetLongPathName = (GET_LONG_PATH_NAME) dllKernel.GetSymbol(_T("GetLongPathNameA")); #define ADD_STR_SFX(name) #name "A"
#endif #endif
if ( dllKernel.HasSymbol(ADD_STR_SFX(GetLongPathName)) )
{
s_pfnGetLongPathName = (GET_LONG_PATH_NAME)
dllKernel.GetSymbol(ADD_STR_SFX(GetLongPathName));
}
// note that kernel32.dll can be unloaded, it stays in memory
// anyhow as all Win32 programs link to it and so it's safe to call
// GetLongPathName() even after unloading it
}
}
if ( s_pfnGetLongPathName ) if ( s_pfnGetLongPathName )
{ {
DWORD dwSize = (*s_pfnGetLongPathName)(path, NULL, 0); DWORD dwSize = (*s_pfnGetLongPathName)(path, NULL, 0);
bool ok = dwSize > 0; if ( dwSize > 0 )
if ( ok )
{ {
DWORD sz = (*s_pfnGetLongPathName)(path, NULL, 0); if ( (*s_pfnGetLongPathName)
ok = sz != 0;
if ( ok )
{
ok = (*s_pfnGetLongPathName)
( (
path, path,
wxStringBuffer(pathOut, sz), wxStringBuffer(pathOut, dwSize),
sz dwSize
) != 0; ) != 0 )
success = true; {
}
}
}
}
}
if (success)
return pathOut; return pathOut;
}
}
}
#endif // wxUSE_DYNAMIC_LOADER #endif // wxUSE_DYNAMIC_LOADER
if (!success)
{
// The OS didn't support GetLongPathName, or some other error. // The OS didn't support GetLongPathName, or some other error.
// We need to call FindFirstFile on each component in turn. // We need to call FindFirstFile on each component in turn.
@@ -1642,7 +1640,6 @@ wxString wxFileName::GetLongPath() const
::FindClose(hFind); ::FindClose(hFind);
} }
}
#else // !Win32 #else // !Win32
pathOut = path; pathOut = path;
#endif // Win32/!Win32 #endif // Win32/!Win32