Skip to content

Commit 8ed434b

Browse files
committed
Move DynamicLinkLibrary to common and use it in more places
1 parent fb9e7f4 commit 8ed434b

File tree

7 files changed

+82
-103
lines changed

7 files changed

+82
-103
lines changed
+49
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,49 @@
1+
#pragma once
2+
3+
#include <utility>
4+
5+
class DynamicLinkLibrary
6+
{
7+
public:
8+
DynamicLinkLibrary(const wchar_t* filename)
9+
{
10+
handle_ = LoadLibraryW(filename);
11+
}
12+
13+
DynamicLinkLibrary(const DynamicLinkLibrary& other) = delete;
14+
15+
DynamicLinkLibrary(DynamicLinkLibrary&& other) noexcept
16+
: handle_(std::exchange(other.handle_, nullptr))
17+
{}
18+
19+
~DynamicLinkLibrary()
20+
{
21+
if (handle_) {
22+
FreeLibrary(handle_);
23+
}
24+
}
25+
26+
DynamicLinkLibrary& operator=(const DynamicLinkLibrary& other) = delete;
27+
28+
DynamicLinkLibrary& operator=(DynamicLinkLibrary&& other) noexcept
29+
{
30+
std::swap(handle_, other.handle_);
31+
return *this;
32+
}
33+
34+
operator bool() const
35+
{
36+
return handle_ != nullptr;
37+
}
38+
39+
template<typename T>
40+
T get_proc_address(const char* name) const
41+
{
42+
static_assert(std::is_pointer_v<T>);
43+
// Note: double cast is needed to fix cast-function-type GCC warning
44+
return reinterpret_cast<T>(reinterpret_cast<void(*)()>(GetProcAddress(handle_, name)));
45+
}
46+
47+
private:
48+
HMODULE handle_;
49+
};

crash_handler/MiniDumpHelper.cpp

+3-6
Original file line numberDiff line numberDiff line change
@@ -128,18 +128,15 @@ bool MiniDumpHelper::write_dump(const char* path, PEXCEPTION_POINTERS exception_
128128
return result != FALSE;
129129
}
130130

131-
MiniDumpHelper::MiniDumpHelper()
131+
MiniDumpHelper::MiniDumpHelper() :
132+
m_dbghelp_lib{L"Dbghelp.dll"}
132133
{
133-
m_dbghelp_lib = LoadLibraryW(L"Dbghelp.dll");
134134
if (m_dbghelp_lib) {
135-
// Note: double cast is needed to fix cast-function-type GCC warning
136-
m_MiniDumpWriteDump = reinterpret_cast<MiniDumpWriteDump_Type>(reinterpret_cast<void(*)()>(
137-
GetProcAddress(m_dbghelp_lib, "MiniDumpWriteDump")));
135+
m_MiniDumpWriteDump = m_dbghelp_lib.get_proc_address<MiniDumpWriteDump_Type>("MiniDumpWriteDump");
138136
}
139137
}
140138

141139
MiniDumpHelper::~MiniDumpHelper()
142140
{
143-
FreeLibrary(m_dbghelp_lib);
144141
m_MiniDumpWriteDump = nullptr;
145142
}

crash_handler/MiniDumpHelper.h

+2-1
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
#include <string>
44
#include <vector>
55
#include <windows.h>
6+
#include <common/DynamicLinkLibrary.h>
67

