Skip to content

Commit

Permalink
initial submit
Browse files Browse the repository at this point in the history
  • Loading branch information
simon-yeunglm committed Oct 7, 2018
1 parent 9d94f70 commit a462027
Show file tree
Hide file tree
Showing 10 changed files with 820 additions and 33 deletions.
37 changes: 5 additions & 32 deletions .gitignore
Original file line number Diff line number Diff line change
@@ -1,32 +1,5 @@
# Prerequisites
*.d

# Compiled Object files
*.slo
*.lo
*.o
*.obj

# Precompiled Headers
*.gch
*.pch

# Compiled Dynamic libraries
*.so
*.dylib
*.dll

# Fortran module files
*.mod
*.smod

# Compiled Static libraries
*.lai
*.la
*.a
*.lib

# Executables
*.exe
*.out
*.app
bin/
build/
*.*~
.vs
*.vcxproj.user
44 changes: 44 additions & 0 deletions HotReload.sln
Original file line number Diff line number Diff line change
@@ -0,0 +1,44 @@

Microsoft Visual Studio Solution File, Format Version 12.00
# Visual Studio 15
VisualStudioVersion = 15.0.28010.2036
MinimumVisualStudioVersion = 10.0.40219.1
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "exe", "exe\exe.vcxproj", "{4A3A9DCC-B43F-4D12-9668-29A53D901EC4}"
ProjectSection(ProjectDependencies) = postProject
{6A3FDFED-6E2D-4E88-9492-6D6B578329B2} = {6A3FDFED-6E2D-4E88-9492-6D6B578329B2}
EndProjectSection
EndProject
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "dll", "dll\dll.vcxproj", "{6A3FDFED-6E2D-4E88-9492-6D6B578329B2}"
EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|x64 = Debug|x64
Debug|x86 = Debug|x86
Release|x64 = Release|x64
Release|x86 = Release|x86
EndGlobalSection
GlobalSection(ProjectConfigurationPlatforms) = postSolution
{4A3A9DCC-B43F-4D12-9668-29A53D901EC4}.Debug|x64.ActiveCfg = Debug|x64
{4A3A9DCC-B43F-4D12-9668-29A53D901EC4}.Debug|x64.Build.0 = Debug|x64
{4A3A9DCC-B43F-4D12-9668-29A53D901EC4}.Debug|x86.ActiveCfg = Debug|Win32
{4A3A9DCC-B43F-4D12-9668-29A53D901EC4}.Debug|x86.Build.0 = Debug|Win32
{4A3A9DCC-B43F-4D12-9668-29A53D901EC4}.Release|x64.ActiveCfg = Release|x64
{4A3A9DCC-B43F-4D12-9668-29A53D901EC4}.Release|x64.Build.0 = Release|x64
{4A3A9DCC-B43F-4D12-9668-29A53D901EC4}.Release|x86.ActiveCfg = Release|Win32
{4A3A9DCC-B43F-4D12-9668-29A53D901EC4}.Release|x86.Build.0 = Release|Win32
{6A3FDFED-6E2D-4E88-9492-6D6B578329B2}.Debug|x64.ActiveCfg = Debug|x64
{6A3FDFED-6E2D-4E88-9492-6D6B578329B2}.Debug|x64.Build.0 = Debug|x64
{6A3FDFED-6E2D-4E88-9492-6D6B578329B2}.Debug|x86.ActiveCfg = Debug|Win32
{6A3FDFED-6E2D-4E88-9492-6D6B578329B2}.Debug|x86.Build.0 = Debug|Win32
{6A3FDFED-6E2D-4E88-9492-6D6B578329B2}.Release|x64.ActiveCfg = Release|x64
{6A3FDFED-6E2D-4E88-9492-6D6B578329B2}.Release|x64.Build.0 = Release|x64
{6A3FDFED-6E2D-4E88-9492-6D6B578329B2}.Release|x86.ActiveCfg = Release|Win32
{6A3FDFED-6E2D-4E88-9492-6D6B578329B2}.Release|x86.Build.0 = Release|Win32
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE
EndGlobalSection
GlobalSection(ExtensibilityGlobals) = postSolution
SolutionGuid = {EFBDC9E0-0E1A-409D-9D54-43F181EE878F}
EndGlobalSection
EndGlobal
28 changes: 27 additions & 1 deletion README.md
Original file line number Diff line number Diff line change
@@ -1,2 +1,28 @@
# HotReload
Hot reload DLL on windows
A sample project of hot-reload DLL on Windows.
More info can be found on my [blog](http://simonstechblog.blogspot.com/2018/10/testing-hot-reload-dll-on-windows.html).

<img src=https://3.bp.blogspot.com/-3HEXCXmcx18/W7nNnTFmj-I/AAAAAAAABKA/w8RXQPvveTY10HaQ0hCndEewAJuZqE5IQCLcBGAs/s640/hot_reload.gif width=640 />

### How it works
When the program loads a DLL:
```
1. copy its associated PDB file.
2. copy the target DLL file and modify the hard coded PDB path to newly copied PDB path done in step 1.
3. load the copied DLL in step 2 instead.
```
After editing some code:
```
4. detach the debugger to compile the DLL from Visual Studio.
5. unload the copied DLL.
6. repeat the above step 1 to 3.
7. re-attach the debugger.
```

### Running the sample program
```
1. in Visual Studio, press F5 to compile and run the program with debugger.
2. edit some code, then press F7 to re-build the solution.
3. press enter to confirm the "Do you want to stop debugging?" dialog.
4. the program will reload the new DLL and re-attach the debugger automatically after compilation.
```
141 changes: 141 additions & 0 deletions dll/dll.vcxproj
Original file line number Diff line number Diff line change
@@ -0,0 +1,141 @@
<?xml version="1.0" encoding="utf-8"?>
<Project DefaultTargets="Build" ToolsVersion="15.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>
<ProjectConfiguration Include="Debug|x64">
<Configuration>Debug</Configuration>
<Platform>x64</Platform>
</ProjectConfiguration>
<ProjectConfiguration Include="Release|x64">
<Configuration>Release</Configuration>
<Platform>x64</Platform>
</ProjectConfiguration>
</ItemGroup>
<PropertyGroup Label="Globals">
<VCProjectVersion>15.0</VCProjectVersion>
<ProjectGuid>{6A3FDFED-6E2D-4E88-9492-6D6B578329B2}</ProjectGuid>
<RootNamespace>dll</RootNamespace>
<WindowsTargetPlatformVersion>10.0.17134.0</WindowsTargetPlatformVersion>
</PropertyGroup>
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">
<ConfigurationType>DynamicLibrary</ConfigurationType>
<UseDebugLibraries>true</UseDebugLibraries>
<PlatformToolset>v141</PlatformToolset>
<CharacterSet>MultiByte</CharacterSet>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">
<ConfigurationType>DynamicLibrary</ConfigurationType>
<UseDebugLibraries>false</UseDebugLibraries>
<PlatformToolset>v141</PlatformToolset>
<WholeProgramOptimization>true</WholeProgramOptimization>
<CharacterSet>MultiByte</CharacterSet>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="Configuration">
<ConfigurationType>DynamicLibrary</ConfigurationType>
<UseDebugLibraries>true</UseDebugLibraries>
<PlatformToolset>v141</PlatformToolset>
<CharacterSet>MultiByte</CharacterSet>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="Configuration">
<ConfigurationType>DynamicLibrary</ConfigurationType>
<UseDebugLibraries>false</UseDebugLibraries>
<PlatformToolset>v141</PlatformToolset>
<WholeProgramOptimization>true</WholeProgramOptimization>
<CharacterSet>MultiByte</CharacterSet>
</PropertyGroup>
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
<ImportGroup Label="ExtensionSettings">
</ImportGroup>
<ImportGroup Label="Shared">
</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>
<ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
<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|x64'">
<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'">
<OutDir>$(SolutionDir)bin\$(Platform)\$(Configuration)\</OutDir>
<IntDir>$(SolutionDir)build\$(Platform)\$(Configuration)\$(ProjectName)\</IntDir>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
<OutDir>$(SolutionDir)bin\$(Platform)\$(Configuration)\</OutDir>
<IntDir>$(SolutionDir)build\$(Platform)\$(Configuration)\$(ProjectName)\</IntDir>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
<OutDir>$(SolutionDir)bin\$(Platform)\$(Configuration)\</OutDir>
<IntDir>$(SolutionDir)build\$(Platform)\$(Configuration)\$(ProjectName)\</IntDir>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
<OutDir>$(SolutionDir)bin\$(Platform)\$(Configuration)\</OutDir>
<IntDir>$(SolutionDir)build\$(Platform)\$(Configuration)\$(ProjectName)\</IntDir>
</PropertyGroup>
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
<ClCompile>
<WarningLevel>Level3</WarningLevel>
<Optimization>Disabled</Optimization>
<SDLCheck>true</SDLCheck>
<ConformanceMode>true</ConformanceMode>
</ClCompile>
</ItemDefinitionGroup>
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
<ClCompile>
<WarningLevel>Level3</WarningLevel>
<Optimization>Disabled</Optimization>
<SDLCheck>true</SDLCheck>
<ConformanceMode>true</ConformanceMode>
</ClCompile>
</ItemDefinitionGroup>
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
<ClCompile>
<WarningLevel>Level3</WarningLevel>
<Optimization>MaxSpeed</Optimization>
<FunctionLevelLinking>true</FunctionLevelLinking>
<IntrinsicFunctions>true</IntrinsicFunctions>
<SDLCheck>true</SDLCheck>
<ConformanceMode>true</ConformanceMode>
</ClCompile>
<Link>
<EnableCOMDATFolding>true</EnableCOMDATFolding>
<OptimizeReferences>true</OptimizeReferences>
</Link>
</ItemDefinitionGroup>
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
<ClCompile>
<WarningLevel>Level3</WarningLevel>
<Optimization>MaxSpeed</Optimization>
<FunctionLevelLinking>true</FunctionLevelLinking>
<IntrinsicFunctions>true</IntrinsicFunctions>
<SDLCheck>true</SDLCheck>
<ConformanceMode>true</ConformanceMode>
</ClCompile>
<Link>
<EnableCOMDATFolding>true</EnableCOMDATFolding>
<OptimizeReferences>true</OptimizeReferences>
</Link>
</ItemDefinitionGroup>
<ItemGroup>
<ClCompile Include="src\dll.cpp" />
</ItemGroup>
<ItemGroup>
<ClInclude Include="src\dll.h" />
</ItemGroup>
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
<ImportGroup Label="ExtensionTargets">
</ImportGroup>
</Project>
9 changes: 9 additions & 0 deletions dll/dll.vcxproj.filters
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<ItemGroup>
<ClInclude Include="src\dll.h" />
</ItemGroup>
<ItemGroup>
<ClCompile Include="src\dll.cpp" />
</ItemGroup>
</Project>
12 changes: 12 additions & 0 deletions dll/src/dll.cpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@

// by simon yeung, 30/09/2018
// all rights reserved

#include <stdio.h>
#include "dll.h"

bool tick()
{
printf("hello\n");
return false;
}
6 changes: 6 additions & 0 deletions dll/src/dll.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
#pragma once

// by simon yeung, 30/09/2018
// all rights reserved

extern "C" __declspec(dllexport) bool tick();
Loading

0 comments on commit a462027

Please sign in to comment.