summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--setup_native/source/win32/customactions/shellextensions/checkrunningoffice.cxx139
1 files changed, 26 insertions, 113 deletions
diff --git a/setup_native/source/win32/customactions/shellextensions/checkrunningoffice.cxx b/setup_native/source/win32/customactions/shellextensions/checkrunningoffice.cxx
index 38f5bcd10204..fce807f856ae 100644
--- a/setup_native/source/win32/customactions/shellextensions/checkrunningoffice.cxx
+++ b/setup_native/source/win32/customactions/shellextensions/checkrunningoffice.cxx
@@ -53,6 +53,10 @@
#include <stdio.h>
#include <sal/macros.h>
+// works with Windows XP as well as with Windows 7
+#define PSAPI_VERSION 1
+#include <psapi.h>
+
#include <systools/win32/uwinapi.h>
#include <../tools/seterror.hxx>
@@ -90,133 +94,42 @@ static std::_tstring GetMsiProperty( MSIHANDLE handle, const std::_tstring& sPro
return result;
}
-static inline bool IsSetMsiProperty(MSIHANDLE handle, const std::_tstring& sProperty)
-{
- std::_tstring value = GetMsiProperty(handle, sProperty);
- return (value.length() > 0);
-}
-
-static inline void UnsetMsiProperty(MSIHANDLE handle, const std::_tstring& sProperty)
-{
- MsiSetProperty(handle, sProperty.c_str(), NULL);
-}
-
-static inline void SetMsiProperty(MSIHANDLE handle, const std::_tstring& sProperty)
-{
- MsiSetProperty(handle, sProperty.c_str(), TEXT("1"));
-}
-
extern "C" UINT __stdcall IsOfficeRunning( MSIHANDLE handle )
{
- OSVERSIONINFO osverinfo;
- osverinfo.dwOSVersionInfoSize = sizeof(OSVERSIONINFO);
- GetVersionEx( &osverinfo );
-
- // renaming the vcl resource doesn't work reliable with OS >= Windows Vista
- if (osverinfo.dwMajorVersion < 6 )
- {
- std::_tstring sInstDir = GetMsiProperty( handle, TEXT("INSTALLLOCATION") );
- // Property empty -> no office installed
- if ( sInstDir.length() == 0 )
- return ERROR_SUCCESS;
+ std::_tstring sOfficeInstallPath = GetMsiProperty(handle, TEXT("INSTALLLOCATION"));
+ // Property empty -> no office installed
+ if ( sOfficeInstallPath.length() == 0 )
+ return ERROR_SUCCESS;
- std::_tstring sResourceDir = sInstDir + TEXT("Basis\\program\\resource\\");
- std::_tstring sPattern = sResourceDir + TEXT("vcl*.res");
+ DWORD aProcesses[1024], cbNeeded, cProcesses; /* 1024 processses ought to be enough for anybody */
-// std::_tstring mystr;
-// mystr = "IsOfficeRunning start. Checking file in dir: " + sResourceDir;
-// MessageBox( NULL, mystr.c_str(), "IsOfficeRunning", MB_OK );
+ if ( !EnumProcesses( aProcesses, sizeof(aProcesses), &cbNeeded ) )
+ return ERROR_INSTALL_FAILURE;
- WIN32_FIND_DATA aFindFileData;
- HANDLE hFind = FindFirstFile( sPattern.c_str(), &aFindFileData );
+ cProcesses = cbNeeded / sizeof(DWORD);
- if ( IsValidHandle(hFind) )
+ // Check if there is "soffice.bin" among the processes
+ for ( unsigned int i = 0; i < cProcesses; i++ )
+ {
+ if( aProcesses[i] != 0 )
{
- BOOL fSuccess = false;
- bool fRenameSucceeded;
-
- do
+ TCHAR szProcessName[MAX_PATH] = TEXT("<unknown>");
+ HANDLE hProcess = OpenProcess( PROCESS_QUERY_INFORMATION | PROCESS_VM_READ, FALSE, aProcesses[i] );
+ if (NULL != hProcess )
{
- std::_tstring sResourceFile = sResourceDir + aFindFileData.cFileName;
- std::_tstring sIntermediate = sResourceFile + TEXT(".tmp");
-
- fRenameSucceeded = MoveFileExA( sResourceFile.c_str(), sIntermediate.c_str(), MOVEFILE_REPLACE_EXISTING );
- if ( fRenameSucceeded )
- {
- MoveFileExA( sIntermediate.c_str(), sResourceFile.c_str(), 0 );
- fSuccess = FindNextFile( hFind, &aFindFileData );
- }
- } while ( fSuccess && fRenameSucceeded );
-
- if ( !fRenameSucceeded )
- {
- MsiSetProperty(handle, TEXT("OFFICERUNS"), TEXT("1"));
- SetMsiErrorCode( MSI_ERROR_OFFICE_IS_RUNNING );
-
-// mystr = "Office is running";
-// MessageBox( NULL, mystr.c_str(), "IsOfficeRunning", MB_OK );
+ HMODULE hMod;
+ if ( EnumProcessModules( hProcess, &hMod, sizeof(hMod), &cbNeeded) )
+ GetModuleBaseName( hProcess, hMod, szProcessName, sizeof(szProcessName)/sizeof(TCHAR) );
}
-
- FindClose( hFind );
- }
-// mystr = "IsOfficeRunning end";
-// MessageBox( NULL, mystr.c_str(), "IsOfficeRunning", MB_OK );
- }
- else
- {
- std::_tstring sOfficeInstallPath = GetMsiProperty(handle, TEXT("INSTALLLOCATION"));
- // Property empty -> no office installed
- if ( sOfficeInstallPath.length() == 0 )
- return ERROR_SUCCESS;
-
- std::_tstring sRenameSrc = sOfficeInstallPath + TEXT("program");
- std::_tstring sRenameDst = sOfficeInstallPath + TEXT("program_test");
-
- bool bSuccess = MoveFile( sRenameSrc.c_str(), sRenameDst.c_str() );
-
- if ( bSuccess )
- {
- MoveFile( sRenameDst.c_str(), sRenameSrc.c_str() );
- }
- else
- {
- DWORD dwError = GetLastError();
- LPVOID lpMsgBuf;
- // When there is no program folder, there could be no running office
- if ( dwError == ERROR_FILE_NOT_FOUND )
- return ERROR_SUCCESS;
- if ( dwError == ERROR_PATH_NOT_FOUND )
- return ERROR_SUCCESS;
-
- // The destination folder should never exist, don't know what to do here
- if ( dwError == ERROR_ALREADY_EXISTS )
- return ERROR_SUCCESS;
-
- if ( FormatMessage(
- FORMAT_MESSAGE_ALLOCATE_BUFFER |
- FORMAT_MESSAGE_FROM_SYSTEM |
- FORMAT_MESSAGE_IGNORE_INSERTS,
- NULL,
- GetLastError(),
- MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), // Default language
- (LPTSTR) &lpMsgBuf,
- 0,
- NULL ))
+ CloseHandle( hProcess );
+ if ( _tcscmp( szProcessName, TEXT("soffice.bin") ) == 0 )
{
- OutputDebugStringFormat( TEXT("Error Code %d: %s"), dwError, lpMsgBuf );
- LocalFree( lpMsgBuf );
+ MsiSetProperty( handle, TEXT("OFFICERUNS"), TEXT("1") );
+ SetMsiErrorCode( MSI_ERROR_OFFICE_IS_RUNNING );
}
- else
- OutputDebugStringFormat( TEXT("Error Code %d: Unknown"), dwError );
-
- MsiSetProperty( handle, TEXT("OFFICERUNS"), TEXT("1") );
- SetMsiErrorCode( MSI_ERROR_OFFICE_IS_RUNNING );
}
}
-
return ERROR_SUCCESS;
}
-
-
/* vim:set shiftwidth=4 softtabstop=4 expandtab: */