2012-04-15 16:54:38 +00:00
// This file is part of Notepad++ project
// Copyright (C)2003 Don HO <don.h@free.fr>
2009-04-24 23:34:47 +00:00
//
2012-04-15 16:54:38 +00:00
// This program is free software; you can redistribute it and/or
// modify it under the terms of the GNU General Public License
// as published by the Free Software Foundation; either
// version 2 of the License, or (at your option) any later version.
2009-04-24 23:34:47 +00:00
//
2012-04-15 16:54:38 +00:00
// Note that the GPL places important restrictions on "derived works", yet
2015-08-04 11:36:22 +00:00
// it does not provide a detailed definition of that term. To avoid
// misunderstandings, we consider an application to constitute a
2012-04-15 16:54:38 +00:00
// "derivative work" for the purpose of this license if it does any of the
2015-08-04 11:36:22 +00:00
// following:
2012-04-15 16:54:38 +00:00
// 1. Integrates source code from Notepad++.
// 2. Integrates/includes/aggregates Notepad++ into a proprietary executable
// installer, such as those produced by InstallShield.
// 3. Links to a library or executes a program that does any of the above.
2009-04-24 23:34:47 +00:00
//
2012-04-15 16:54:38 +00:00
// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with this program; if not, write to the Free Software
// Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
2010-03-26 00:22:14 +00:00
# include "Notepad_plus_Window.h"
2009-04-24 23:34:47 +00:00
# include "Process.h"
# include "Win32Exception.h" //Win32 exception
# include "MiniDumper.h" //Write dump files
typedef std : : vector < const TCHAR * > ParamVector ;
2012-11-16 00:28:00 +00:00
2015-05-06 18:45:56 +00:00
bool checkSingleFile ( const TCHAR * commandLine )
{
if ( ! commandLine | | lstrlen ( commandLine ) = = 0 )
2015-03-14 22:55:03 +00:00
return false ;
2015-05-06 18:45:56 +00:00
TCHAR fullpath [ MAX_PATH ] = { 0 } ;
const DWORD fullpathResult = : : GetFullPathName ( commandLine , MAX_PATH , fullpath , NULL ) ;
2015-03-14 22:55:03 +00:00
2015-05-06 18:45:56 +00:00
if ( fullpathResult = = 0 )
2015-03-14 22:55:03 +00:00
return false ;
2015-05-06 18:45:56 +00:00
if ( fullpathResult > MAX_PATH )
2015-03-14 22:55:03 +00:00
return false ;
2015-08-04 11:36:22 +00:00
if ( : : PathFileExists ( fullpath ) )
2009-04-24 23:34:47 +00:00
return true ;
return false ;
}
//commandLine should contain path to n++ executable running
void parseCommandLine ( TCHAR * commandLine , ParamVector & paramVector ) {
2015-08-04 11:36:22 +00:00
//params.erase(params.begin());
2009-04-24 23:34:47 +00:00
//remove the first element, since thats the path the the executable (GetCommandLine does that)
TCHAR stopChar = TEXT ( ' ' ) ;
if ( commandLine [ 0 ] = = TEXT ( ' \" ' ) ) {
stopChar = TEXT ( ' \" ' ) ;
2013-07-08 00:12:50 +00:00
+ + commandLine ;
2009-04-24 23:34:47 +00:00
}
//while this is not really DBCS compliant, space and quote are in the lower 127 ASCII range
while ( commandLine [ 0 ] & & commandLine [ 0 ] ! = stopChar )
2010-02-10 23:54:44 +00:00
{
2013-07-08 00:12:50 +00:00
+ + commandLine ;
2010-02-10 23:54:44 +00:00
}
// For unknown reason, the following command :
// c:\NppDir>notepad++
// (without quote) will give string "notepad++\0notepad++\0"
// To avoid the unexpected behaviour we check the end of string before increasing the pointer
if ( commandLine [ 0 ] ! = ' \0 ' )
2013-07-08 00:12:50 +00:00
+ + commandLine ; //advance past stopChar
2010-02-10 23:54:44 +00:00
2009-04-24 23:34:47 +00:00
//kill remaining spaces
while ( commandLine [ 0 ] = = TEXT ( ' ' ) )
2013-07-08 00:12:50 +00:00
+ + commandLine ;
2009-04-24 23:34:47 +00:00
bool isFile = checkSingleFile ( commandLine ) ; //if the commandline specifies only a file, open it as such
if ( isFile ) {
paramVector . push_back ( commandLine ) ;
return ;
}
bool isInFile = false ;
bool isInWhiteSpace = true ;
paramVector . clear ( ) ;
size_t commandLength = lstrlen ( commandLine ) ;
2013-07-08 00:12:50 +00:00
for ( size_t i = 0 ; i < commandLength ; + + i )
{
2009-04-24 23:34:47 +00:00
switch ( commandLine [ i ] ) {
case ' \" ' : { //quoted filename, ignore any following whitespace
if ( ! isInFile ) { //" will always be treated as start or end of param, in case the user forgot to add an space
paramVector . push_back ( commandLine + i + 1 ) ; //add next param(since zero terminated generic_string original, no overflow of +1)
}
isInFile = ! isInFile ;
isInWhiteSpace = false ;
//because we dont want to leave in any quotes in the filename, remove them now (with zero terminator)
commandLine [ i ] = 0 ;
break ; }
case ' \t ' : //also treat tab as whitespace
case ' ' : {
isInWhiteSpace = true ;
if ( ! isInFile )
commandLine [ i ] = 0 ; //zap spaces into zero terminators, unless its part of a filename
break ; }
default : { //default TCHAR, if beginning of word, add it
if ( ! isInFile & & isInWhiteSpace ) {
2015-08-04 11:36:22 +00:00
paramVector . push_back ( commandLine + i ) ; //add next param
2009-04-24 23:34:47 +00:00
isInWhiteSpace = false ;
}
break ; }
}
}
//the commandline generic_string is now a list of zero terminated strings concatenated, and the vector contains all the substrings
}
bool isInList ( const TCHAR * token2Find , ParamVector & params ) {
int nrItems = params . size ( ) ;
2013-07-08 00:12:50 +00:00
for ( int i = 0 ; i < nrItems ; + + i )
2009-04-24 23:34:47 +00:00
{
if ( ! lstrcmp ( token2Find , params . at ( i ) ) ) {
params . erase ( params . begin ( ) + i ) ;
return true ;
}
}
return false ;
} ;
2015-02-01 12:16:12 +00:00
bool getParamVal ( TCHAR c , ParamVector & params , generic_string & value )
{
2009-04-24 23:34:47 +00:00
value = TEXT ( " " ) ;
int nrItems = params . size ( ) ;
2013-07-08 00:12:50 +00:00
for ( int i = 0 ; i < nrItems ; + + i )
2009-04-24 23:34:47 +00:00
{
const TCHAR * token = params . at ( i ) ;
if ( token [ 0 ] = = ' - ' & & lstrlen ( token ) > = 2 & & token [ 1 ] = = c ) { //dash, and enough chars
value = ( token + 2 ) ;
params . erase ( params . begin ( ) + i ) ;
return true ;
}
}
return false ;
}
2015-02-01 12:16:12 +00:00
bool getParamValFromString ( const TCHAR * str , ParamVector & params , generic_string & value )
{
value = TEXT ( " " ) ;
int nrItems = params . size ( ) ;
for ( int i = 0 ; i < nrItems ; + + i )
{
const TCHAR * token = params . at ( i ) ;
generic_string tokenStr = token ;
int pos = tokenStr . find ( str ) ;
if ( pos ! = - 1 & & pos = = 0 )
{
value = ( token + lstrlen ( str ) ) ;
params . erase ( params . begin ( ) + i ) ;
return true ;
}
}
return false ;
}
2013-07-25 17:41:25 +00:00
LangType getLangTypeFromParam ( ParamVector & params )
{
2009-04-24 23:34:47 +00:00
generic_string langStr ;
if ( ! getParamVal ( ' l ' , params , langStr ) )
return L_EXTERNAL ;
return NppParameters : : getLangIDFromStr ( langStr . c_str ( ) ) ;
2013-07-25 17:41:25 +00:00
}
generic_string getLocalizationPathFromParam ( ParamVector & params )
{
generic_string locStr ;
if ( ! getParamVal ( ' L ' , params , locStr ) )
return TEXT ( " " ) ;
return NppParameters : : getLocPathFromStr ( locStr . c_str ( ) ) ;
}
2009-04-24 23:34:47 +00:00
int getNumberFromParam ( char paramName , ParamVector & params , bool & isParamePresent ) {
generic_string numStr ;
if ( ! getParamVal ( paramName , params , numStr ) )
{
isParamePresent = false ;
return - 1 ;
}
isParamePresent = true ;
return generic_atoi ( numStr . c_str ( ) ) ;
} ;
2015-02-01 12:16:12 +00:00
generic_string getEasterEggNameFromParam ( ParamVector & params , unsigned char & type )
2015-01-10 23:41:49 +00:00
{
generic_string EasterEggName ;
2015-02-01 12:16:12 +00:00
if ( ! getParamValFromString ( TEXT ( " -qn " ) , params , EasterEggName ) ) // get internal easter egg
{
if ( ! getParamValFromString ( TEXT ( " -qt " ) , params , EasterEggName ) ) // get user quote from cmdline argument
{
if ( ! getParamValFromString ( TEXT ( " -qf " ) , params , EasterEggName ) ) // get user quote from a content of file
return TEXT ( " " ) ;
else
{
EasterEggName = relativeFilePathToFullFilePath ( EasterEggName . c_str ( ) ) ;
type = 2 ; // quote content in file
}
}
else
type = 1 ; // commandline quote
}
else
type = 0 ; // easter egg
generic_string percentTwentyStr = TEXT ( " %20 " ) ;
generic_string spaceStr = TEXT ( " " ) ;
size_t start_pos = 0 ;
while ( ( start_pos = EasterEggName . find ( percentTwentyStr , start_pos ) ) ! = std : : string : : npos )
{
EasterEggName . replace ( start_pos , percentTwentyStr . length ( ) , spaceStr ) ;
start_pos + = spaceStr . length ( ) ; // Handles case where 'to' is a substring of 'from'
}
2015-01-10 23:41:49 +00:00
return EasterEggName ;
}
2009-04-24 23:34:47 +00:00
const TCHAR FLAG_MULTI_INSTANCE [ ] = TEXT ( " -multiInst " ) ;
const TCHAR FLAG_NO_PLUGIN [ ] = TEXT ( " -noPlugin " ) ;
const TCHAR FLAG_READONLY [ ] = TEXT ( " -ro " ) ;
const TCHAR FLAG_NOSESSION [ ] = TEXT ( " -nosession " ) ;
const TCHAR FLAG_NOTABBAR [ ] = TEXT ( " -notabbar " ) ;
2009-11-11 23:55:18 +00:00
const TCHAR FLAG_SYSTRAY [ ] = TEXT ( " -systemtray " ) ;
2010-02-08 00:44:48 +00:00
const TCHAR FLAG_LOADINGTIME [ ] = TEXT ( " -loadingTime " ) ;
2009-11-11 23:55:18 +00:00
const TCHAR FLAG_HELP [ ] = TEXT ( " --help " ) ;
2010-11-14 01:40:33 +00:00
const TCHAR FLAG_ALWAYS_ON_TOP [ ] = TEXT ( " -alwaysOnTop " ) ;
2013-07-17 22:35:34 +00:00
const TCHAR FLAG_OPENSESSIONFILE [ ] = TEXT ( " -openSession " ) ;
2014-03-05 21:18:05 +00:00
const TCHAR FLAG_RECURSIVE [ ] = TEXT ( " -r " ) ;
2009-11-11 23:55:18 +00:00
2015-08-04 11:36:22 +00:00
static void doException ( Notepad_plus_Window & notepad_plus_plus )
{
Win32Exception : : removeHandler ( ) ; //disable exception handler after excpetion, we dont want corrupt data structurs to crash the exception handler
: : MessageBox ( Notepad_plus_Window : : gNppHWND , TEXT ( " Notepad++ will attempt to save any unsaved data. However, dataloss is very likely. " ) , TEXT ( " Recovery initiating " ) , MB_OK | MB_ICONINFORMATION ) ;
TCHAR tmpDir [ 1024 ] ;
GetTempPath ( 1024 , tmpDir ) ;
generic_string emergencySavedDir = tmpDir ;
emergencySavedDir + = TEXT ( " \\ N++RECOV " ) ;
bool res = notepad_plus_plus . emergency ( emergencySavedDir ) ;
if ( res )
{
generic_string displayText = TEXT ( " Notepad++ was able to successfully recover some unsaved documents, or nothing to be saved could be found. \r \n You can find the results at : \r \n " ) ;
displayText + = emergencySavedDir ;
: : MessageBox ( Notepad_plus_Window : : gNppHWND , displayText . c_str ( ) , TEXT ( " Recovery success " ) , MB_OK | MB_ICONINFORMATION ) ;
}
else
: : MessageBox ( Notepad_plus_Window : : gNppHWND , TEXT ( " Unfortunatly, Notepad++ was not able to save your work. We are sorry for any lost data. " ) , TEXT ( " Recovery failure " ) , MB_OK | MB_ICONERROR ) ;
}
2009-04-24 23:34:47 +00:00
2009-07-04 11:33:17 +00:00
int WINAPI WinMain ( HINSTANCE hInstance , HINSTANCE , LPSTR , int )
2009-04-24 23:34:47 +00:00
{
LPTSTR cmdLine = : : GetCommandLine ( ) ;
ParamVector params ;
parseCommandLine ( cmdLine , params ) ;
MiniDumper mdump ; //for debugging purposes.
bool TheFirstOne = true ;
: : SetLastError ( NO_ERROR ) ;
: : CreateMutex ( NULL , false , TEXT ( " nppInstance " ) ) ;
if ( : : GetLastError ( ) = = ERROR_ALREADY_EXISTS )
TheFirstOne = false ;
bool isParamePresent ;
2009-11-11 23:55:18 +00:00
bool showHelp = isInList ( FLAG_HELP , params ) ;
2009-04-24 23:34:47 +00:00
bool isMultiInst = isInList ( FLAG_MULTI_INSTANCE , params ) ;
2015-08-04 11:36:22 +00:00
2009-11-11 23:55:18 +00:00
CmdLineParams cmdLineParams ;
2009-04-24 23:34:47 +00:00
cmdLineParams . _isNoTab = isInList ( FLAG_NOTABBAR , params ) ;
cmdLineParams . _isNoPlugin = isInList ( FLAG_NO_PLUGIN , params ) ;
cmdLineParams . _isReadOnly = isInList ( FLAG_READONLY , params ) ;
cmdLineParams . _isNoSession = isInList ( FLAG_NOSESSION , params ) ;
2009-11-11 23:55:18 +00:00
cmdLineParams . _isPreLaunch = isInList ( FLAG_SYSTRAY , params ) ;
2010-11-14 01:40:33 +00:00
cmdLineParams . _alwaysOnTop = isInList ( FLAG_ALWAYS_ON_TOP , params ) ;
2010-02-08 00:44:48 +00:00
cmdLineParams . _showLoadingTime = isInList ( FLAG_LOADINGTIME , params ) ;
2013-07-17 22:35:34 +00:00
cmdLineParams . _isSessionFile = isInList ( FLAG_OPENSESSIONFILE , params ) ;
2014-03-05 21:18:05 +00:00
cmdLineParams . _isRecursive = isInList ( FLAG_RECURSIVE , params ) ;
2009-04-24 23:34:47 +00:00
cmdLineParams . _langType = getLangTypeFromParam ( params ) ;
2013-07-25 17:41:25 +00:00
cmdLineParams . _localizationPath = getLocalizationPathFromParam ( params ) ;
2009-04-24 23:34:47 +00:00
cmdLineParams . _line2go = getNumberFromParam ( ' n ' , params , isParamePresent ) ;
cmdLineParams . _column2go = getNumberFromParam ( ' c ' , params , isParamePresent ) ;
cmdLineParams . _point . x = getNumberFromParam ( ' x ' , params , cmdLineParams . _isPointXValid ) ;
cmdLineParams . _point . y = getNumberFromParam ( ' y ' , params , cmdLineParams . _isPointYValid ) ;
2015-02-01 12:16:12 +00:00
cmdLineParams . _easterEggName = getEasterEggNameFromParam ( params , cmdLineParams . _quoteType ) ;
2015-08-04 11:36:22 +00:00
2009-11-11 23:55:18 +00:00
if ( showHelp )
: : MessageBox ( NULL , COMMAND_ARG_HELP , TEXT ( " Notepad++ Command Argument Help " ) , MB_OK ) ;
2009-04-24 23:34:47 +00:00
NppParameters * pNppParameters = NppParameters : : getInstance ( ) ;
2015-08-04 11:36:22 +00:00
2013-07-25 17:41:25 +00:00
if ( cmdLineParams . _localizationPath ! = TEXT ( " " ) )
{
pNppParameters - > setStartWithLocFileName ( cmdLineParams . _localizationPath ) ;
}
2013-07-17 22:35:34 +00:00
pNppParameters - > load ( ) ;
2009-04-24 23:34:47 +00:00
// override the settings if notepad style is present
if ( pNppParameters - > asNotepadStyle ( ) )
{
isMultiInst = true ;
cmdLineParams . _isNoTab = true ;
cmdLineParams . _isNoSession = true ;
}
2013-07-17 22:35:34 +00:00
// override the settings if multiInst is choosen by user in the preference dialog
const NppGUI & nppGUI = pNppParameters - > getNppGUI ( ) ;
if ( nppGUI . _multiInstSetting = = multiInst )
{
isMultiInst = true ;
// Only the first launch remembers the session
if ( ! TheFirstOne )
cmdLineParams . _isNoSession = true ;
}
2009-04-24 23:34:47 +00:00
generic_string quotFileName = TEXT ( " " ) ;
// tell the running instance the FULL path to the new files to load
size_t nrFilesToOpen = params . size ( ) ;
2015-12-05 20:39:53 +00:00
for ( size_t i = 0 ; i < nrFilesToOpen ; + + i )
2009-04-24 23:34:47 +00:00
{
2015-05-27 23:22:28 +00:00
const TCHAR * currentFile = params . at ( i ) ;
2012-05-01 12:20:18 +00:00
if ( currentFile [ 0 ] )
2009-04-24 23:34:47 +00:00
{
2012-05-01 12:20:18 +00:00
//check if relative or full path. Relative paths dont have a colon for driveletter
2015-08-04 11:36:22 +00:00
2012-05-01 12:20:18 +00:00
quotFileName + = TEXT ( " \" " ) ;
2015-02-01 12:16:12 +00:00
quotFileName + = relativeFilePathToFullFilePath ( currentFile ) ;
2012-05-01 12:20:18 +00:00
quotFileName + = TEXT ( " \" " ) ;
2009-04-24 23:34:47 +00:00
}
}
//Only after loading all the file paths set the working directory
2009-08-03 00:37:30 +00:00
: : SetCurrentDirectory ( NppParameters : : getInstance ( ) - > getNppPath ( ) . c_str ( ) ) ; //force working directory to path of module, preventing lock
2009-04-24 23:34:47 +00:00
if ( ( ! isMultiInst ) & & ( ! TheFirstOne ) )
{
2010-03-26 00:22:14 +00:00
HWND hNotepad_plus = : : FindWindow ( Notepad_plus_Window : : getClassName ( ) , NULL ) ;
2013-07-08 00:12:50 +00:00
for ( int i = 0 ; ! hNotepad_plus & & i < 5 ; + + i )
2009-07-04 11:33:17 +00:00
{
2009-04-24 23:34:47 +00:00
Sleep ( 100 ) ;
2010-03-26 00:22:14 +00:00
hNotepad_plus = : : FindWindow ( Notepad_plus_Window : : getClassName ( ) , NULL ) ;
2009-07-04 11:33:17 +00:00
}
2009-04-24 23:34:47 +00:00
if ( hNotepad_plus )
{
// First of all, destroy static object NppParameters
pNppParameters - > destroyInstance ( ) ;
MainFileManager - > destroyInstance ( ) ;
2012-04-26 21:32:19 +00:00
int sw = 0 ;
2009-04-24 23:34:47 +00:00
if ( : : IsZoomed ( hNotepad_plus ) )
sw = SW_MAXIMIZE ;
else if ( : : IsIconic ( hNotepad_plus ) )
sw = SW_RESTORE ;
2013-08-06 10:11:49 +00:00
/* REMOVED
2009-04-24 23:34:47 +00:00
else
sw = SW_SHOW ;
// IMPORTANT !!!
: : ShowWindow ( hNotepad_plus , sw ) ;
2013-08-06 10:11:49 +00:00
DEVOMER */
/* ADDED */
if ( sw ! = 0 )
: : ShowWindow ( hNotepad_plus , sw ) ;
/* DEDDA */
2009-04-24 23:34:47 +00:00
: : SetForegroundWindow ( hNotepad_plus ) ;
if ( params . size ( ) > 0 ) //if there are files to open, use the WM_COPYDATA system
{
COPYDATASTRUCT paramData ;
paramData . dwData = COPYDATA_PARAMS ;
paramData . lpData = & cmdLineParams ;
paramData . cbData = sizeof ( cmdLineParams ) ;
COPYDATASTRUCT fileNamesData ;
fileNamesData . dwData = COPYDATA_FILENAMES ;
fileNamesData . lpData = ( void * ) quotFileName . c_str ( ) ;
fileNamesData . cbData = long ( quotFileName . length ( ) + 1 ) * ( sizeof ( TCHAR ) ) ;
: : SendMessage ( hNotepad_plus , WM_COPYDATA , ( WPARAM ) hInstance , ( LPARAM ) & paramData ) ;
: : SendMessage ( hNotepad_plus , WM_COPYDATA , ( WPARAM ) hInstance , ( LPARAM ) & fileNamesData ) ;
}
return 0 ;
}
}
2010-03-26 00:22:14 +00:00
Notepad_plus_Window notepad_plus_plus ;
2015-08-04 11:36:22 +00:00
2009-04-24 23:34:47 +00:00
NppGUI & nppGui = ( NppGUI & ) pNppParameters - > getNppGUI ( ) ;
generic_string updaterDir = pNppParameters - > getNppPath ( ) ;
updaterDir + = TEXT ( " \\ updater \\ " ) ;
generic_string updaterFullPath = updaterDir + TEXT ( " gup.exe " ) ;
2015-08-04 11:36:22 +00:00
2009-04-24 23:34:47 +00:00
generic_string version = TEXT ( " -v " ) ;
version + = VERSION_VALUE ;
bool isUpExist = nppGui . _doesExistUpdater = ( : : PathFileExists ( updaterFullPath . c_str ( ) ) = = TRUE ) ;
2012-11-05 23:13:40 +00:00
2009-08-12 01:13:29 +00:00
bool doUpdate = nppGui . _autoUpdateOpt . _doAutoUpdate ;
2015-08-04 11:36:22 +00:00
if ( doUpdate ) // check more detail
2009-08-12 01:13:29 +00:00
{
Date today ( 0 ) ;
2015-08-04 11:36:22 +00:00
2009-08-12 01:13:29 +00:00
if ( today < nppGui . _autoUpdateOpt . _nextUpdateDate )
doUpdate = false ;
}
2009-04-24 23:34:47 +00:00
2015-05-22 19:11:08 +00:00
// wingup doesn't work with the obsolet security layer (API) under xp since downloadings are secured with SSL on notepad_plus_plus.org
winVer ver = pNppParameters - > getWinVersion ( ) ;
bool isGtXP = ver > WV_XP ;
if ( TheFirstOne & & isUpExist & & doUpdate & & isGtXP )
2009-04-24 23:34:47 +00:00
{
Process updater ( updaterFullPath . c_str ( ) , version . c_str ( ) , updaterDir . c_str ( ) ) ;
updater . run ( ) ;
2015-08-04 11:36:22 +00:00
2009-08-12 01:13:29 +00:00
// Update next update date
if ( nppGui . _autoUpdateOpt . _intervalDays < 0 ) // Make sure interval days value is positive
nppGui . _autoUpdateOpt . _intervalDays = 0 - nppGui . _autoUpdateOpt . _intervalDays ;
nppGui . _autoUpdateOpt . _nextUpdateDate = Date ( nppGui . _autoUpdateOpt . _intervalDays ) ;
2009-04-24 23:34:47 +00:00
}
MSG msg ;
msg . wParam = 0 ;
Win32Exception : : installHandler ( ) ;
2015-08-04 11:36:22 +00:00
try
{
2009-04-24 23:34:47 +00:00
notepad_plus_plus . init ( hInstance , NULL , quotFileName . c_str ( ) , & cmdLineParams ) ;
2013-01-26 22:40:42 +00:00
// Tell UAC that lower integrity processes are allowed to send WM_COPYDATA messages to this process (or window)
// This allows opening new files to already opened elevated Notepad++ process via explorer context menu.
2014-05-10 01:12:44 +00:00
if ( ver > = WV_VISTA | | ver = = WV_UNKNOWN )
2013-01-26 22:40:42 +00:00
{
HMODULE hDll = GetModuleHandle ( TEXT ( " user32.dll " ) ) ;
if ( hDll )
{
2015-08-04 11:36:22 +00:00
// According to MSDN ChangeWindowMessageFilter may not be supported in future versions of Windows,
2013-01-26 22:40:42 +00:00
// that is why we use ChangeWindowMessageFilterEx if it is available (windows version >= Win7).
2015-12-05 20:39:53 +00:00
if ( pNppParameters - > getWinVersion ( ) = = WV_VISTA )
2013-01-26 22:40:42 +00:00
{
typedef BOOL ( WINAPI * MESSAGEFILTERFUNC ) ( UINT message , DWORD dwFlag ) ;
const DWORD MSGFLT_ADD = 1 ;
MESSAGEFILTERFUNC func = ( MESSAGEFILTERFUNC ) : : GetProcAddress ( hDll , " ChangeWindowMessageFilter " ) ;
if ( func )
func ( WM_COPYDATA , MSGFLT_ADD ) ;
}
else
{
typedef BOOL ( WINAPI * MESSAGEFILTERFUNCEX ) ( HWND hWnd , UINT message , DWORD action , VOID * pChangeFilterStruct ) ;
const DWORD MSGFLT_ALLOW = 1 ;
MESSAGEFILTERFUNCEX func = ( MESSAGEFILTERFUNCEX ) : : GetProcAddress ( hDll , " ChangeWindowMessageFilterEx " ) ;
if ( func )
func ( notepad_plus_plus . getHSelf ( ) , WM_COPYDATA , MSGFLT_ALLOW , NULL ) ;
}
}
}
2009-04-24 23:34:47 +00:00
bool going = true ;
while ( going )
{
2014-05-10 01:12:44 +00:00
going = : : GetMessageW ( & msg , NULL , 0 , 0 ) ! = 0 ;
2009-04-24 23:34:47 +00:00
if ( going )
{
// if the message doesn't belong to the notepad_plus_plus's dialog
2014-05-10 01:12:44 +00:00
if ( ! notepad_plus_plus . isDlgsMsg ( & msg ) )
2009-04-24 23:34:47 +00:00
{
if ( : : TranslateAccelerator ( notepad_plus_plus . getHSelf ( ) , notepad_plus_plus . getAccTable ( ) , & msg ) = = 0 )
{
: : TranslateMessage ( & msg ) ;
2014-05-10 01:12:44 +00:00
: : DispatchMessageW ( & msg ) ;
2010-03-26 00:22:14 +00:00
}
2009-04-24 23:34:47 +00:00
}
}
}
2015-08-04 11:36:22 +00:00
}
catch ( int i )
{
2010-05-25 23:41:58 +00:00
TCHAR str [ 50 ] = TEXT ( " God Damned Exception : " ) ;
TCHAR code [ 10 ] ;
wsprintf ( code , TEXT ( " %d " ) , i ) ;
: : MessageBox ( Notepad_plus_Window : : gNppHWND , lstrcat ( str , code ) , TEXT ( " Int Exception " ) , MB_OK ) ;
doException ( notepad_plus_plus ) ;
2015-08-04 11:36:22 +00:00
}
catch ( std : : runtime_error & ex )
{
2010-05-25 23:41:58 +00:00
: : MessageBoxA ( Notepad_plus_Window : : gNppHWND , ex . what ( ) , " Runtime Exception " , MB_OK ) ;
doException ( notepad_plus_plus ) ;
2015-08-04 11:36:22 +00:00
}
catch ( const Win32Exception & ex )
{
2009-04-24 23:34:47 +00:00
TCHAR message [ 1024 ] ; //TODO: sane number
wsprintf ( message , TEXT ( " An exception occured. Notepad++ cannot recover and must be shut down. \r \n The exception details are as follows: \r \n " )
2015-05-28 16:11:35 +00:00
TEXT ( " Code: \t 0x%08X \r \n Type: \t %S \r \n Exception address: 0x%08X " ) , ex . code ( ) , ex . what ( ) , ( long ) ex . where ( ) ) ;
2010-03-26 00:22:14 +00:00
: : MessageBox ( Notepad_plus_Window : : gNppHWND , message , TEXT ( " Win32Exception " ) , MB_OK | MB_ICONERROR ) ;
2009-04-24 23:34:47 +00:00
mdump . writeDump ( ex . info ( ) ) ;
doException ( notepad_plus_plus ) ;
2015-08-04 11:36:22 +00:00
}
catch ( std : : exception & ex )
{
2010-05-25 23:41:58 +00:00
: : MessageBoxA ( Notepad_plus_Window : : gNppHWND , ex . what ( ) , " General Exception " , MB_OK ) ;
2009-04-24 23:34:47 +00:00
doException ( notepad_plus_plus ) ;
2015-08-04 11:36:22 +00:00
}
catch ( . . . ) // this shouldnt ever have to happen
{
2010-05-25 23:41:58 +00:00
: : MessageBoxA ( Notepad_plus_Window : : gNppHWND , " An exception that we did not yet found its name is just caught " , " Unknown Exception " , MB_OK ) ;
2009-04-24 23:34:47 +00:00
doException ( notepad_plus_plus ) ;
}
return ( UINT ) msg . wParam ;
2015-08-04 11:36:22 +00:00
}