78
#ifdef _MSC_VER
89
#pragma warning(push)
@@ -18,7 +19,7 @@ typedef decltype(&MiniDumpWriteDump) MiniDumpWriteDump_Type;
1819
class MiniDumpHelper
1920
{
2021
private:
21-
HMODULE m_dbghelp_lib = nullptr;
22+
DynamicLinkLibrary m_dbghelp_lib;
2223
MiniDumpWriteDump_Type m_MiniDumpWriteDump = nullptr;
2324
std::vector<std::wstring> m_known_modules;
2425
int m_info_level = 0;

game_patch/graphics/d3d11/gr_d3d11.h

+1-46
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,9 @@
11
#pragma once
22

33
#include <unordered_map>
4-
#include <utility>
54
#include <d3d11.h>
65
#include <common/ComPtr.h>
6+
#include <common/DynamicLinkLibrary.h>
77
#include <xlog/xlog.h>
88
#include "../../rf/gr/gr.h"
99
#include "../../rf/os/os.h"
@@ -34,51 +34,6 @@ namespace df::gr::d3d11
3434
class SolidRenderer;
3535
class MeshRenderer;
3636

37-
class DynamicLinkLibrary
38-
{
39-
public:
40-
DynamicLinkLibrary(const wchar_t* filename)
41-
{
42-
handle_ = LoadLibraryW(filename);
43-
}
44-
45-
DynamicLinkLibrary(const DynamicLinkLibrary& other) = delete;
46-
47-
DynamicLinkLibrary(DynamicLinkLibrary&& other) noexcept
48-
: handle_(std::exchange(other.handle_, nullptr))
49-
{}
50-
51-
~DynamicLinkLibrary()
52-
{
53-
if (handle_) {
54-
FreeLibrary(handle_);
55-
}
56-
}
57-
58-
DynamicLinkLibrary& operator=(const DynamicLinkLibrary& other) = delete;
59-
60-
DynamicLinkLibrary& operator=(DynamicLinkLibrary&& other) noexcept
61-
{
62-
std::swap(handle_, other.handle_);
63-
return *this;
64-
}
65-
66-
operator bool() const
67-
{
68-
return handle_ != nullptr;
69-
}
70-
71-
template<typename T>
72-
T get_proc_address(const char* name) const
73-
{
74-
static_assert(std::is_pointer_v<T>);
75-
return reinterpret_cast<T>(reinterpret_cast<void(*)()>(GetProcAddress(handle_, name)));
76-
}
77-
78-
private:
79-
HMODULE handle_;
80-
};
81-
8237
class Renderer
8338
{
8439
public:

launcher_common/VideoDeviceInfoProviderD3D11.cpp

+11-22
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
#include "VideoDeviceInfoProvider.h"
44
#include <common/error/Exception.h>
55
#include <common/error/Win32Error.h>
6+
#include <common/DynamicLinkLibrary.h>
67
#include <common/ComPtr.h>
78
#include <xlog/xlog.h>
89
#include <dxgi.h>
@@ -11,7 +12,7 @@ class VideoDeviceInfoProviderD3D11 : public VideoDeviceInfoProvider
1112
{
1213
public:
1314
VideoDeviceInfoProviderD3D11();
14-
~VideoDeviceInfoProviderD3D11() override;
15+
~VideoDeviceInfoProviderD3D11() override = default;
1516
std::vector<std::string> get_adapters() override;
1617
std::set<Resolution> get_resolutions(unsigned adapter, unsigned format) override;
1718
std::set<unsigned> get_multisample_types(unsigned adapter, unsigned format, bool windowed) override;
@@ -27,46 +28,34 @@ class VideoDeviceInfoProviderD3D11 : public VideoDeviceInfoProvider
2728
}
2829

2930
private:
30-
IDXGIFactory* m_factory;
31-
HMODULE m_dxgi_lib;
32-
HMODULE m_d3d11_lib;
31+
DynamicLinkLibrary m_dxgi_lib;
32+
DynamicLinkLibrary m_d3d11_lib;
33+
ComPtr<IDXGIFactory> m_factory;
3334
decltype(D3D11CreateDevice)* m_D3D11CreateDevice;
3435
};
3536

36-
VideoDeviceInfoProviderD3D11::VideoDeviceInfoProviderD3D11()
37+
VideoDeviceInfoProviderD3D11::VideoDeviceInfoProviderD3D11() :
38+
m_dxgi_lib{L"dxgi.dll"}, m_d3d11_lib{L"d3d11.dll"}
3739
{
38-
m_dxgi_lib = LoadLibraryA("dxgi.dll");
3940
if (!m_dxgi_lib)
4041
THROW_WIN32_ERROR("Failed to load dxgi.dll");
4142

42-
// Note: double cast is needed to fix cast-function-type GCC warning
43-
auto pCreateDXGIFactory = reinterpret_cast<decltype(CreateDXGIFactory)*>(reinterpret_cast<void(*)()>(
44-
GetProcAddress(m_dxgi_lib, "CreateDXGIFactory")));
43+
auto pCreateDXGIFactory = m_dxgi_lib.get_proc_address<decltype(CreateDXGIFactory)*>("CreateDXGIFactory");
4544
if (!pCreateDXGIFactory)
4645
THROW_WIN32_ERROR("Failed to load get CreateDXGIFactory function address");
4746

4847
HRESULT hr = pCreateDXGIFactory(IID_IDXGIFactory, reinterpret_cast<void**>(&m_factory));
4948
if (FAILED(hr))
5049
THROW_EXCEPTION("CreateDXGIFactory failed");
5150

52-
m_d3d11_lib = LoadLibraryA("d3d11.dll");
5351
if (!m_d3d11_lib)
5452
THROW_WIN32_ERROR("Failed to load d3d11.dll");
5553

56-
// Note: double cast is needed to fix cast-function-type GCC warning
57-
m_D3D11CreateDevice = reinterpret_cast<decltype(D3D11CreateDevice)*>(reinterpret_cast<void(*)()>(
58-
GetProcAddress(m_d3d11_lib, "D3D11CreateDevice")));
54+
m_D3D11CreateDevice = m_d3d11_lib.get_proc_address<decltype(D3D11CreateDevice)*>("D3D11CreateDevice");
5955
if (!m_D3D11CreateDevice)
6056
THROW_WIN32_ERROR("Failed to load get D3D11CreateDevice function address");
6157
}
6258

63-
VideoDeviceInfoProviderD3D11::~VideoDeviceInfoProviderD3D11()
64-
{
65-
m_factory->Release();
66-
FreeLibrary(m_d3d11_lib);
67-
FreeLibrary(m_dxgi_lib);
68-
}
69-
7059
std::vector<std::string> VideoDeviceInfoProviderD3D11::get_adapters()
7160
{
7261
std::vector<std::string> adapters;
@@ -138,14 +127,14 @@ std::set<unsigned> VideoDeviceInfoProviderD3D11::get_multisample_types(
138127
unsigned adapter, unsigned format, [[maybe_unused]] bool windowed
139128
) {
140129

141-
ComPtr<IDXGIAdapter> dxgi_adapter = nullptr;
130+
ComPtr<IDXGIAdapter> dxgi_adapter;
142131
HRESULT hr = m_factory->EnumAdapters(adapter, &dxgi_adapter);
143132
if (FAILED(hr)) {
144133
xlog::error("EnumAdapters failed: %lx", hr);
145134
return {};
146135
}
147136

148-
ComPtr<ID3D11Device> d3d11_device = nullptr;
137+
ComPtr<ID3D11Device> d3d11_device;
149138
hr = m_D3D11CreateDevice(dxgi_adapter, D3D_DRIVER_TYPE_HARDWARE, nullptr, 0, nullptr, 0, D3D11_SDK_VERSION, &d3d11_device, nullptr, nullptr);
150139
if (FAILED(hr)) {
151140
xlog::error("D3D11CreateDevice failed: %lx", hr);

launcher_common/VideoDeviceInfoProviderD3D8.cpp

+8-14
Original file line numberDiff line numberDiff line change
@@ -3,13 +3,15 @@
33
#include "VideoDeviceInfoProvider.h"
44
#include <common/error/Exception.h>
55
#include <common/error/Win32Error.h>
6+
#include <common/DynamicLinkLibrary.h>
7+
#include <common/ComPtr.h>
68
#include <xlog/xlog.h>
79

810
class VideoDeviceInfoProviderD3D8 : public VideoDeviceInfoProvider
911
{
1012
public:
1113
VideoDeviceInfoProviderD3D8();
12-
~VideoDeviceInfoProviderD3D8() override;
14+
~VideoDeviceInfoProviderD3D8() override = default;
1315
std::vector<std::string> get_adapters() override;
1416
std::set<Resolution> get_resolutions(unsigned adapter, unsigned format) override;
1517
std::set<unsigned> get_multisample_types(unsigned adapter, unsigned format, bool windowed) override;
@@ -24,19 +26,17 @@ class VideoDeviceInfoProviderD3D8 : public VideoDeviceInfoProvider
2426
}
2527

2628
private:
27-
IDirect3D8* m_d3d;
28-
HMODULE m_lib;
29+
DynamicLinkLibrary m_lib;
30+
ComPtr<IDirect3D8> m_d3d;
2931
};
3032

31-
VideoDeviceInfoProviderD3D8::VideoDeviceInfoProviderD3D8()
33+
VideoDeviceInfoProviderD3D8::VideoDeviceInfoProviderD3D8() :
34+
m_lib{L"d3d8.dll"}
3235
{
33-
m_lib = LoadLibraryA("d3d8.dll");
3436
if (!m_lib)
3537
THROW_WIN32_ERROR("Failed to load d3d8.dll");
3638

37-
// Note: double cast is needed to fix cast-function-type GCC warning
38-
auto pDirect3DCreate8 = reinterpret_cast<decltype(Direct3DCreate8)*>(reinterpret_cast<void(*)()>(
39-
GetProcAddress(m_lib, "Direct3DCreate8")));
39+
auto pDirect3DCreate8 = m_lib.get_proc_address<decltype(Direct3DCreate8)*>("Direct3DCreate8");
4040
if (!pDirect3DCreate8)
4141
THROW_WIN32_ERROR("Failed to load get Direct3DCreate8 function address");
4242

@@ -45,12 +45,6 @@ VideoDeviceInfoProviderD3D8::VideoDeviceInfoProviderD3D8()
4545
THROW_EXCEPTION("Direct3DCreate8 failed");
4646
}
4747

48-
VideoDeviceInfoProviderD3D8::~VideoDeviceInfoProviderD3D8()
49-
{
50-
m_d3d->Release();
51-
FreeLibrary(m_lib);
52-
}
53-
5448
std::vector<std::string> VideoDeviceInfoProviderD3D8::get_adapters()
5549
{
5650
std::vector<std::string> adapters;

launcher_common/VideoDeviceInfoProviderD3D9.cpp

+8-14
Original file line numberDiff line numberDiff line change
@@ -3,13 +3,15 @@
33
#include "VideoDeviceInfoProvider.h"
44
#include <common/error/Exception.h>
55
#include <common/error/Win32Error.h>
6+
#include <common/DynamicLinkLibrary.h>
7+
#include <common/ComPtr.h>
68
#include <xlog/xlog.h>
79

810
class VideoDeviceInfoProviderD3D9 : public VideoDeviceInfoProvider
911
{
1012
public:
1113
VideoDeviceInfoProviderD3D9();
12-
~VideoDeviceInfoProviderD3D9() override;
14+
~VideoDeviceInfoProviderD3D9() override = default;
1315
std::vector<std::string> get_adapters() override;
1416
std::set<Resolution> get_resolutions(unsigned adapter, unsigned format) override;
1517
std::set<unsigned> get_multisample_types(unsigned adapter, unsigned format, bool windowed) override;
@@ -24,19 +26,17 @@ class VideoDeviceInfoProviderD3D9 : public VideoDeviceInfoProvider
2426
}
2527

2628
private:
27-
IDirect3D9* m_d3d;
28-
HMODULE m_lib;
29+
DynamicLinkLibrary m_lib;
30+
ComPtr<IDirect3D9> m_d3d;
2931
};
3032

31-
VideoDeviceInfoProviderD3D9::VideoDeviceInfoProviderD3D9()
33+
VideoDeviceInfoProviderD3D9::VideoDeviceInfoProviderD3D9() :
34+
m_lib{L"d3d9.dll"}
3235
{
33-
m_lib = LoadLibraryA("d3d9.dll");
3436
if (!m_lib)
3537
THROW_WIN32_ERROR("Failed to load d3d9.dll");
3638

37-
// Note: double cast is needed to fix cast-function-type GCC warning
38-
auto pDirect3DCreate9 = reinterpret_cast<decltype(Direct3DCreate9)*>(reinterpret_cast<void(*)()>(
39-
GetProcAddress(m_lib, "Direct3DCreate9")));
39+
auto pDirect3DCreate9 = m_lib.get_proc_address<decltype(Direct3DCreate9)*>("Direct3DCreate9");
4040
if (!pDirect3DCreate9)
4141
THROW_WIN32_ERROR("Failed to load get Direct3DCreate9 function address");
4242

@@ -45,12 +45,6 @@ VideoDeviceInfoProviderD3D9::VideoDeviceInfoProviderD3D9()
4545
THROW_EXCEPTION("Direct3DCreate9 failed");
4646
}
4747

48-
VideoDeviceInfoProviderD3D9::~VideoDeviceInfoProviderD3D9()
49-
{
50-
m_d3d->Release();
51-
FreeLibrary(m_lib);
52-
}
53-
5448
std::vector<std::string> VideoDeviceInfoProviderD3D9::get_adapters()
5549
{
5650
std::vector<std::string> adapters;

0 commit comments

Comments
 (0)