program UltraExplorer; // Debugging Aids // {.$DEFINE GX_DEBUG} {.$DEFINE GX_DEBUG_SINGLE_INSTANCE} uses FastShareMem, // ANGUS // FastMM4, // ANGUS Forms, TntClasses, TntSystem, TntSysUtils, Windows, Classes, SysUtils, DbugIntf, MPCommonUtilities, MPCommonObjects, UltraOptions, UltraFavTree in 'UltraFavTree.pas', UltraTaskInf in 'Plugin Tasks\UltraTaskInf.pas', UltraUserStrings in 'UltraUserStrings.pas', UltraUtilities in 'UltraUtilities.pas', UnitAboutForm in 'UnitAboutForm.pas' {TntFormAbout}, UnitEditGroupingCriteria in 'UnitEditGroupingCriteria.pas' {TntFormGroupingCriteria: TTntForm}, UnitEditGroupingCriteriaEdit in 'UnitEditGroupingCriteriaEdit.pas' {TntFormGroupingCriteriaEdit: TTntForm}, UnitFavoriteCrumbBar in 'UnitFavoriteCrumbBar.pas', UnitFileObjectsForm in 'UnitFileObjectsForm.pas' {TntFormFileObjects: TTntForm}, UnitHelpTranslateForm in 'UnitHelpTranslateForm.pas' {TntFormTranslation: TTntForm}, UnitInPlaceWndInf in 'UnitInPlaceWndInf.pas', UnitListerPluginsExtensionsForm in 'UnitListerPluginsExtensionsForm.pas' {TntFormExtEdit: TTntForm}, UnitListerPluginsForm in 'UnitListerPluginsForm.pas' {TntFormPlugins: TTntForm}, UnitMainForm in 'UnitMainForm.pas' {TntFormUltraExplorer}, UnitOkDialog in 'UnitOkDialog.pas' {TntFormOkDialog: TTntForm}, UnitOptionsBase in 'UnitOptionsBase.pas' {TntOptionsBaseForm: TTntForm}, UnitOptionsCmdLine in 'UnitOptionsCmdLine.pas' {TntFormOptionsCmdLine: TTntForm}, UnitOptionsDropStack in 'UnitOptionsDropStack.pas' {TntFormOptionsDropStack: TTntForm}, UnitOptionsFavorites in 'UnitOptionsFavorites.pas' {TntFormOptionsFavorites: TTntForm}, UnitOptionsFilter in 'UnitOptionsFilter.pas' {TntFormOptionsFilter: TTntForm}, UnitOptionsFolderSizes in 'UnitOptionsFolderSizes.pas' {TntFormOptionsFolderSizes: TTntForm}, UnitOptionsFrame in 'UnitOptionsFrame.pas' {TntFormOptionsFrame: TTntForm}, UnitOptionsGeneral in 'UnitOptionsGeneral.pas' {TntFormOptionsGeneral: TTntForm}, UnitOptionsHistory in 'UnitOptionsHistory.pas' {TntFormOptionsHistory: TTntForm}, UnitOptionsListview in 'UnitOptionsListview.pas' {TntFormOptionsListview: TTntForm}, UnitOptionsListviewColoring in 'UnitOptionsListviewColoring.pas' {TntFormOptionsListviewColoring}, UnitOptionsListviewColumns in 'UnitOptionsListviewColumns.pas' {TntFormOptionsListviewColumns: TTntForm}, UnitOptionsListviewGrouping in 'UnitOptionsListviewGrouping.pas' {TntFormOptionsListviewGrouping: TTntForm}, UnitOptionsListviewGroupingColorEditor in 'UnitOptionsListviewGroupingColorEditor.pas' {TntFormExtensionColorEditor: TTntForm}, UnitOptionsListviewThumbnails in 'UnitOptionsListviewThumbnails.pas' {TntFormOptionsListviewThumbnails: TTntForm}, UnitOptionsMouse in 'UnitOptionsMouse.pas' {TntFormOptionsMouse}, UnitOptionsTabs in 'UnitOptionsTabs.pas' {TntFormOptionsTabs: TTntForm}, UnitOptionsToolbar in 'UnitOptionsToolbar.pas' {TntFormOptionsToolbar: TTntForm}, UnitOptionsToolbarDrives in 'UnitOptionsToolbarDrives.pas' {TntFormOptionsToolbarDrives: TTntForm}, UnitOptionsTreeview in 'UnitOptionsTreeview.pas' {TntFormOptionsTreeview}, UnitOptionsViewer in 'UnitOptionsViewer.pas' {TntFormOptionsViewer: TTntForm}, UnitPlugInBaseFrame in 'UnitPlugInBaseFrame.pas' {TntFrameBasePlugIn: TTntFrame}, UnitPluginColumnsModeFrame in 'UnitPluginColumnsModeFrame.pas' {TntFramePlugInColumnMode: TTntFrame}, UnitPlugInFlattenFolderFrame in 'UnitPlugInFlattenFolderFrame.pas' {TntFramePlugInFlattenFolder: TTntFrame}, UnitPlugInSearchFrame in 'UnitPlugInSearchFrame.pas' {TntFramePlugInSearch: TTntFrame}, UnitSearchAdvOptions in 'UnitSearchAdvOptions.pas' {EasyTaskPanelFormAdvOptions: TEasyTaskPanelForm}, UnitSearchBrowseTaskPanel in 'UnitSearchBrowseTaskPanel.pas' {EasyTaskPanelFormBrowse: TEasyTaskPanelForm}, UnitSearchMainTaskPanel in 'UnitSearchMainTaskPanel.pas' {EasyTaskPanelFormMainSearch: TEasyTaskPanelForm}, UnitSearchModifedTaskPanel in 'UnitSearchModifedTaskPanel.pas' {EasyTaskPanelFormSearchDate: TEasyTaskPanelForm}, UnitSearchSizeTaskPanel in 'UnitSearchSizeTaskPanel.pas' {EasyTaskPanelFormSearchSize: TEasyTaskPanelForm}, UnitTaskPlugins in 'UnitTaskPlugins.pas', UnitUltraLaunchDesignerForm in 'UnitUltraLaunchDesignerForm.pas' {TntFormUltraLaunchDesigner: TTntForm}, UnitYesNoDialog in 'UnitYesNoDialog.pas' {TntFormYesNoDialog: TTntForm}, UnitTabSetFrame in 'UnitTabSetFrame.pas' {TntFrameTabs: TTntFrame}, UnitPlugInListviewFrame in 'UnitPlugInListviewFrame.pas' {TntFrameBasePlugInListview: TTntFrame}, UnitPlugInFTPFrame in 'UnitPlugInFTPFrame.pas' {TntFrameBasePlugInFTPClient: TTntFrame}, UnitOptionsListviewCommon in 'UnitOptionsListviewCommon.pas' {TntFormOptionsListviewCommon: TTntForm}, UnitMatchTextDialog in 'UnitMatchTextDialog.pas' {TntFormMatchText: TTntForm}, UnitPlugInFileCart in 'UnitPlugInFileCart.pas' {TntFrameBasePlugInFileCart: TTntFrame}, UnitFTPProfileEditorForm in 'UnitFTPProfileEditorForm.pas' {TntFormFTPProfileEditor: TTntForm}, UnitDialogEnterText in 'UnitDialogEnterText.pas' {TntFormEnterText: TTntForm}, UnitOptionsApplyViewSettings in 'UnitOptionsApplyViewSettings.pas' {FormApplyOptionsViewSettings}, UnitSelectionSetEditorForm in 'UnitSelectionSetEditorForm.pas' {TntFormSelectionSetEditor: TTntForm}, UnitPrintPreview in 'UnitPrintPreview.pas' {TntFormPrintPreview: TTntForm}, UnitOptionsListviewContent in 'UnitOptionsListviewContent.pas' {TntFormOptionsListviewContent: TTntForm}, UnitOptionsListviewContentEditor in 'UnitOptionsListviewContentEditor.pas' {TntFormTntFormContentRuleEditor: TTntForm}, UltraContentRules in 'UltraContentRules.pas', UnitSmartRename in 'UnitSmartRename.pas' {TntFormSmartRename: TTntForm}; {$R *.res} const STR_OPTIONSETTINGS_FILE = 'UltraOptions.cfg'; function OptionSettingsFile: WideString; begin Result := AppFilesPath + '\' + STR_OPTIONSETTINGS_FILE end; var Wnd: HWnd; Mutex: THandle; S: String; Process: THandle; StringList: TStringList; begin TntSystem.InstallTntSystemUpdates; MutexFileSyncEnsureExists; Mutex := OpenMutex(MUTEX_ALL_ACCESS, False, STR_FILESYNCMUTEX); try WaitForSingleObject(Mutex, INFINITE); if WideFileExists(OptionSettingsFile) then Attribs.LoadFromFileText(OptionSettingsFile); finally if Mutex <> 0 then begin ReleaseMutex(Mutex); CloseHandle(Mutex) end end; Mutex := 0; if Attribs.General.SingleInstance then begin {$IFDEF GX_DEBUG_SINGLE_INSTANCE} SendDebug('Checking for Second Instance'); {$ENDIF GX_DEBUG_SINGLE_INSTANCE} if OpenMutex(MUTEX_ALL_ACCESS, False, STR_SINGLEINSTANCEMUTEX) = 0 then begin {$IFDEF GX_DEBUG_SINGLE_INSTANCE} SendDebug('Second Instance was not Detected'); {$ENDIF GX_DEBUG_SINGLE_INSTANCE} Mutex := CreateMutex(nil, False, STR_SINGLEINSTANCEMUTEX); end else begin {$IFDEF GX_DEBUG_SINGLE_INSTANCE} SendDebug('Second Instance Detected'); {$ENDIF GX_DEBUG_SINGLE_INSTANCE} S := TTntFormUltraExplorer.ClassName; if IsUnicode then Wnd := FindWindow(PChar( S + '.UnicodeClass'), nil) else Wnd := FindWindow(PChar( S), nil); if Wnd > 0 then begin // Allows SetForegroundWindow to work in Win2k and up // Tells the window manager to allow the first process it is ok // with this process that it takes the forground instead of this process if Assigned(AllowSetForegroundWindow_MP) then begin Process := SendMessage(Wnd, WM_GETPROCESSID, 0, 0); AllowSetForegroundWindow_MP(Process); end; // Take the forground SetForegroundWindow(Application.Handle); // Then give it away SetForegroundWindow(Wnd); {$IFDEF GX_DEBUG_SINGLE_INSTANCE} SendDebug('Found Second Instance window handle'); {$ENDIF GX_DEBUG_SINGLE_INSTANCE} StringList := TStringList.Create; LoadCommandLineParameters(StringList); StringList.SaveToFile(AppFilesPath + '\' + STR_PASSPARAMS_FILE); StringList.Free; {$IFDEF GX_DEBUG_SINGLE_INSTANCE} SendDebug('Sending message to Second Instance'); {$ENDIF GX_DEBUG_SINGLE_INSTANCE} if SendMessage(Wnd, WM_BRINGTOFRONT, 0, 0) = 1 then begin {$IFDEF GX_DEBUG_SINGLE_INSTANCE} SendDebug('Message to Second Instance returned Successful'); {$ENDIF GX_DEBUG_SINGLE_INSTANCE} end else begin {$IFDEF GX_DEBUG_SINGLE_INSTANCE} SendDebug('Message to Second Instance returned Unsuccessful'); {$ENDIF GX_DEBUG_SINGLE_INSTANCE} end; Exit; end else begin {$IFDEF GX_DEBUG_SINGLE_INSTANCE} SendDebug('Count not find Second Instance window handle'); {$ENDIF GX_DEBUG_SINGLE_INSTANCE} end end end; // HintWindowClass := TCommonHintWindow; Application.Initialize; Application.MainFormOnTaskbar := True; // ANGUS // Make it Vista Compatible SetWindowLong(Application.Handle, GWL_EXSTYLE, GetWindowLong(Application.Handle, GWL_EXSTYLE) and not WS_EX_APPWINDOW or WS_EX_TOOLWINDOW); if Attribs.General.TrayIcon then ShowWindow(Application.Handle, SW_HIDE); Application.Title := 'UltraExplorer'; Application.CreateForm(TTntFormUltraExplorer, TntFormUltraExplorer); Application.CreateForm(TTntFormFileObjects, TntFormFileObjects); Application.Run; if Mutex <> 0 then CloseHandle(Mutex); end.