Can load dynamic library (dll) instead of linking against.
Allow to not link against d3d12 lib
This commit is contained in:
@@ -70,7 +70,7 @@
|
|||||||
<SubSystem>
|
<SubSystem>
|
||||||
</SubSystem>
|
</SubSystem>
|
||||||
<GenerateDebugInformation>true</GenerateDebugInformation>
|
<GenerateDebugInformation>true</GenerateDebugInformation>
|
||||||
<AdditionalDependencies>ws2_32.lib;d3d12.lib;dxgi.lib;dxguid.lib;$(CoreLibraryDependencies);%(AdditionalDependencies)</AdditionalDependencies>
|
<AdditionalDependencies>ws2_32.lib;dxgi.lib;dxguid.lib;$(CoreLibraryDependencies);%(AdditionalDependencies)</AdditionalDependencies>
|
||||||
</Link>
|
</Link>
|
||||||
<Lib>
|
<Lib>
|
||||||
<AdditionalDependencies>
|
<AdditionalDependencies>
|
||||||
@@ -112,6 +112,7 @@
|
|||||||
<ClInclude Include="include\Core\Common\NonNullPtr.h" />
|
<ClInclude Include="include\Core\Common\NonNullPtr.h" />
|
||||||
<ClInclude Include="include\Core\Common\Singleton.h" />
|
<ClInclude Include="include\Core\Common\Singleton.h" />
|
||||||
<ClInclude Include="include\Core\Container\Vector.h" />
|
<ClInclude Include="include\Core\Container\Vector.h" />
|
||||||
|
<ClInclude Include="include\Core\DynLib\DynamicLibrary.h" />
|
||||||
<ClInclude Include="include\Core\HAL\Display\Display.h" />
|
<ClInclude Include="include\Core\HAL\Display\Display.h" />
|
||||||
<ClInclude Include="include\Core\HAL\Event\SystemEvent.h" />
|
<ClInclude Include="include\Core\HAL\Event\SystemEvent.h" />
|
||||||
<ClInclude Include="include\Core\HAL\Keyboard\Keyboard.h" />
|
<ClInclude Include="include\Core\HAL\Keyboard\Keyboard.h" />
|
||||||
@@ -155,6 +156,60 @@
|
|||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<ClCompile Include="src\Core\Application\ApplicationManager.cpp" />
|
<ClCompile Include="src\Core\Application\ApplicationManager.cpp" />
|
||||||
<ClCompile Include="src\Core\Common\CoreUtils.cpp" />
|
<ClCompile Include="src\Core\Common\CoreUtils.cpp" />
|
||||||
|
<ClCompile Include="src\Core\DynLib\Win32\DynamicLibrary.cpp">
|
||||||
|
<RuntimeLibrary>MultiThreadedDebugDll</RuntimeLibrary>
|
||||||
|
<Optimization>Disabled</Optimization>
|
||||||
|
<SupportJustMyCode>true</SupportJustMyCode>
|
||||||
|
<AssemblerOutput>NoListing</AssemblerOutput>
|
||||||
|
<AssemblerListingLocation>W:\Classified\Juliet\Intermediate\Juliet\x64\Debug\</AssemblerListingLocation>
|
||||||
|
<UndefineAllPreprocessorDefinitions>false</UndefineAllPreprocessorDefinitions>
|
||||||
|
<BrowseInformationFile>W:\Classified\Juliet\Intermediate\Juliet\x64\Debug\</BrowseInformationFile>
|
||||||
|
<CompileAs>Default</CompileAs>
|
||||||
|
<ConformanceMode>Default</ConformanceMode>
|
||||||
|
<DiagnosticsFormat>Column</DiagnosticsFormat>
|
||||||
|
<ExceptionHandling>false</ExceptionHandling>
|
||||||
|
<EnableASAN>false</EnableASAN>
|
||||||
|
<EnableFiberSafeOptimizations>false</EnableFiberSafeOptimizations>
|
||||||
|
<EnableEnhancedInstructionSet>NotSet</EnableEnhancedInstructionSet>
|
||||||
|
<FloatingPointModel>Fast</FloatingPointModel>
|
||||||
|
<InlineFunctionExpansion>Default</InlineFunctionExpansion>
|
||||||
|
<IntrinsicFunctions>false</IntrinsicFunctions>
|
||||||
|
<LanguageStandard>stdcpp20</LanguageStandard>
|
||||||
|
<LanguageStandard_C>Default</LanguageStandard_C>
|
||||||
|
<ModuleDependenciesFile>W:\Classified\Juliet\Intermediate\Juliet\x64\Debug\</ModuleDependenciesFile>
|
||||||
|
<OmitDefaultLibName>false</OmitDefaultLibName>
|
||||||
|
<FavorSizeOrSpeed>Neither</FavorSizeOrSpeed>
|
||||||
|
<ObjectFileName>W:\Classified\Juliet\Intermediate\Juliet\x64\Debug\</ObjectFileName>
|
||||||
|
<CallingConvention>Cdecl</CallingConvention>
|
||||||
|
<PrecompiledHeader>Use</PrecompiledHeader>
|
||||||
|
<PrecompiledHeaderFile>pch.h</PrecompiledHeaderFile>
|
||||||
|
<PrecompiledHeaderOutputFile>W:\Classified\Juliet\Intermediate\Juliet\x64\Debug\Juliet.pch</PrecompiledHeaderOutputFile>
|
||||||
|
<PreprocessToFile>false</PreprocessToFile>
|
||||||
|
<PreprocessKeepComments>false</PreprocessKeepComments>
|
||||||
|
<PreprocessSuppressLineNumbers>false</PreprocessSuppressLineNumbers>
|
||||||
|
<ScanSourceForModuleDependencies>false</ScanSourceForModuleDependencies>
|
||||||
|
<ShowIncludes>false</ShowIncludes>
|
||||||
|
<SourceDependenciesFile>W:\Classified\Juliet\Intermediate\Juliet\x64\Debug\</SourceDependenciesFile>
|
||||||
|
<SuppressStartupBanner>true</SuppressStartupBanner>
|
||||||
|
<BufferSecurityCheck>true</BufferSecurityCheck>
|
||||||
|
<SmallerTypeCheck>false</SmallerTypeCheck>
|
||||||
|
<StructMemberAlignment>Default</StructMemberAlignment>
|
||||||
|
<TrackerLogDirectory>W:\Classified\Juliet\Intermediate\Juliet\x64\Debug\Juliet.tlog\</TrackerLogDirectory>
|
||||||
|
<MinimalRebuildFromTracking>true</MinimalRebuildFromTracking>
|
||||||
|
<TreatWarningAsError>false</TreatWarningAsError>
|
||||||
|
<WarningLevel>Level3</WarningLevel>
|
||||||
|
<XMLDocumentationFileName>W:\Classified\Juliet\Intermediate\Juliet\x64\Debug\</XMLDocumentationFileName>
|
||||||
|
<DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
|
||||||
|
<IntelJCCErratum>false</IntelJCCErratum>
|
||||||
|
<BuildStlModules>false</BuildStlModules>
|
||||||
|
<TreatExternalTemplatesAsInternal>true</TreatExternalTemplatesAsInternal>
|
||||||
|
<PreprocessorDefinitions>_DEBUG;JULIET_EXPORT;JULIET_WIN32;_WINDLL;_UNICODE;UNICODE;</PreprocessorDefinitions>
|
||||||
|
<RuntimeTypeInfo>false</RuntimeTypeInfo>
|
||||||
|
<LinkCompiled>true</LinkCompiled>
|
||||||
|
<ClangClMode>true</ClangClMode>
|
||||||
|
<MSCVersion>Default</MSCVersion>
|
||||||
|
<AdditionalOptions>--target=amd64-pc-windows-msvc </AdditionalOptions>
|
||||||
|
</ClCompile>
|
||||||
<ClCompile Include="src\Core\HAL\Display\Display.cpp" />
|
<ClCompile Include="src\Core\HAL\Display\Display.cpp" />
|
||||||
<ClCompile Include="src\Core\HAL\Display\Win32\Win32DisplayDevice.cpp" />
|
<ClCompile Include="src\Core\HAL\Display\Win32\Win32DisplayDevice.cpp" />
|
||||||
<ClCompile Include="src\Core\HAL\Display\Win32\Win32DisplayEvent.cpp" />
|
<ClCompile Include="src\Core\HAL\Display\Win32\Win32DisplayEvent.cpp" />
|
||||||
|
|||||||
14
Juliet/include/Core/DynLib/DynamicLibrary.h
Normal file
14
Juliet/include/Core/DynLib/DynamicLibrary.h
Normal file
@@ -0,0 +1,14 @@
|
|||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include <core/Common/NonNullPtr.h>
|
||||||
|
|
||||||
|
namespace Juliet
|
||||||
|
{
|
||||||
|
struct DynamicLibrary
|
||||||
|
{
|
||||||
|
};
|
||||||
|
|
||||||
|
extern JULIET_API DynamicLibrary* LoadDynamicLibrary(const char* filename);
|
||||||
|
extern JULIET_API FunctionPtr LoadFunction(NonNullPtr<DynamicLibrary> lib, const char* functionName);
|
||||||
|
extern JULIET_API void UnloadDynamicLibrary(NonNullPtr<DynamicLibrary> lib);
|
||||||
|
} // namespace Juliet
|
||||||
75
Juliet/src/Core/DynLib/Win32/DynamicLibrary.cpp
Normal file
75
Juliet/src/Core/DynLib/Win32/DynamicLibrary.cpp
Normal file
@@ -0,0 +1,75 @@
|
|||||||
|
#include <pch.h>
|
||||||
|
|
||||||
|
#include <Core/DynLib/DynamicLibrary.h>
|
||||||
|
#include <Core/HAL/Win32.h>
|
||||||
|
|
||||||
|
namespace Juliet
|
||||||
|
{
|
||||||
|
namespace
|
||||||
|
{
|
||||||
|
// TODO : Move into string file
|
||||||
|
// Use portable code + pass the memory array into parameter and not use new
|
||||||
|
// This is from http://www.rohitab.com/discuss/topic/41257-char-to-lpcwstr/
|
||||||
|
wchar_t* UTF8ToWideChar(const char* utf8)
|
||||||
|
{
|
||||||
|
wchar_t* w;
|
||||||
|
|
||||||
|
int len = MultiByteToWideChar(CP_UTF8, 0, utf8, -1, 0, 0);
|
||||||
|
if (len <= 0)
|
||||||
|
{
|
||||||
|
return nullptr;
|
||||||
|
}
|
||||||
|
|
||||||
|
w = new wchar_t[len];
|
||||||
|
|
||||||
|
if (!w)
|
||||||
|
{
|
||||||
|
return nullptr;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (MultiByteToWideChar(CP_UTF8, 0, utf8, -1, w, len) <= 0)
|
||||||
|
{
|
||||||
|
delete[] w;
|
||||||
|
return nullptr;
|
||||||
|
}
|
||||||
|
|
||||||
|
return w;
|
||||||
|
}
|
||||||
|
} // namespace
|
||||||
|
|
||||||
|
DynamicLibrary* LoadDynamicLibrary(const char* filename)
|
||||||
|
{
|
||||||
|
if (!filename)
|
||||||
|
{
|
||||||
|
Log(LogLevel::Error, LogCategory::Core, "Library filename is invalid (empty)");
|
||||||
|
return nullptr;
|
||||||
|
}
|
||||||
|
|
||||||
|
LPWSTR wstr = UTF8ToWideChar(filename);
|
||||||
|
HMODULE handle = LoadLibraryW(wstr);
|
||||||
|
delete[] wstr;
|
||||||
|
|
||||||
|
// Generate an error message if all loads failed
|
||||||
|
if (!handle)
|
||||||
|
{
|
||||||
|
Log(LogLevel::Error, LogCategory::Core, "Failed loading %s", filename);
|
||||||
|
return nullptr;
|
||||||
|
}
|
||||||
|
return reinterpret_cast<DynamicLibrary*>(handle);
|
||||||
|
}
|
||||||
|
|
||||||
|
FunctionPtr LoadFunction(NonNullPtr<DynamicLibrary> lib, const char* functionName)
|
||||||
|
{
|
||||||
|
auto function = (FunctionPtr)GetProcAddress(reinterpret_cast<HMODULE>(lib.Get()), functionName);
|
||||||
|
if (!function)
|
||||||
|
{
|
||||||
|
Log(LogLevel::Error, LogCategory::Core, "Failed loading %s", functionName);
|
||||||
|
}
|
||||||
|
return function;
|
||||||
|
}
|
||||||
|
|
||||||
|
void UnloadDynamicLibrary(NonNullPtr<DynamicLibrary> lib)
|
||||||
|
{
|
||||||
|
FreeLibrary(reinterpret_cast<HMODULE>(lib.Get()));
|
||||||
|
}
|
||||||
|
} // namespace Juliet
|
||||||
Reference in New Issue
Block a user