summaryrefslogtreecommitdiffstats
path: root/sw/source/ui/vba/vbasystem.cxx
diff options
context:
space:
mode:
Diffstat (limited to 'sw/source/ui/vba/vbasystem.cxx')
-rw-r--r--sw/source/ui/vba/vbasystem.cxx44
1 files changed, 24 insertions, 20 deletions
diff --git a/sw/source/ui/vba/vbasystem.cxx b/sw/source/ui/vba/vbasystem.cxx
index c98df33e3595..7781f6660c65 100644
--- a/sw/source/ui/vba/vbasystem.cxx
+++ b/sw/source/ui/vba/vbasystem.cxx
@@ -29,6 +29,9 @@
#pragma warning (push, 1)
#pragma warning (disable: 4005)
#endif
+#if !defined WINVER
+# define WINVER 0x0400
+#endif
#if !defined WIN32_LEAN_AND_MEAN
# define WIN32_LEAN_AND_MEAN
#endif
@@ -36,7 +39,6 @@
#if defined _MSC_VER
#pragma warning (pop)
#endif
-#include <tchar.h>
#endif
using namespace ::ooo::vba;
@@ -97,7 +99,7 @@ uno::Any PrivateProfileStringListener::getValueEvent()
}
else
{
- // get key/value from windows register
+ // get key/value from Windows registry
#ifdef _WIN32
HKEY hBaseKey = nullptr;
OString sSubKey;
@@ -105,21 +107,23 @@ uno::Any PrivateProfileStringListener::getValueEvent()
if( hBaseKey != nullptr )
{
HKEY hKey = nullptr;
- LONG lResult;
- LPCTSTR lpSubKey = TEXT( sSubKey.getStr());
- TCHAR szBuffer[1024];
- DWORD cbData = sizeof( szBuffer );
- lResult = RegOpenKeyEx( hBaseKey, lpSubKey, 0, KEY_QUERY_VALUE, &hKey );
+ LPCSTR lpSubKey = sSubKey.getStr();
+ // We use RegOpenKeyExA here for convenience, because we already have subkey name as 8-bit string
+ LONG lResult = RegOpenKeyExA( hBaseKey, lpSubKey, 0, KEY_QUERY_VALUE, &hKey );
if( ERROR_SUCCESS == lResult )
{
- LPCTSTR lpValueName = TEXT(maKey.getStr());
- lResult = RegQueryValueEx( hKey, lpValueName, nullptr, nullptr, reinterpret_cast<LPBYTE>(szBuffer), &cbData );
+ OUString sUValName = OStringToOUString(maKey, RTL_TEXTENCODING_DONTKNOW);
+ LPCWSTR lpValueName = SAL_W(sUValName.getStr());
+ WCHAR szBuffer[1024];
+ DWORD cbData = sizeof(szBuffer);
+ lResult = RegQueryValueExW( hKey, lpValueName, nullptr, nullptr, reinterpret_cast<LPBYTE>(szBuffer), &cbData );
RegCloseKey( hKey );
- sValue = OUString::createFromAscii(szBuffer);
+ // https://msdn.microsoft.com/en-us/ms724911 mentions that
+ // "the string may not have been stored with the proper terminating null characters"
+ szBuffer[std::min(size_t(cbData / sizeof(szBuffer[0])), SAL_N_ELEMENTS(szBuffer)-1)] = 0;
+ sValue = SAL_U(szBuffer);
}
}
-
- return uno::makeAny( sValue );
#else
throw uno::RuntimeException("Only support on Windows" );
#endif
@@ -142,7 +146,7 @@ void PrivateProfileStringListener::setValueEvent( const css::uno::Any& value )
}
else
{
- //set value into windows register
+ //set value into Windows registry
#ifdef _WIN32
HKEY hBaseKey = nullptr;
OString sSubKey;
@@ -150,15 +154,15 @@ void PrivateProfileStringListener::setValueEvent( const css::uno::Any& value )
if( hBaseKey != nullptr )
{
HKEY hKey = nullptr;
- LONG lResult;
- LPCTSTR lpSubKey = TEXT( sSubKey.getStr());
- lResult = RegCreateKeyEx( hBaseKey, lpSubKey, 0, nullptr, REG_OPTION_NON_VOLATILE, KEY_ALL_ACCESS, nullptr, &hKey, nullptr );
+ LPCSTR lpSubKey = sSubKey.getStr();
+ // We use RegCreateKeyExA here for convenience, because we already have subkey name as 8-bit string
+ LONG lResult = RegCreateKeyExA( hBaseKey, lpSubKey, 0, nullptr, REG_OPTION_NON_VOLATILE, KEY_ALL_ACCESS, nullptr, &hKey, nullptr );
if( ERROR_SUCCESS == lResult )
{
- OString aUTF8Value = OUStringToOString( aValue, RTL_TEXTENCODING_UTF8 );
- DWORD cbData = sizeof(TCHAR) * (_tcslen(aUTF8Value.getStr()) + 1);
- LPCTSTR lpValueName = TEXT(maKey.getStr());
- lResult = RegSetValueEx( hKey, lpValueName, 0 /* Reserved */, REG_SZ, reinterpret_cast<BYTE const *>(aUTF8Value.getStr()), cbData );
+ DWORD cbData = sizeof(WCHAR) * (aValue.getLength() + 1);
+ OUString sUValName = OStringToOUString(maKey, RTL_TEXTENCODING_DONTKNOW);
+ LPCWSTR lpValueName = SAL_W(sUValName.getStr());
+ lResult = RegSetValueExW( hKey, lpValueName, 0 /* Reserved */, REG_SZ, reinterpret_cast<BYTE const *>(aValue.getStr()), cbData );
RegCloseKey( hKey );
}
}