mirror of
				https://github.com/cmderdev/cmder.git
				synced 2025-11-04 19:32:13 +08:00 
			
		
		
		
	Merge pull request #62 from austinwagner/master
Add executable launcher
This commit is contained in:
		
							
								
								
									
										181
									
								
								launcher/.gitignore
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										181
									
								
								launcher/.gitignore
									
									
									
									
										vendored
									
									
										Normal file
									
								
							@@ -0,0 +1,181 @@
 | 
				
			|||||||
 | 
					## Ignore Visual Studio temporary files, build results, and
 | 
				
			||||||
 | 
					## files generated by popular Visual Studio add-ons.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# User-specific files
 | 
				
			||||||
 | 
					*.suo
 | 
				
			||||||
 | 
					*.user
 | 
				
			||||||
 | 
					*.sln.docstates
 | 
				
			||||||
 | 
					*.filters
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# Build results
 | 
				
			||||||
 | 
					[Dd]ebug/
 | 
				
			||||||
 | 
					[Dd]ebugPublic/
 | 
				
			||||||
 | 
					[Rr]elease/
 | 
				
			||||||
 | 
					x64/
 | 
				
			||||||
 | 
					build/
 | 
				
			||||||
 | 
					bld/
 | 
				
			||||||
 | 
					[Bb]in/
 | 
				
			||||||
 | 
					[Oo]bj/
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# Enable "build/" folder in the NuGet Packages folder since NuGet packages use it for MSBuild targets
 | 
				
			||||||
 | 
					!packages/*/build/
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# MSTest test Results
 | 
				
			||||||
 | 
					[Tt]est[Rr]esult*/
 | 
				
			||||||
 | 
					[Bb]uild[Ll]og.*
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#NUNIT
 | 
				
			||||||
 | 
					*.VisualState.xml
 | 
				
			||||||
 | 
					TestResult.xml
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					*_i.c
 | 
				
			||||||
 | 
					*_p.c
 | 
				
			||||||
 | 
					*_i.h
 | 
				
			||||||
 | 
					*.ilk
 | 
				
			||||||
 | 
					*.meta
 | 
				
			||||||
 | 
					*.obj
 | 
				
			||||||
 | 
					*.pch
 | 
				
			||||||
 | 
					*.pdb
 | 
				
			||||||
 | 
					*.pgc
 | 
				
			||||||
 | 
					*.pgd
 | 
				
			||||||
 | 
					*.rsp
 | 
				
			||||||
 | 
					*.sbr
 | 
				
			||||||
 | 
					*.tlb
 | 
				
			||||||
 | 
					*.tli
 | 
				
			||||||
 | 
					*.tlh
 | 
				
			||||||
 | 
					*.tmp
 | 
				
			||||||
 | 
					*.tmp_proj
 | 
				
			||||||
 | 
					*.log
 | 
				
			||||||
 | 
					*.vspscc
 | 
				
			||||||
 | 
					*.vssscc
 | 
				
			||||||
 | 
					.builds
 | 
				
			||||||
 | 
					*.pidb
 | 
				
			||||||
 | 
					*.svclog
 | 
				
			||||||
 | 
					*.scc
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# Chutzpah Test files
 | 
				
			||||||
 | 
					_Chutzpah*
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# Visual C++ cache files
 | 
				
			||||||
 | 
					ipch/
 | 
				
			||||||
 | 
					*.aps
 | 
				
			||||||
 | 
					*.ncb
 | 
				
			||||||
 | 
					*.opensdf
 | 
				
			||||||
 | 
					*.sdf
 | 
				
			||||||
 | 
					*.cachefile
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# Visual Studio profiler
 | 
				
			||||||
 | 
					*.psess
 | 
				
			||||||
 | 
					*.vsp
 | 
				
			||||||
 | 
					*.vspx
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# TFS 2012 Local Workspace
 | 
				
			||||||
 | 
					$tf/
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# Guidance Automation Toolkit
 | 
				
			||||||
 | 
					*.gpState
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# ReSharper is a .NET coding add-in
 | 
				
			||||||
 | 
					_ReSharper*/
 | 
				
			||||||
 | 
					*.[Rr]e[Ss]harper
 | 
				
			||||||
 | 
					*.DotSettings.user
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# JustCode is a .NET coding addin-in
 | 
				
			||||||
 | 
					.JustCode
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# TeamCity is a build add-in
 | 
				
			||||||
 | 
					_TeamCity*
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# DotCover is a Code Coverage Tool
 | 
				
			||||||
 | 
					*.dotCover
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# NCrunch
 | 
				
			||||||
 | 
					*.ncrunch*
 | 
				
			||||||
 | 
					_NCrunch_*
 | 
				
			||||||
 | 
					.*crunch*.local.xml
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# MightyMoose
 | 
				
			||||||
 | 
					*.mm.*
 | 
				
			||||||
 | 
					AutoTest.Net/
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# Installshield output folder
 | 
				
			||||||
 | 
					[Ee]xpress/
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# DocProject is a documentation generator add-in
 | 
				
			||||||
 | 
					DocProject/buildhelp/
 | 
				
			||||||
 | 
					DocProject/Help/*.HxT
 | 
				
			||||||
 | 
					DocProject/Help/*.HxC
 | 
				
			||||||
 | 
					DocProject/Help/*.hhc
 | 
				
			||||||
 | 
					DocProject/Help/*.hhk
 | 
				
			||||||
 | 
					DocProject/Help/*.hhp
 | 
				
			||||||
 | 
					DocProject/Help/Html2
 | 
				
			||||||
 | 
					DocProject/Help/html
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# Click-Once directory
 | 
				
			||||||
 | 
					publish/
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# Publish Web Output
 | 
				
			||||||
 | 
					*.Publish.xml
 | 
				
			||||||
 | 
					*.azurePubxml
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# NuGet Packages Directory
 | 
				
			||||||
 | 
					## TODO: If you have NuGet Package Restore enabled, uncomment the next line
 | 
				
			||||||
 | 
					#packages/
 | 
				
			||||||
 | 
					## TODO: If the tool you use requires repositories.config, also uncomment the next line
 | 
				
			||||||
 | 
					#!packages/repositories.config
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# Windows Azure Build Output
 | 
				
			||||||
 | 
					csx/
 | 
				
			||||||
 | 
					*.build.csdef
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# Windows Store app package directory
 | 
				
			||||||
 | 
					AppPackages/
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# Others
 | 
				
			||||||
 | 
					sql/
 | 
				
			||||||
 | 
					*.Cache
 | 
				
			||||||
 | 
					ClientBin/
 | 
				
			||||||
 | 
					[Ss]tyle[Cc]op.*
 | 
				
			||||||
 | 
					~$*
 | 
				
			||||||
 | 
					*~
 | 
				
			||||||
 | 
					*.dbmdl
 | 
				
			||||||
 | 
					*.dbproj.schemaview
 | 
				
			||||||
 | 
					*.[Pp]ublish.xml
 | 
				
			||||||
 | 
					*.pfx
 | 
				
			||||||
 | 
					*.publishsettings
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# RIA/Silverlight projects
 | 
				
			||||||
 | 
					Generated_Code/
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# Backup & report files from converting an old project file to a newer
 | 
				
			||||||
 | 
					# Visual Studio version. Backup files are not needed, because we have git ;-)
 | 
				
			||||||
 | 
					_UpgradeReport_Files/
 | 
				
			||||||
 | 
					Backup*/
 | 
				
			||||||
 | 
					UpgradeLog*.XML
 | 
				
			||||||
 | 
					UpgradeLog*.htm
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# SQL Server files
 | 
				
			||||||
 | 
					App_Data/*.mdf
 | 
				
			||||||
 | 
					App_Data/*.ldf
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# Business Intelligence projects
 | 
				
			||||||
 | 
					*.rdl.data
 | 
				
			||||||
 | 
					*.bim.layout
 | 
				
			||||||
 | 
					*.bim_*.settings
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# Microsoft Fakes
 | 
				
			||||||
 | 
					FakesAssemblies/
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# =========================
 | 
				
			||||||
 | 
					# Windows detritus
 | 
				
			||||||
 | 
					# =========================
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# Windows image file caches
 | 
				
			||||||
 | 
					Thumbs.db
 | 
				
			||||||
 | 
					ehthumbs.db
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# Folder config file
 | 
				
			||||||
 | 
					Desktop.ini
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# Recycle Bin used on file shares
 | 
				
			||||||
 | 
					$RECYCLE.BIN/
 | 
				
			||||||
							
								
								
									
										22
									
								
								launcher/CmderLauncher.sln
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										22
									
								
								launcher/CmderLauncher.sln
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,22 @@
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
 | 
					Microsoft Visual Studio Solution File, Format Version 12.00
 | 
				
			||||||
 | 
					# Visual Studio 2013
 | 
				
			||||||
 | 
					VisualStudioVersion = 12.0.21005.1
 | 
				
			||||||
 | 
					MinimumVisualStudioVersion = 10.0.40219.1
 | 
				
			||||||
 | 
					Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "CmderLauncher", "CmderLauncher.vcxproj", "{4A8485A5-B7DD-4C44-B7F6-3E2765DD0CD3}"
 | 
				
			||||||
 | 
					EndProject
 | 
				
			||||||
 | 
					Global
 | 
				
			||||||
 | 
						GlobalSection(SolutionConfigurationPlatforms) = preSolution
 | 
				
			||||||
 | 
							Debug|Win32 = Debug|Win32
 | 
				
			||||||
 | 
							Release|Win32 = Release|Win32
 | 
				
			||||||
 | 
						EndGlobalSection
 | 
				
			||||||
 | 
						GlobalSection(ProjectConfigurationPlatforms) = postSolution
 | 
				
			||||||
 | 
							{4A8485A5-B7DD-4C44-B7F6-3E2765DD0CD3}.Debug|Win32.ActiveCfg = Debug|Win32
 | 
				
			||||||
 | 
							{4A8485A5-B7DD-4C44-B7F6-3E2765DD0CD3}.Debug|Win32.Build.0 = Debug|Win32
 | 
				
			||||||
 | 
							{4A8485A5-B7DD-4C44-B7F6-3E2765DD0CD3}.Release|Win32.ActiveCfg = Release|Win32
 | 
				
			||||||
 | 
							{4A8485A5-B7DD-4C44-B7F6-3E2765DD0CD3}.Release|Win32.Build.0 = Release|Win32
 | 
				
			||||||
 | 
						EndGlobalSection
 | 
				
			||||||
 | 
						GlobalSection(SolutionProperties) = preSolution
 | 
				
			||||||
 | 
							HideSolutionNode = FALSE
 | 
				
			||||||
 | 
						EndGlobalSection
 | 
				
			||||||
 | 
					EndGlobal
 | 
				
			||||||
							
								
								
									
										98
									
								
								launcher/CmderLauncher.vcxproj
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										98
									
								
								launcher/CmderLauncher.vcxproj
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,98 @@
 | 
				
			|||||||
 | 
					<?xml version="1.0" encoding="utf-8"?>
 | 
				
			||||||
 | 
					<Project DefaultTargets="Build" ToolsVersion="12.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
 | 
				
			||||||
 | 
					  <ItemGroup Label="ProjectConfigurations">
 | 
				
			||||||
 | 
					    <ProjectConfiguration Include="Debug|Win32">
 | 
				
			||||||
 | 
					      <Configuration>Debug</Configuration>
 | 
				
			||||||
 | 
					      <Platform>Win32</Platform>
 | 
				
			||||||
 | 
					    </ProjectConfiguration>
 | 
				
			||||||
 | 
					    <ProjectConfiguration Include="Release|Win32">
 | 
				
			||||||
 | 
					      <Configuration>Release</Configuration>
 | 
				
			||||||
 | 
					      <Platform>Win32</Platform>
 | 
				
			||||||
 | 
					    </ProjectConfiguration>
 | 
				
			||||||
 | 
					  </ItemGroup>
 | 
				
			||||||
 | 
					  <PropertyGroup Label="Globals">
 | 
				
			||||||
 | 
					    <ProjectGuid>{4A8485A5-B7DD-4C44-B7F6-3E2765DD0CD3}</ProjectGuid>
 | 
				
			||||||
 | 
					    <Keyword>Win32Proj</Keyword>
 | 
				
			||||||
 | 
					    <RootNamespace>CmderLauncher</RootNamespace>
 | 
				
			||||||
 | 
					  </PropertyGroup>
 | 
				
			||||||
 | 
					  <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
 | 
				
			||||||
 | 
					  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">
 | 
				
			||||||
 | 
					    <ConfigurationType>Application</ConfigurationType>
 | 
				
			||||||
 | 
					    <UseDebugLibraries>true</UseDebugLibraries>
 | 
				
			||||||
 | 
					    <PlatformToolset>v120</PlatformToolset>
 | 
				
			||||||
 | 
					    <CharacterSet>Unicode</CharacterSet>
 | 
				
			||||||
 | 
					  </PropertyGroup>
 | 
				
			||||||
 | 
					  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">
 | 
				
			||||||
 | 
					    <ConfigurationType>Application</ConfigurationType>
 | 
				
			||||||
 | 
					    <UseDebugLibraries>false</UseDebugLibraries>
 | 
				
			||||||
 | 
					    <PlatformToolset>v120</PlatformToolset>
 | 
				
			||||||
 | 
					    <WholeProgramOptimization>true</WholeProgramOptimization>
 | 
				
			||||||
 | 
					    <CharacterSet>Unicode</CharacterSet>
 | 
				
			||||||
 | 
					  </PropertyGroup>
 | 
				
			||||||
 | 
					  <Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
 | 
				
			||||||
 | 
					  <ImportGroup Label="ExtensionSettings">
 | 
				
			||||||
 | 
					  </ImportGroup>
 | 
				
			||||||
 | 
					  <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
 | 
				
			||||||
 | 
					    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
 | 
				
			||||||
 | 
					  </ImportGroup>
 | 
				
			||||||
 | 
					  <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
 | 
				
			||||||
 | 
					    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
 | 
				
			||||||
 | 
					  </ImportGroup>
 | 
				
			||||||
 | 
					  <PropertyGroup Label="UserMacros" />
 | 
				
			||||||
 | 
					  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
 | 
				
			||||||
 | 
					    <LinkIncremental>true</LinkIncremental>
 | 
				
			||||||
 | 
					    <TargetName>Cmder</TargetName>
 | 
				
			||||||
 | 
					  </PropertyGroup>
 | 
				
			||||||
 | 
					  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
 | 
				
			||||||
 | 
					    <LinkIncremental>false</LinkIncremental>
 | 
				
			||||||
 | 
					    <TargetName>Cmder</TargetName>
 | 
				
			||||||
 | 
					  </PropertyGroup>
 | 
				
			||||||
 | 
					  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
 | 
				
			||||||
 | 
					    <ClCompile>
 | 
				
			||||||
 | 
					      <PrecompiledHeader>
 | 
				
			||||||
 | 
					      </PrecompiledHeader>
 | 
				
			||||||
 | 
					      <WarningLevel>Level3</WarningLevel>
 | 
				
			||||||
 | 
					      <Optimization>Disabled</Optimization>
 | 
				
			||||||
 | 
					      <PreprocessorDefinitions>WIN32;_DEBUG;_WINDOWS;%(PreprocessorDefinitions)</PreprocessorDefinitions>
 | 
				
			||||||
 | 
					      <SDLCheck>true</SDLCheck>
 | 
				
			||||||
 | 
					    </ClCompile>
 | 
				
			||||||
 | 
					    <Link>
 | 
				
			||||||
 | 
					      <SubSystem>Windows</SubSystem>
 | 
				
			||||||
 | 
					      <GenerateDebugInformation>true</GenerateDebugInformation>
 | 
				
			||||||
 | 
					    </Link>
 | 
				
			||||||
 | 
					  </ItemDefinitionGroup>
 | 
				
			||||||
 | 
					  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
 | 
				
			||||||
 | 
					    <ClCompile>
 | 
				
			||||||
 | 
					      <WarningLevel>Level3</WarningLevel>
 | 
				
			||||||
 | 
					      <PrecompiledHeader>
 | 
				
			||||||
 | 
					      </PrecompiledHeader>
 | 
				
			||||||
 | 
					      <Optimization>MinSpace</Optimization>
 | 
				
			||||||
 | 
					      <FunctionLevelLinking>true</FunctionLevelLinking>
 | 
				
			||||||
 | 
					      <IntrinsicFunctions>false</IntrinsicFunctions>
 | 
				
			||||||
 | 
					      <PreprocessorDefinitions>WIN32;NDEBUG;_WINDOWS;%(PreprocessorDefinitions)</PreprocessorDefinitions>
 | 
				
			||||||
 | 
					      <SDLCheck>true</SDLCheck>
 | 
				
			||||||
 | 
					      <FavorSizeOrSpeed>Size</FavorSizeOrSpeed>
 | 
				
			||||||
 | 
					    </ClCompile>
 | 
				
			||||||
 | 
					    <Link>
 | 
				
			||||||
 | 
					      <SubSystem>Windows</SubSystem>
 | 
				
			||||||
 | 
					      <GenerateDebugInformation>true</GenerateDebugInformation>
 | 
				
			||||||
 | 
					      <EnableCOMDATFolding>true</EnableCOMDATFolding>
 | 
				
			||||||
 | 
					      <OptimizeReferences>true</OptimizeReferences>
 | 
				
			||||||
 | 
					    </Link>
 | 
				
			||||||
 | 
					    <PostBuildEvent>
 | 
				
			||||||
 | 
					      <Command>cp $(TargetPath) $(SolutionDir)..\$(TargetFileName)</Command>
 | 
				
			||||||
 | 
					    </PostBuildEvent>
 | 
				
			||||||
 | 
					  </ItemDefinitionGroup>
 | 
				
			||||||
 | 
					  <ItemGroup>
 | 
				
			||||||
 | 
					    <ResourceCompile Include="src\Resource.rc" />
 | 
				
			||||||
 | 
					  </ItemGroup>
 | 
				
			||||||
 | 
					  <ItemGroup>
 | 
				
			||||||
 | 
					    <ClInclude Include="src\resource.h" />
 | 
				
			||||||
 | 
					  </ItemGroup>
 | 
				
			||||||
 | 
					  <ItemGroup>
 | 
				
			||||||
 | 
					    <ClCompile Include="src\CmderLauncher.cpp" />
 | 
				
			||||||
 | 
					  </ItemGroup>
 | 
				
			||||||
 | 
					  <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
 | 
				
			||||||
 | 
					  <ImportGroup Label="ExtensionTargets">
 | 
				
			||||||
 | 
					  </ImportGroup>
 | 
				
			||||||
 | 
					</Project>
 | 
				
			||||||
							
								
								
									
										231
									
								
								launcher/src/CmderLauncher.cpp
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										231
									
								
								launcher/src/CmderLauncher.cpp
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,231 @@
 | 
				
			|||||||
 | 
					#include <windows.h>
 | 
				
			||||||
 | 
					#include <tchar.h>
 | 
				
			||||||
 | 
					#include <Shlwapi.h>
 | 
				
			||||||
 | 
					#include "resource.h"
 | 
				
			||||||
 | 
					#include <vector>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#pragma comment(lib, "Shlwapi.lib")
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#ifndef UNICODE
 | 
				
			||||||
 | 
					#error "Must be compiled with unicode support."
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#define USE_TASKBAR_API (_WIN32_WINNT >= _WIN32_WINNT_WIN7)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#define MB_TITLE L"Cmder Launcher"
 | 
				
			||||||
 | 
					#define SHELL_MENU_REGISTRY_PATH L"Directory\\Background\\shell\\Cmder"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#define streqi(a, b) (_wcsicmp((a), (b)) == 0) 
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#define WIDEN2(x) L ## x
 | 
				
			||||||
 | 
					#define WIDEN(x) WIDEN2(x)
 | 
				
			||||||
 | 
					#define __WFUNCTION__ WIDEN(__FUNCTION__)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#define FAIL_ON_ERROR(x) { DWORD ec; if ((ec = (x)) != ERROR_SUCCESS) { ShowErrorAndExit(ec, __WFUNCTION__, __LINE__); } }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					void ShowErrorAndExit(DWORD ec, const wchar_t * func, int line)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						wchar_t * buffer;
 | 
				
			||||||
 | 
						if (FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS, 
 | 
				
			||||||
 | 
							NULL, ec, 0, (LPWSTR) &buffer, 0, NULL) == 0)
 | 
				
			||||||
 | 
						{
 | 
				
			||||||
 | 
							buffer = L"Unknown error. FormatMessage failed.";
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						wchar_t message[1024];
 | 
				
			||||||
 | 
						swprintf_s(message, L"%s\nFunction: %s\nLine: %d", buffer, func, line);
 | 
				
			||||||
 | 
						LocalFree(buffer);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						MessageBox(NULL, message, MB_TITLE, MB_OK | MB_ICONERROR);
 | 
				
			||||||
 | 
						exit(1);
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					typedef struct _option
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						std::wstring name;
 | 
				
			||||||
 | 
						bool hasVal;
 | 
				
			||||||
 | 
						std::wstring value;
 | 
				
			||||||
 | 
						bool set;
 | 
				
			||||||
 | 
					} option;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					typedef std::pair<std::wstring, std::wstring> optpair;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					optpair GetOption()
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						wchar_t * cmd = GetCommandLine();
 | 
				
			||||||
 | 
						int argc;
 | 
				
			||||||
 | 
						wchar_t ** argv = CommandLineToArgvW(cmd, &argc);
 | 
				
			||||||
 | 
						optpair pair;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						if (argc == 1)
 | 
				
			||||||
 | 
						{
 | 
				
			||||||
 | 
							pair = optpair(L"/START", L"");
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						else if (argc == 2 && argv[1][0] != L'/')
 | 
				
			||||||
 | 
						{
 | 
				
			||||||
 | 
							pair = optpair(L"/START", argv[1]);
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						else
 | 
				
			||||||
 | 
						{
 | 
				
			||||||
 | 
							pair = optpair(argv[1], argc > 2 ? argv[2] : L"");
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						LocalFree(argv);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						return pair;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					void StartCmder(std::wstring path)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					#if USE_TASKBAR_API
 | 
				
			||||||
 | 
						wchar_t appId[MAX_PATH] = { 0 };
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
						wchar_t exeDir[MAX_PATH] = { 0 };
 | 
				
			||||||
 | 
						wchar_t icoPath[MAX_PATH] = { 0 };
 | 
				
			||||||
 | 
						wchar_t cfgPath[MAX_PATH] = { 0 };
 | 
				
			||||||
 | 
						wchar_t conEmuPath[MAX_PATH] = { 0 };
 | 
				
			||||||
 | 
						wchar_t args[MAX_PATH * 2 + 256] = { 0 };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						GetModuleFileName(NULL, exeDir, sizeof(exeDir));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#if USE_TASKBAR_API
 | 
				
			||||||
 | 
						wcscpy_s(appId, exeDir);
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						PathRemoveFileSpec(exeDir);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						PathCombine(icoPath, exeDir, L"icons\\cmder.ico");
 | 
				
			||||||
 | 
						PathCombine(cfgPath, exeDir, L"config\\ConEmu.xml");
 | 
				
			||||||
 | 
						PathCombine(conEmuPath, exeDir, L"vendor\\conemu-maximus5\\ConEmu.exe");
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						swprintf_s(args, L"/Icon \"%s\" /Title Cmder /LoadCfgFile \"%s\"", icoPath, cfgPath);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						SetEnvironmentVariable(L"CMDER_ROOT", exeDir);
 | 
				
			||||||
 | 
						SetEnvironmentVariable(L"CMDER_START", path.c_str());
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						STARTUPINFO si = { 0 };
 | 
				
			||||||
 | 
						si.cb = sizeof(STARTUPINFO);
 | 
				
			||||||
 | 
					#if USE_TASKBAR_API
 | 
				
			||||||
 | 
						si.lpTitle = appId;
 | 
				
			||||||
 | 
						si.dwFlags = STARTF_TITLEISAPPID;
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						PROCESS_INFORMATION pi;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						CreateProcess(conEmuPath, args, NULL, NULL, false, 0, NULL, NULL, &si, &pi);
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					bool IsUserOnly(std::wstring opt)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						bool userOnly;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						if (streqi(opt.c_str(), L"ALL"))
 | 
				
			||||||
 | 
						{
 | 
				
			||||||
 | 
							userOnly = false;
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						else if (streqi(opt.c_str(), L"USER"))
 | 
				
			||||||
 | 
						{
 | 
				
			||||||
 | 
							userOnly = true;
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						else
 | 
				
			||||||
 | 
						{
 | 
				
			||||||
 | 
							MessageBox(NULL, L"Unrecognized option for /REGISTER or /UNREGISTER. Must be either ALL or USER.", MB_TITLE, MB_OK);
 | 
				
			||||||
 | 
							exit(1);
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						return userOnly;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					HKEY GetRootKey(std::wstring opt)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						HKEY root;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						if (IsUserOnly(opt))
 | 
				
			||||||
 | 
						{
 | 
				
			||||||
 | 
							FAIL_ON_ERROR(RegCreateKeyEx(HKEY_CURRENT_USER, L"Software\\Classes", 0, NULL,
 | 
				
			||||||
 | 
								REG_OPTION_NON_VOLATILE, KEY_ALL_ACCESS, NULL, &root, NULL));
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						else
 | 
				
			||||||
 | 
						{
 | 
				
			||||||
 | 
							root = HKEY_CLASSES_ROOT;
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						return root;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					void RegisterShellMenu(std::wstring opt)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						HKEY root = GetRootKey(opt);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						HKEY cmderKey;
 | 
				
			||||||
 | 
						FAIL_ON_ERROR(
 | 
				
			||||||
 | 
							RegCreateKeyEx(root, SHELL_MENU_REGISTRY_PATH, 0, NULL,
 | 
				
			||||||
 | 
							REG_OPTION_NON_VOLATILE, KEY_ALL_ACCESS, NULL, &cmderKey, NULL));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						FAIL_ON_ERROR(RegSetValue(cmderKey, L"", REG_SZ, L"Cmder Here", NULL));
 | 
				
			||||||
 | 
						FAIL_ON_ERROR(RegSetValueEx(cmderKey, L"NoWorkingDirectory", 0, REG_SZ, (BYTE *)L"", 2));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						HKEY command;
 | 
				
			||||||
 | 
						FAIL_ON_ERROR(
 | 
				
			||||||
 | 
							RegCreateKeyEx(cmderKey, L"command", 0, NULL,
 | 
				
			||||||
 | 
							REG_OPTION_NON_VOLATILE, KEY_ALL_ACCESS, NULL, &command, NULL));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						wchar_t exePath[MAX_PATH] = { 0 };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						GetModuleFileName(NULL, exePath, sizeof(exePath));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						wchar_t commandStr[MAX_PATH + 20] = { 0 };
 | 
				
			||||||
 | 
						swprintf_s(commandStr, L"\"%s\" \"%%V\"", exePath);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						FAIL_ON_ERROR(RegSetValue(command, L"", REG_SZ, commandStr, NULL));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						RegCloseKey(command);
 | 
				
			||||||
 | 
						RegCloseKey(cmderKey);
 | 
				
			||||||
 | 
						RegCloseKey(root);
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					void UnregisterShellMenu(std::wstring opt)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						HKEY root = GetRootKey(opt);
 | 
				
			||||||
 | 
						HKEY cmderKey;
 | 
				
			||||||
 | 
						FAIL_ON_ERROR(
 | 
				
			||||||
 | 
							RegCreateKeyEx(root, SHELL_MENU_REGISTRY_PATH, 0, NULL,
 | 
				
			||||||
 | 
							REG_OPTION_NON_VOLATILE, KEY_ALL_ACCESS, NULL, &cmderKey, NULL));
 | 
				
			||||||
 | 
						FAIL_ON_ERROR(RegDeleteTree(cmderKey, NULL));
 | 
				
			||||||
 | 
						FAIL_ON_ERROR(RegDeleteKey(root, SHELL_MENU_REGISTRY_PATH));
 | 
				
			||||||
 | 
						RegCloseKey(cmderKey);
 | 
				
			||||||
 | 
						RegCloseKey(root);
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					int APIENTRY _tWinMain(_In_ HINSTANCE hInstance,
 | 
				
			||||||
 | 
						_In_opt_ HINSTANCE hPrevInstance,
 | 
				
			||||||
 | 
						_In_ LPTSTR    lpCmdLine,
 | 
				
			||||||
 | 
						_In_ int       nCmdShow)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						UNREFERENCED_PARAMETER(hPrevInstance);
 | 
				
			||||||
 | 
						UNREFERENCED_PARAMETER(lpCmdLine);
 | 
				
			||||||
 | 
						UNREFERENCED_PARAMETER(nCmdShow);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						optpair opt = GetOption();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						if (streqi(opt.first.c_str(), L"/START"))
 | 
				
			||||||
 | 
						{
 | 
				
			||||||
 | 
							StartCmder(opt.second);
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						else if (streqi(opt.first.c_str(), L"/REGISTER"))
 | 
				
			||||||
 | 
						{
 | 
				
			||||||
 | 
							RegisterShellMenu(opt.second);
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						else if (streqi(opt.first.c_str(), L"/UNREGISTER"))
 | 
				
			||||||
 | 
						{
 | 
				
			||||||
 | 
							UnregisterShellMenu(opt.second);
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						else
 | 
				
			||||||
 | 
						{
 | 
				
			||||||
 | 
							MessageBox(NULL, L"Unrecognized parameter.\n\nValid options:\n  /START <path>\n  /REGISTER [USER/ALL]\n  /UNREGISTER [USER/ALL]", MB_TITLE, MB_OK);
 | 
				
			||||||
 | 
							return 1;
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						return 0;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
							
								
								
									
										
											BIN
										
									
								
								launcher/src/Resource.rc
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										
											BIN
										
									
								
								launcher/src/Resource.rc
									
									
									
									
									
										Normal file
									
								
							
										
											Binary file not shown.
										
									
								
							
							
								
								
									
										
											BIN
										
									
								
								launcher/src/resource.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										
											BIN
										
									
								
								launcher/src/resource.h
									
									
									
									
									
										Normal file
									
								
							
										
											Binary file not shown.
										
									
								
							
							
								
								
									
										3
									
								
								vendor/init.bat
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										3
									
								
								vendor/init.bat
									
									
									
									
										vendored
									
									
								
							@@ -40,4 +40,7 @@
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
:: Set home path
 | 
					:: Set home path
 | 
				
			||||||
@set HOME=%USERPROFILE%
 | 
					@set HOME=%USERPROFILE%
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					@if defined CMDER_START cd /d "%CMDER_START%"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@echo Welcome to cmder!
 | 
					@echo Welcome to cmder!
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user