62 lines
1.9 KiB
C
62 lines
1.9 KiB
C
#include "priv.h"
|
|
|
|
// Do not build this file if on Win9X or NT4
|
|
#ifndef DOWNLEVEL_PLATFORM
|
|
|
|
|
|
//============================================================================
|
|
// This file contains a bunch of Unicode/Ansi thunks to handle calling
|
|
// some internal functions that on Windows 95 the strings are Ansi,
|
|
// whereas the string on NT are unicode
|
|
//============================================================================
|
|
|
|
#define PFN_FIRSTTIME ((void *)-1)
|
|
|
|
// First undefine everything that we are intercepting as to not forward back to us...
|
|
#undef SHGetSpecialFolderPath
|
|
|
|
|
|
|
|
// Explicit prototype because only the A/W prototypes exist in the headers
|
|
STDAPI_(BOOL) SHGetSpecialFolderPath(HWND hwndOwner, LPTSTR lpszPath, int nFolder, BOOL fCreate);
|
|
|
|
typedef BOOL (WINAPI * PFNGETSPECIALFOLDERPATH)(HWND hwndOwner, LPTSTR pwszPath, int nFolder, BOOL fCreate);
|
|
|
|
BOOL _AorW_SHGetSpecialFolderPath(HWND hwndOwner, /*OUT*/ LPTSTR pszPath, int nFolder, BOOL fCreate)
|
|
{
|
|
// The classic shell exported a non-decorated SHGetSpecialFolderPath
|
|
// that took TCHAR parameters. The IE4 shell exported additional
|
|
// decorated versions. Try to use the explicit decorated versions if
|
|
// we can.
|
|
|
|
static PFNGETSPECIALFOLDERPATH s_pfn = PFN_FIRSTTIME;
|
|
|
|
*pszPath = 0;
|
|
|
|
if (PFN_FIRSTTIME == s_pfn)
|
|
{
|
|
HINSTANCE hinst = LoadLibraryA("SHELL32.DLL");
|
|
if (hinst)
|
|
{
|
|
#ifdef UNICODE
|
|
s_pfn = (PFNGETSPECIALFOLDERPATH)GetProcAddress(hinst, "SHGetSpecialFolderPathW");
|
|
#else
|
|
s_pfn = (PFNGETSPECIALFOLDERPATH)GetProcAddress(hinst, "SHGetSpecialFolderPathA");
|
|
#endif
|
|
}
|
|
else
|
|
s_pfn = NULL;
|
|
}
|
|
|
|
if (s_pfn)
|
|
{
|
|
return s_pfn(hwndOwner, pszPath, nFolder, fCreate);
|
|
}
|
|
else
|
|
{
|
|
return SHGetSpecialFolderPath(hwndOwner, pszPath, nFolder, fCreate);
|
|
}
|
|
}
|
|
|
|
#endif //DOWNLEVEL_PLATFORM
|