Kaydet (Commit) 515d2579 authored tarafından Mike Kaganski's avatar Mike Kaganski

Replace legacy dynamically-loaded functions with statically linked ones

We don't need the dynamic load complexity for these now with baseline
Windows version being Windows 7 SP1. Stuff used only for compatibility
with older versions was dumped.

Change-Id: I810f271796cfd875cfa18a3081c9ad444fe57b3e
Reviewed-on: https://gerrit.libreoffice.org/70321
Tested-by: Jenkins
Reviewed-by: 's avatarMike Kaganski <mike.kaganski@collabora.com>
üst edd163b5
......@@ -65,50 +65,6 @@ namespace dxcanvas
{
namespace
{
// monitorSupport
class monitorSupport
{
public:
monitorSupport() :
mhLibrary(LoadLibraryW(L"user32.dll")),
mpMonitorFromWindow(nullptr)
{
if(mhLibrary)
mpMonitorFromWindow = reinterpret_cast<fMonitorFromWindow>(
GetProcAddress(
mhLibrary,"MonitorFromWindow"));
}
~monitorSupport()
{
if(mhLibrary)
FreeLibrary(mhLibrary);
mhLibrary=nullptr;
}
HMONITOR MonitorFromWindow( HWND hwnd )
{
// return adapter_default in case something went wrong...
if(!mpMonitorFromWindow)
return HMONITOR(nullptr);
// MONITOR_DEFAULTTONEAREST
const DWORD dwFlags(0x00000002);
return mpMonitorFromWindow(hwnd,dwFlags);
}
private:
HINSTANCE mhLibrary;
typedef HMONITOR (WINAPI *fMonitorFromWindow )( HWND hwnd, DWORD dwFlags );
fMonitorFromWindow mpMonitorFromWindow;
};
monitorSupport aMonitorSupport;
class DXRenderModule;
......@@ -1100,7 +1056,7 @@ namespace dxcanvas
UINT DXRenderModule::getAdapterFromWindow()
{
HMONITOR hMonitor(aMonitorSupport.MonitorFromWindow(mhWnd));
HMONITOR hMonitor(MonitorFromWindow(mhWnd, MONITOR_DEFAULTTONEAREST));
UINT aAdapterCount(mpDirect3D9->GetAdapterCount());
for(UINT i=0; i<aAdapterCount; ++i)
if(hMonitor == mpDirect3D9->GetAdapterMonitor(i))
......
......@@ -15,6 +15,11 @@ $(eval $(call gb_Executable_use_libraries,odbcconfig,\
comphelper \
))
$(eval $(call gb_Executable_use_system_win32_libs,odbcconfig,\
legacy_stdio_definitions \
odbccp32 \
))
$(eval $(call gb_Library_use_sdk_api,odbcconfig))
$(eval $(call gb_Executable_add_exception_objects,odbcconfig,\
......
......@@ -22,14 +22,7 @@
# define WIN32_LEAN_AND_MEAN
#endif
#include <windows.h>
#include <sqlext.h>
#include <comphelper/scopeguard.hxx>
// the name of the library which contains the SQLManageDataSources function
#define ODBC_UI_LIB_NAME L"ODBCCP32.DLL"
// the signature of the SQLManageDataSources function
typedef SQLRETURN (SQL_API* TSQLManageDataSource) (SQLHWND hwndParent);
#include <odbcinst.h>
// displays the error text for the last error (GetLastError), and returns this error value
static int displayLastError()
......@@ -109,19 +102,7 @@ extern "C" int APIENTRY wWinMain( HINSTANCE _hAppInstance, HINSTANCE, LPWSTR, in
if ( !IsWindow( hAppWindow ) )
return displayLastError();
HMODULE hModule = LoadLibraryW( ODBC_UI_LIB_NAME );
if ( hModule == nullptr )
hModule = LoadLibraryExW( ODBC_UI_LIB_NAME, nullptr, LOAD_WITH_ALTERED_SEARCH_PATH );
if ( hModule == nullptr )
return displayLastError();
comphelper::ScopeGuard hModuleReleaser([hModule]() { FreeLibrary(hModule); });
FARPROC pManageDSProc = GetProcAddress( hModule, "SQLManageDataSources" );
if ( pManageDSProc == nullptr )
return displayLastError();
TSQLManageDataSource pManageDS = reinterpret_cast<TSQLManageDataSource>(pManageDSProc);
if ( !( (*pManageDS)( hAppWindow ) ) )
if (!SQLManageDataSources(hAppWindow))
return displayLastError();
return 0;
......
......@@ -50,6 +50,8 @@ $(eval $(call gb_Library_use_system_win32_libs,sal,\
ole32 \
shell32 \
user32 \
userenv \
wer \
ws2_32 \
))
......
......@@ -18,7 +18,7 @@
*/
#include "system.h"
#include <tlhelp32.h>
#include <psapi.h>
#include "file_url.hxx"
#include "path_helper.hxx"
......@@ -180,206 +180,57 @@ osl_getAsciiFunctionSymbol( oslModule Module, const sal_Char *pSymbol )
return fncAddr;
}
/*****************************************************************************/
/* Implementation for Windows 95, 98 and Me */
/*****************************************************************************/
/* Undefine because there is no explicit "A" definition */
#ifdef MODULEENTRY32
#undef MODULEENTRY32
#endif
#ifdef LPMODULEENTRY32
#undef LPMODULEENTRY32
#endif
/***************************************************************************************/
/* Implementation for Windows NT, 2K and XP (2K and XP could use the above method too) */
/***************************************************************************************/
#include <imagehlp.h>
typedef BOOL (WINAPI *SymInitialize_PROC)(
HANDLE hProcess,
LPWSTR UserSearchPath,
BOOL fInvadeProcess
);
typedef BOOL (WINAPI *SymCleanup_PROC)(
HANDLE hProcess
);
typedef BOOL (WINAPI *SymGetModuleInfo_PROC)(
HANDLE hProcess,
DWORD dwAddr,
PIMAGEHLP_MODULEW ModuleInfo
);
/* Seems that IMAGEHLP.DLL is always available on NT 4. But MSDN from Platform SDK says Win 2K is required. MSDN from VS 6.0a says
it's O.K on NT 4 ???!!!
BTW: We are using ANSI function because not all version of IMAGEHLP.DLL contain Unicode support
*/
static bool osl_addressGetModuleURL_NT4_( void *pv, rtl_uString **pustrURL )
{
bool bSuccess = false; /* Assume failure */
/* IMAGEHELP.DLL has a bug that it recursively scans subdirectories of
the root when calling SymInitialize(), so we prefer DBGHELP.DLL
which exports the same symbols and is shipped with OOo */
HMODULE hModImageHelp = LoadLibraryW( L"DBGHELP.DLL" );
if ( !hModImageHelp )
hModImageHelp = LoadLibraryW( L"IMAGEHLP.DLL" );
if ( hModImageHelp )
{
SymGetModuleInfo_PROC lpfnSymGetModuleInfo;
SymInitialize_PROC lpfnSymInitialize;
SymCleanup_PROC lpfnSymCleanup;
lpfnSymInitialize = reinterpret_cast<SymInitialize_PROC>(GetProcAddress( hModImageHelp, "SymInitializeW" ));
lpfnSymCleanup = reinterpret_cast<SymCleanup_PROC>(GetProcAddress( hModImageHelp, "SymCleanup" ));
lpfnSymGetModuleInfo = reinterpret_cast<SymGetModuleInfo_PROC>(GetProcAddress( hModImageHelp, "SymGetModuleInfoW" ));
if ( lpfnSymInitialize && lpfnSymCleanup && lpfnSymGetModuleInfo )
{
IMAGEHLP_MODULEW ModuleInfo;
::osl::LongPathBuffer< sal_Unicode > aModuleFileName( MAX_LONG_PATH );
LPWSTR lpSearchPath = nullptr;
if ( GetModuleFileNameW( nullptr, o3tl::toW(aModuleFileName), aModuleFileName.getBufSizeInSymbols() ) )
{
wchar_t *pLastBkSlash = wcsrchr( o3tl::toW(aModuleFileName), L'\\' );
if (
pLastBkSlash &&
pLastBkSlash > o3tl::toW(aModuleFileName)
&& *(pLastBkSlash - 1) != L':'
&& *(pLastBkSlash - 1) != L'\\'
)
{
*pLastBkSlash = 0;
lpSearchPath = o3tl::toW(aModuleFileName);
}
}
lpfnSymInitialize( GetCurrentProcess(), lpSearchPath, TRUE );
ZeroMemory( &ModuleInfo, sizeof(ModuleInfo) );
ModuleInfo.SizeOfStruct = sizeof(ModuleInfo);
bSuccess = !!lpfnSymGetModuleInfo( GetCurrentProcess(), reinterpret_cast<DWORD_PTR>(pv), &ModuleInfo );
if ( bSuccess )
{
/* #99182 On localized (non-english) NT4 and XP (!!!) for some libraries the LoadedImageName member of ModuleInfo isn't filled. Because
other members ModuleName and ImageName do not contain the full path we can cast the Member
BaseOfImage to a HMODULE (on NT it's the same) and use GetModuleFileName to retrieve the full
path of the loaded image */
if ( ModuleInfo.LoadedImageName[0] || GetModuleFileNameW( reinterpret_cast<HMODULE>(ModuleInfo.BaseOfImage), ModuleInfo.LoadedImageName, SAL_N_ELEMENTS(ModuleInfo.LoadedImageName) ) )
{
rtl_uString *ustrSysPath = nullptr;
rtl_uString_newFromStr( &ustrSysPath, o3tl::toU(ModuleInfo.LoadedImageName) );
OSL_ASSERT(ustrSysPath != nullptr);
osl_getFileURLFromSystemPath( ustrSysPath, pustrURL );
rtl_uString_release( ustrSysPath );
}
else
bSuccess = false;
}
lpfnSymCleanup( GetCurrentProcess() );
}
FreeLibrary( hModImageHelp );
}
return bSuccess;
}
typedef struct MODULEINFO {
LPVOID lpBaseOfDll;
DWORD SizeOfImage;
LPVOID EntryPoint;
} *LPMODULEINFO;
typedef BOOL (WINAPI *EnumProcessModules_PROC)(
HANDLE hProcess, // handle to the process
HMODULE * lphModule, // array to receive the module handles
DWORD cb, // size of the array
LPDWORD lpcbNeeded // receives the number of bytes returned
);
typedef BOOL (WINAPI *GetModuleInformation_PROC)(
HANDLE hProcess, // handle to the process
HMODULE hModule, // handle to the module
LPMODULEINFO lpmodinfo, // structure that receives information
DWORD cb // size of the structure
);
/* This version can fail because PSAPI.DLL is not always part of NT 4 despite MSDN Library 6.0a say so */
static bool osl_addressGetModuleURL_NT_( void *pv, rtl_uString **pustrURL )
sal_Bool SAL_CALL osl_getModuleURLFromAddress( void *pv, rtl_uString **pustrURL )
{
bool bSuccess = false; /* Assume failure */
static HMODULE hModPsapi = LoadLibraryW( L"PSAPI.DLL" );
static auto lpfnEnumProcessModules = reinterpret_cast<decltype(EnumProcessModules)*>(
hModPsapi ? GetProcAddress(hModPsapi, "EnumProcessModules") : nullptr);
static auto lpfnGetModuleInformation = reinterpret_cast<decltype(GetModuleInformation)*>(
hModPsapi ? GetProcAddress(hModPsapi, "GetModuleInformation") : nullptr);
if ( hModPsapi )
{
EnumProcessModules_PROC lpfnEnumProcessModules = reinterpret_cast<EnumProcessModules_PROC>(GetProcAddress( hModPsapi, "EnumProcessModules" ));
GetModuleInformation_PROC lpfnGetModuleInformation = reinterpret_cast<GetModuleInformation_PROC>(GetProcAddress( hModPsapi, "GetModuleInformation" ));
if ( lpfnEnumProcessModules && lpfnGetModuleInformation )
if (lpfnEnumProcessModules && lpfnGetModuleInformation)
{
DWORD cbNeeded = 0;
HMODULE *lpModules = nullptr;
HMODULE* lpModules = nullptr;
DWORD nModules = 0;
UINT iModule = 0;
MODULEINFO modinfo;
lpfnEnumProcessModules( GetCurrentProcess(), nullptr, 0, &cbNeeded );
lpfnEnumProcessModules(GetCurrentProcess(), nullptr, 0, &cbNeeded);
lpModules = static_cast<HMODULE *>(_alloca( cbNeeded ));
lpfnEnumProcessModules( GetCurrentProcess(), lpModules, cbNeeded, &cbNeeded );
lpModules = static_cast<HMODULE*>(_alloca(cbNeeded));
lpfnEnumProcessModules(GetCurrentProcess(), lpModules, cbNeeded, &cbNeeded);
nModules = cbNeeded / sizeof(HMODULE);
for ( iModule = 0; !bSuccess && iModule < nModules; iModule++ )
for (iModule = 0; !bSuccess && iModule < nModules; iModule++)
{
lpfnGetModuleInformation( GetCurrentProcess(), lpModules[iModule], &modinfo, sizeof(modinfo) );
lpfnGetModuleInformation(GetCurrentProcess(), lpModules[iModule], &modinfo,
sizeof(modinfo));
if ( static_cast<BYTE *>(pv) >= static_cast<BYTE *>(modinfo.lpBaseOfDll) && static_cast<BYTE *>(pv) < static_cast<BYTE *>(modinfo.lpBaseOfDll) + modinfo.SizeOfImage )
if (static_cast<BYTE*>(pv) >= static_cast<BYTE*>(modinfo.lpBaseOfDll)
&& static_cast<BYTE*>(pv)
< static_cast<BYTE*>(modinfo.lpBaseOfDll) + modinfo.SizeOfImage)
{
::osl::LongPathBuffer< sal_Unicode > aBuffer( MAX_LONG_PATH );
rtl_uString *ustrSysPath = nullptr;
::osl::LongPathBuffer<sal_Unicode> aBuffer(MAX_LONG_PATH);
rtl_uString* ustrSysPath = nullptr;
GetModuleFileNameW( lpModules[iModule], o3tl::toW(aBuffer), aBuffer.getBufSizeInSymbols() );
GetModuleFileNameW(lpModules[iModule], o3tl::toW(aBuffer),
aBuffer.getBufSizeInSymbols());
rtl_uString_newFromStr( &ustrSysPath, aBuffer );
osl_getFileURLFromSystemPath( ustrSysPath, pustrURL );
rtl_uString_release( ustrSysPath );
rtl_uString_newFromStr(&ustrSysPath, aBuffer);
osl_getFileURLFromSystemPath(ustrSysPath, pustrURL);
rtl_uString_release(ustrSysPath);
bSuccess = true;
}
}
}
}
return bSuccess;
}
sal_Bool SAL_CALL osl_getModuleURLFromAddress( void *pv, rtl_uString **pustrURL )
{
/* Use ..._NT first because ..._NT4 is much slower */
return osl_addressGetModuleURL_NT_( pv, pustrURL ) || osl_addressGetModuleURL_NT4_( pv, pustrURL );
}
sal_Bool SAL_CALL osl_getModuleURLFromFunctionAddress( oslGenericFunction addr, rtl_uString ** ppLibraryUrl )
{
/* casting a function pointer to a data pointer (void*) is
......
......@@ -33,24 +33,11 @@ extern "C" {
void sal_detail_initialize(int argc, char ** argv)
{
sal_initGlobalTimer();
HMODULE h = GetModuleHandleW(L"kernel32.dll");
if (h != nullptr) {
FARPROC p;
#ifndef _WIN64
p = GetProcAddress(h, "SetProcessDEPPolicy");
if (p != 0) {
reinterpret_cast< BOOL (WINAPI *)(DWORD) >(p)(0x00000001);
}
SetProcessDEPPolicy(PROCESS_DEP_ENABLE);
#endif
p = GetProcAddress(h, "SetDllDirectoryW");
if (p != nullptr) {
reinterpret_cast< BOOL (WINAPI *)(LPCWSTR) >(p)(L"");
}
p = GetProcAddress(h, "SetSearchPathMode");
if (p != nullptr) {
reinterpret_cast< BOOL (WINAPI *)(DWORD) >(p)(0x8001);
}
}
SetDllDirectoryW(L""); // remove the current directory from the default DLL search order
SetSearchPathMode(BASE_SEARCH_PATH_ENABLE_SAFE_SEARCHMODE | BASE_SEARCH_PATH_PERMANENT);
WSADATA wsaData;
int error;
......
......@@ -18,6 +18,7 @@
*/
#include "system.h"
#include <userenv.h>
#include <cassert>
#include <osl/security.h>
......@@ -31,45 +32,13 @@
#include <o3tl/char16_t2wchar_t.hxx>
#include "secimpl.hxx"
/* Data for use in (un)LoadProfile Functions */
/* Declarations based on USERENV.H for Windows 2000 Beta 2 */
#define PI_NOUI 0x00000001 // Prevents displaying of messages
typedef struct {
DWORD dwSize; // Must be set to sizeof(PROFILEINFO)
DWORD dwFlags; // See flags above
LPWSTR lpUserName; // User name (required)
LPWSTR lpProfilePath; // Roaming profile path
LPWSTR lpDefaultPath; // Default user profile path
LPWSTR lpServerName; // Validating DC name in netbios format
LPWSTR lpPolicyPath; // Path to the NT4 style policy file
HANDLE hProfile; // Registry key handle - filled by function
} PROFILEINFOW, FAR * LPPROFILEINFOW;
/* Typedefs for function pointers in USERENV.DLL */
typedef BOOL (STDMETHODCALLTYPE FAR * LPFNLOADUSERPROFILE) (
HANDLE hToken,
LPPROFILEINFOW lpProfileInfo
);
typedef BOOL (STDMETHODCALLTYPE FAR * LPFNUNLOADUSERPROFILE) (
HANDLE hToken,
HANDLE hProfile
);
typedef BOOL (STDMETHODCALLTYPE FAR * LPFNGETUSERPROFILEDIR) (
HANDLE hToken,
LPWSTR lpProfileDir,
LPDWORD lpcchSize
);
/* To get an impersonation token we need to create an impersonation
duplicate so every access token has to be created with duplicate
access rights */
#define TOKEN_DUP_QUERY (TOKEN_QUERY|TOKEN_DUPLICATE)
static bool GetSpecialFolder(rtl_uString **strPath,int nFolder);
static bool GetSpecialFolder(rtl_uString **strPath, REFKNOWNFOLDERID rFolder);
// We use LPCTSTR here, because we use it with SE_foo_NAME constants
// which are defined in winnt.h as UNICODE-dependent TEXT("PrivilegeName")
static BOOL Privilege(LPCTSTR pszPrivilege, BOOL bEnable);
......@@ -399,7 +368,7 @@ sal_Bool SAL_CALL osl_getHomeDir(oslSecurity Security, rtl_uString **pustrDirect
}
else
{
bSuccess = GetSpecialFolder(&ustrSysDir, CSIDL_PERSONAL) &&
bSuccess = GetSpecialFolder(&ustrSysDir, FOLDERID_Documents) &&
(osl_File_E_None == osl_getFileURLFromSystemPath(ustrSysDir, pustrDirectory));
}
}
......@@ -440,7 +409,7 @@ sal_Bool SAL_CALL osl_getConfigDir(oslSecurity Security, rtl_uString **pustrDire
rtl_uString *ustrFile = nullptr;
sal_Unicode sFile[_MAX_PATH];
if ( !GetSpecialFolder( &ustrFile, CSIDL_APPDATA) )
if ( !GetSpecialFolder( &ustrFile, FOLDERID_RoamingAppData) )
{
OSL_VERIFY(GetWindowsDirectoryW(o3tl::toW(sFile), _MAX_DIR) > 0);
......@@ -473,9 +442,6 @@ sal_Bool SAL_CALL osl_loadUserProfile(oslSecurity Security)
if (Privilege(SE_RESTORE_NAME, TRUE))
{
HMODULE hUserEnvLib = nullptr;
LPFNLOADUSERPROFILE fLoadUserProfile = nullptr;
LPFNUNLOADUSERPROFILE fUnloadUserProfile = nullptr;
HANDLE hAccessToken = static_cast<oslSecurityImpl*>(Security)->m_hToken;
/* try to create user profile */
......@@ -492,15 +458,6 @@ sal_Bool SAL_CALL osl_loadUserProfile(oslSecurity Security)
}
}
hUserEnvLib = LoadLibraryW(L"userenv.dll");
if (hUserEnvLib)
{
fLoadUserProfile = reinterpret_cast<LPFNLOADUSERPROFILE>(GetProcAddress(hUserEnvLib, "LoadUserProfileW"));
fUnloadUserProfile = reinterpret_cast<LPFNUNLOADUSERPROFILE>(GetProcAddress(hUserEnvLib, "UnloadUserProfile"));
if (fLoadUserProfile && fUnloadUserProfile)
{
rtl_uString *buffer = nullptr;
PROFILEINFOW pi;
......@@ -511,18 +468,14 @@ sal_Bool SAL_CALL osl_loadUserProfile(oslSecurity Security)
pi.lpUserName = o3tl::toW(rtl_uString_getStr(buffer));
pi.dwFlags = PI_NOUI;
if (fLoadUserProfile(hAccessToken, &pi))
if (LoadUserProfileW(hAccessToken, &pi))
{
fUnloadUserProfile(hAccessToken, pi.hProfile);
UnloadUserProfile(hAccessToken, pi.hProfile);
bOk = true;
}
rtl_uString_release(buffer);
}
FreeLibrary(hUserEnvLib);
}
if (hAccessToken && (hAccessToken != static_cast<oslSecurityImpl*>(Security)->m_hToken))
CloseHandle(hAccessToken);
......@@ -535,8 +488,6 @@ void SAL_CALL osl_unloadUserProfile(oslSecurity Security)
{
if ( static_cast<oslSecurityImpl*>(Security)->m_hProfile != nullptr )
{
HMODULE hUserEnvLib = nullptr;
LPFNUNLOADUSERPROFILE fUnloadUserProfile = nullptr;
HANDLE hAccessToken = static_cast<oslSecurityImpl*>(Security)->m_hToken;
if ( !hAccessToken )
......@@ -552,20 +503,8 @@ void SAL_CALL osl_unloadUserProfile(oslSecurity Security)
}
}
hUserEnvLib = LoadLibraryW(L"userenv.dll");
if (hUserEnvLib)
{
fUnloadUserProfile = reinterpret_cast<LPFNUNLOADUSERPROFILE>(GetProcAddress(hUserEnvLib, "UnloadUserProfile"));
if (fUnloadUserProfile)
{
/* unloading the user profile */
fUnloadUserProfile(hAccessToken, static_cast<oslSecurityImpl*>(Security)->m_hProfile);
}
FreeLibrary(hUserEnvLib);
}
UnloadUserProfile(hAccessToken, static_cast<oslSecurityImpl*>(Security)->m_hProfile);
static_cast<oslSecurityImpl*>(Security)->m_hProfile = nullptr;
......@@ -574,101 +513,16 @@ void SAL_CALL osl_unloadUserProfile(oslSecurity Security)
}
}
static bool GetSpecialFolder(rtl_uString **strPath, int nFolder)
static bool GetSpecialFolder(rtl_uString **strPath, REFKNOWNFOLDERID rFolder)
{
bool bRet = false;
HINSTANCE hLibrary = LoadLibraryW(L"shell32.dll");
if (hLibrary != nullptr)
{
sal_Unicode PathW[_MAX_PATH];
BOOL (WINAPI *pSHGetSpecialFolderPathW)(HWND, LPWSTR, int, BOOL) = reinterpret_cast<BOOL (WINAPI *)(HWND, LPWSTR, int, BOOL)>(GetProcAddress(hLibrary, "SHGetSpecialFolderPathW"));
if (pSHGetSpecialFolderPathW)
{
if (pSHGetSpecialFolderPathW(GetActiveWindow(), o3tl::toW(PathW), nFolder, TRUE))
PWSTR PathW;
if (SUCCEEDED(SHGetKnownFolderPath(rFolder, KF_FLAG_CREATE, nullptr, &PathW)))
{
rtl_uString_newFromStr( strPath, PathW);
rtl_uString_newFromStr(strPath, o3tl::toU(PathW));
CoTaskMemFree(PathW);
bRet = true;
}
}
else
{
HRESULT (WINAPI *pSHGetSpecialFolderLocation)(HWND, int, LPITEMIDLIST *) = reinterpret_cast<HRESULT (WINAPI *)(HWND, int, LPITEMIDLIST *)>(GetProcAddress(hLibrary, "SHGetSpecialFolderLocation"));
BOOL (WINAPI *pSHGetPathFromIDListW)(LPCITEMIDLIST, LPWSTR) = reinterpret_cast<BOOL (WINAPI *)(LPCITEMIDLIST, LPWSTR)>(GetProcAddress(hLibrary, "SHGetPathFromIDListW"));
HRESULT (WINAPI *pSHGetMalloc)(LPMALLOC *) = reinterpret_cast<HRESULT (WINAPI *)(LPMALLOC *)>(GetProcAddress(hLibrary, "SHGetMalloc"));
if (pSHGetSpecialFolderLocation && pSHGetPathFromIDListW && pSHGetMalloc )
{
LPITEMIDLIST pidl;
LPMALLOC pMalloc;
HRESULT hr;
hr = pSHGetSpecialFolderLocation(GetActiveWindow(), nFolder, &pidl);
/* Get SHGetSpecialFolderLocation fails if directory does not exists. */
/* If it fails we try to create the directory and redo the call */
if (! SUCCEEDED(hr))
{
HKEY hRegKey;
if (RegOpenKeyW(HKEY_CURRENT_USER,
L"Software\\Microsoft\\Windows\\CurrentVersion\\Explorer\\Shell Folders",
&hRegKey) == ERROR_SUCCESS)
{
LONG lRet;
DWORD lSize = sizeof(PathW);
DWORD Type = REG_SZ;
switch (nFolder)
{
case CSIDL_APPDATA:
lRet = RegQueryValueExW(hRegKey, L"AppData", nullptr, &Type, reinterpret_cast<LPBYTE>(PathW), &lSize);
break;
case CSIDL_PERSONAL:
lRet = RegQueryValueExW(hRegKey, L"Personal", nullptr, &Type, reinterpret_cast<LPBYTE>(PathW), &lSize);
break;
default:
lRet = -1l;
}
if ((lRet == ERROR_SUCCESS) && (Type == REG_SZ))
{
if (_waccess(o3tl::toW(PathW), 0) < 0)
CreateDirectoryW(o3tl::toW(PathW), nullptr);
hr = pSHGetSpecialFolderLocation(GetActiveWindow(), nFolder, &pidl);
}
RegCloseKey(hRegKey);
}
}
if (SUCCEEDED(hr))
{
if (pSHGetPathFromIDListW(pidl, o3tl::toW(PathW)))
{
/* if directory does not exist, create it */
if (_waccess(o3tl::toW(PathW), 0) < 0)
CreateDirectoryW(o3tl::toW(PathW), nullptr);
rtl_uString_newFromStr( strPath, PathW);
bRet = true;
}
}
if (SUCCEEDED(pSHGetMalloc(&pMalloc)))
{
pMalloc->Free(pidl);
pMalloc->Release();
}
}
}
FreeLibrary(hLibrary);
}
return bRet;
}
......
......@@ -27,6 +27,7 @@
#include <systools/win32/uwinapi.h>
#include <errorrep.h>
#include <werapi.h>
namespace
{
......@@ -39,14 +40,7 @@ bool onInitSignal()
{
pPreviousHandler = SetUnhandledExceptionFilter(signalHandlerFunction);
HMODULE hFaultRep = LoadLibraryW( L"faultrep.dll" );
if ( hFaultRep )
{
pfn_ADDEREXCLUDEDAPPLICATIONW pfn = reinterpret_cast<pfn_ADDEREXCLUDEDAPPLICATIONW>(GetProcAddress( hFaultRep, "AddERExcludedApplicationW" ));
if ( pfn )
pfn( L"SOFFICE.EXE" );
FreeLibrary( hFaultRep );
}
WerAddExcludedApplication(L"SOFFICE.EXE", FALSE);
return true;
}
......
......@@ -93,17 +93,14 @@ static bool IsValidHandle( HANDLE handle )
static DWORD WINAPI GetModuleFileNameExW_( HANDLE hProcess, HMODULE hModule, PWSTR lpFileName, DWORD nSize )
{
typedef DWORD (WINAPI *FN_PROC)( HANDLE hProcess, HMODULE hModule, LPWSTR lpFileName, DWORD nSize );
static FN_PROC lpProc = nullptr;
if ( !lpProc )
{
static auto lpProc = []() {
HMODULE hLibrary = LoadLibraryW(L"PSAPI.DLL");
if ( hLibrary )
lpProc = reinterpret_cast< FN_PROC >(GetProcAddress( hLibrary, "GetModuleFileNameExW" ));
}
decltype(GetModuleFileNameExW)* pRet = nullptr;
if (hLibrary)
pRet = reinterpret_cast<decltype(GetModuleFileNameExW)*>(
GetProcAddress(hLibrary, "GetModuleFileNameExW"));
return pRet;
}();
if ( lpProc )
return lpProc( hProcess, hModule, lpFileName, nSize );
......
......@@ -82,6 +82,8 @@ $(eval $(call gb_Library_add_exception_objects,vclplug_win,\
))
$(eval $(call gb_Library_use_system_win32_libs,vclplug_win,\
d2d1 \
dwrite \
gdi32 \
gdiplus \
imm32 \
......
......@@ -36,19 +36,7 @@ enum class D2DTextAntiAliasMode
class D2DWriteTextOutRenderer : public TextOutRenderer
{
typedef HRESULT(WINAPI *pD2D1CreateFactory_t)(D2D1_FACTORY_TYPE,
REFIID, const D2D1_FACTORY_OPTIONS *, void **);
typedef HRESULT(WINAPI *pDWriteCreateFactory_t)(DWRITE_FACTORY_TYPE,
REFIID, IUnknown **);
static HINSTANCE mmD2d1, mmDWrite;
static pD2D1CreateFactory_t D2D1CreateFactory;
static pDWriteCreateFactory_t DWriteCreateFactory;
public:
static bool InitModules();
explicit D2DWriteTextOutRenderer();
virtual ~D2DWriteTextOutRenderer() override;
......@@ -74,8 +62,6 @@ public:
void changeTextAntiAliasMode(D2DTextAntiAliasMode eMode);
private:
static void CleanupModules();
// This is a singleton object disable copy ctor and assignment operator
D2DWriteTextOutRenderer(const D2DWriteTextOutRenderer &) = delete;
D2DWriteTextOutRenderer & operator = (const D2DWriteTextOutRenderer &) = delete;
......
......@@ -32,43 +32,6 @@
#include <comphelper/windowserrorstring.hxx>
#include <sal/log.hxx>
HINSTANCE D2DWriteTextOutRenderer::mmD2d1 = nullptr,
D2DWriteTextOutRenderer::mmDWrite = nullptr;
D2DWriteTextOutRenderer::pD2D1CreateFactory_t D2DWriteTextOutRenderer::D2D1CreateFactory = nullptr;
D2DWriteTextOutRenderer::pDWriteCreateFactory_t D2DWriteTextOutRenderer::DWriteCreateFactory = nullptr;
bool D2DWriteTextOutRenderer::InitModules()
{
mmD2d1 = LoadLibraryW(L"D2d1.dll");
mmDWrite = LoadLibraryW(L"dwrite.dll");
if (mmD2d1 && mmDWrite)
{
D2D1CreateFactory = pD2D1CreateFactory_t(GetProcAddress(mmD2d1, "D2D1CreateFactory"));
DWriteCreateFactory = pDWriteCreateFactory_t(GetProcAddress(mmDWrite, "DWriteCreateFactory"));
}
if (!D2D1CreateFactory || !DWriteCreateFactory)
{
CleanupModules();
return false;
}
return true;
}
void D2DWriteTextOutRenderer::CleanupModules()
{
if (mmD2d1)
FreeLibrary(mmD2d1);
if (mmDWrite)
FreeLibrary(mmDWrite);
mmD2d1 = nullptr;
mmDWrite = nullptr;
D2D1CreateFactory = nullptr;
DWriteCreateFactory = nullptr;
}
namespace
{
......@@ -167,8 +130,6 @@ D2DWriteTextOutRenderer::~D2DWriteTextOutRenderer()
mpDWriteFactory->Release();
if (mpD2DFactory)
mpD2DFactory->Release();
CleanupModules();
}
void D2DWriteTextOutRenderer::applyTextAntiAliasMode()
......
......@@ -210,17 +210,12 @@ TextOutRenderer & TextOutRenderer::get(bool bUseDWrite)
if (bUseDWrite)
{
static bool const bSuccess(D2DWriteTextOutRenderer::InitModules());
if (bSuccess && !pSalData->m_pD2DWriteTextOutRenderer)
if (!pSalData->m_pD2DWriteTextOutRenderer)
{
pSalData->m_pD2DWriteTextOutRenderer.reset(new D2DWriteTextOutRenderer());
}
if (pSalData->m_pD2DWriteTextOutRenderer)
{
return *pSalData->m_pD2DWriteTextOutRenderer;
}
// else: fall back to GDI
}
if (!pSalData->m_pExTextOutRenderer)
{
pSalData->m_pExTextOutRenderer.reset(new ExTextOutRenderer);
......
......@@ -1794,35 +1794,27 @@ void WinSalFrame::SetApplicationID( const OUString &rApplicationID )
// http://msdn.microsoft.com/en-us/library/windows/desktop/dd378430(v=vs.85).aspx
// A window's properties must be removed before the window is closed.
typedef HRESULT ( WINAPI *SHGETPROPERTYSTOREFORWINDOW )( HWND, REFIID, void ** );
SHGETPROPERTYSTOREFORWINDOW pSHGetPropertyStoreForWindow;
pSHGetPropertyStoreForWindow = reinterpret_cast<SHGETPROPERTYSTOREFORWINDOW>(GetProcAddress(
GetModuleHandleW (L"shell32.dll"), "SHGetPropertyStoreForWindow" ));
if( pSHGetPropertyStoreForWindow )
{
IPropertyStore *pps;
HRESULT hr = pSHGetPropertyStoreForWindow ( mhWnd, IID_PPV_ARGS(&pps) );
if ( SUCCEEDED(hr) )
HRESULT hr = SHGetPropertyStoreForWindow(mhWnd, IID_PPV_ARGS(&pps));
if (SUCCEEDED(hr))
{
PROPVARIANT pv;
if ( !rApplicationID.isEmpty() )
if (!rApplicationID.isEmpty())
{
hr = InitPropVariantFromString( o3tl::toW(rApplicationID.getStr()), &pv );
hr = InitPropVariantFromString(o3tl::toW(rApplicationID.getStr()), &pv);
mbPropertiesStored = true;
}
else
// if rApplicationID we remove the property from the window, if present
PropVariantInit( &pv );
PropVariantInit(&pv);
if ( SUCCEEDED(hr) )
if (SUCCEEDED(hr))
{
hr = pps->SetValue( PKEY_AppUserModel_ID, pv );
PropVariantClear( &pv );
hr = pps->SetValue(PKEY_AppUserModel_ID, pv);
PropVariantClear(&pv);
}
pps->Release();
}
}
}
void WinSalFrame::ShowFullScreen( bool bFullScreen, sal_Int32 nDisplay )
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment