update: Resource
This commit is contained in:
parent
1ed684f3a1
commit
b44f71e251
|
|
@ -19,15 +19,13 @@
|
||||||
// THE SOFTWARE.
|
// THE SOFTWARE.
|
||||||
|
|
||||||
#include "Resource.h"
|
#include "Resource.h"
|
||||||
|
#include "logs.h"
|
||||||
|
|
||||||
namespace easy2d
|
namespace easy2d
|
||||||
{
|
{
|
||||||
Resource::Resource(LPCWSTR name, LPCWSTR type)
|
Resource::Resource(LPCWSTR name, LPCWSTR type)
|
||||||
: name_(name)
|
: name_(name)
|
||||||
, type_(type)
|
, type_(type)
|
||||||
, data_(nullptr)
|
|
||||||
, data_size_(0)
|
|
||||||
, loaded_(false)
|
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -41,58 +39,45 @@ namespace easy2d
|
||||||
return type_;
|
return type_;
|
||||||
}
|
}
|
||||||
|
|
||||||
LPVOID Resource::GetData() const
|
|
||||||
{
|
|
||||||
return data_;
|
|
||||||
}
|
|
||||||
|
|
||||||
DWORD Resource::GetDataSize() const
|
|
||||||
{
|
|
||||||
return data_size_;
|
|
||||||
}
|
|
||||||
|
|
||||||
size_t Resource::GetHashCode() const
|
size_t Resource::GetHashCode() const
|
||||||
{
|
{
|
||||||
return std::hash<LPCWSTR>{}(name_);
|
return std::hash<LPCWSTR>{}(name_);
|
||||||
}
|
}
|
||||||
|
|
||||||
bool Resource::Load()
|
bool Resource::Load(ResourceData* buffer) const
|
||||||
{
|
{
|
||||||
if (!loaded_)
|
if (!buffer)
|
||||||
|
return false;
|
||||||
|
|
||||||
|
HGLOBAL res_data;
|
||||||
|
HRSRC res_info;
|
||||||
|
|
||||||
|
res_info = FindResourceW(nullptr, name_, type_);
|
||||||
|
if (res_info == nullptr)
|
||||||
{
|
{
|
||||||
HRSRC res_info;
|
logs::Trace(L"FindResource");
|
||||||
HGLOBAL res_data;
|
return false;
|
||||||
HINSTANCE hinstance = GetModuleHandle(NULL);
|
}
|
||||||
|
|
||||||
res_info = FindResourceW(hinstance, name_, type_);
|
res_data = LoadResource(nullptr, res_info);
|
||||||
if (res_info == nullptr)
|
if (res_data == nullptr)
|
||||||
{
|
{
|
||||||
E2D_WARNING("FindResource");
|
logs::Trace(L"LoadResource");
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
res_data = LoadResource(hinstance, res_info);
|
(*buffer).buffer_size = SizeofResource(nullptr, res_info);
|
||||||
if (res_data == nullptr)
|
if ((*buffer).buffer_size == 0)
|
||||||
{
|
{
|
||||||
E2D_WARNING("LoadResource");
|
logs::Trace(L"SizeofResource");
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
data_size_ = SizeofResource(hinstance, res_info);
|
(*buffer).buffer = LockResource(res_data);
|
||||||
if (data_size_ == 0)
|
if ((*buffer).buffer == nullptr)
|
||||||
{
|
{
|
||||||
E2D_WARNING("SizeofResource");
|
logs::Trace(L"LockResource");
|
||||||
return false;
|
return false;
|
||||||
}
|
|
||||||
|
|
||||||
data_ = LockResource(res_data);
|
|
||||||
if (data_ == nullptr)
|
|
||||||
{
|
|
||||||
E2D_WARNING("LockResource");
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
loaded_ = true;
|
|
||||||
}
|
}
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -23,18 +23,31 @@
|
||||||
|
|
||||||
namespace easy2d
|
namespace easy2d
|
||||||
{
|
{
|
||||||
|
// 资源数据
|
||||||
|
//
|
||||||
|
// Usage:
|
||||||
|
// 如果需要手动加载资源, 可以通过 Resource::Load 方法获取资源内容
|
||||||
|
// ResourceData data;
|
||||||
|
// if (res.Load(&data)) {
|
||||||
|
// LPVOID data = data.buffer;
|
||||||
|
// DWORD size = data.buffer_size;
|
||||||
|
// }
|
||||||
|
//
|
||||||
|
struct ResourceData
|
||||||
|
{
|
||||||
|
LPVOID buffer;
|
||||||
|
DWORD buffer_size;
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
// 资源
|
// 资源
|
||||||
//
|
//
|
||||||
// Usage:
|
// Usage:
|
||||||
// Resource 用于获取可执行文件 (exe) 中的资源, 必须在构造函数中指定它的
|
// Resource 用于获取可执行文件 (exe) 中的资源, 必须在构造函数中指定它的
|
||||||
// 资源类型和名称标识符。
|
// 资源类型和名称标识符。
|
||||||
// 例如, 一份音频资源的类型为 L"WAVE", 名称标识符为 IDR_WAVE_1, 那么可以这样指定该资源:
|
// 例如, 一份音频资源的类型为 L"WAVE", 名称标识符为 IDR_WAVE_1,
|
||||||
// Resource res(MAKEINTRESOURCE(IDR_WAVE_1), L"WAVE");
|
// 那么可以这样指定该资源: Resource res(MAKEINTRESOURCE(IDR_WAVE_1), L"WAVE");
|
||||||
// 如果需要手动加载这份资源, 可以通过 Load 方法获取资源内容
|
//
|
||||||
// if (res.Load()) {
|
|
||||||
// LPVOID data = res.GetData();
|
|
||||||
// DWORD size = res.GetDataSize();
|
|
||||||
// }
|
|
||||||
// 了解资源的更多信息: https://docs.microsoft.com/en-us/windows/desktop/menurc/resources
|
// 了解资源的更多信息: https://docs.microsoft.com/en-us/windows/desktop/menurc/resources
|
||||||
//
|
//
|
||||||
class Resource
|
class Resource
|
||||||
|
|
@ -45,23 +58,18 @@ namespace easy2d
|
||||||
LPCWSTR type /* 资源类型 */
|
LPCWSTR type /* 资源类型 */
|
||||||
);
|
);
|
||||||
|
|
||||||
bool Load();
|
bool Load(
|
||||||
|
ResourceData* buffer
|
||||||
|
) const;
|
||||||
|
|
||||||
LPCWSTR GetName() const;
|
LPCWSTR GetName() const;
|
||||||
|
|
||||||
LPCWSTR GetType() const;
|
LPCWSTR GetType() const;
|
||||||
|
|
||||||
LPVOID GetData() const;
|
|
||||||
|
|
||||||
DWORD GetDataSize() const;
|
|
||||||
|
|
||||||
size_t GetHashCode() const;
|
size_t GetHashCode() const;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
bool loaded_;
|
|
||||||
LPCWSTR name_;
|
LPCWSTR name_;
|
||||||
LPCWSTR type_;
|
LPCWSTR type_;
|
||||||
LPVOID data_;
|
|
||||||
DWORD data_size_;
|
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -491,9 +491,10 @@ namespace easy2d
|
||||||
IWICBitmapFrameDecode* source = nullptr;
|
IWICBitmapFrameDecode* source = nullptr;
|
||||||
IWICStream* stream = nullptr;
|
IWICStream* stream = nullptr;
|
||||||
IWICFormatConverter* converter = nullptr;
|
IWICFormatConverter* converter = nullptr;
|
||||||
|
ResourceData buffer;
|
||||||
|
|
||||||
// ¼ÓÔØ×ÊÔ´
|
// ¼ÓÔØ×ÊÔ´
|
||||||
hr = res.Load() ? S_OK : E_FAIL;
|
hr = res.Load(&buffer) ? S_OK : E_FAIL;
|
||||||
|
|
||||||
if (SUCCEEDED(hr))
|
if (SUCCEEDED(hr))
|
||||||
{
|
{
|
||||||
|
|
@ -505,8 +506,8 @@ namespace easy2d
|
||||||
{
|
{
|
||||||
// ³õʼ»¯Á÷
|
// ³õʼ»¯Á÷
|
||||||
hr = stream->InitializeFromMemory(
|
hr = stream->InitializeFromMemory(
|
||||||
static_cast<WICInProcPointer>(res.GetData()),
|
static_cast<WICInProcPointer>(buffer.buffer),
|
||||||
res.GetDataSize()
|
buffer.buffer_size
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -124,11 +124,12 @@ namespace easy2d
|
||||||
if (file_handle == INVALID_HANDLE_VALUE)
|
if (file_handle == INVALID_HANDLE_VALUE)
|
||||||
return file;
|
return file;
|
||||||
|
|
||||||
if (res.Load())
|
ResourceData buffer;
|
||||||
|
if (res.Load(&buffer))
|
||||||
{
|
{
|
||||||
// 写入文件
|
// 写入文件
|
||||||
DWORD written_bytes = 0;
|
DWORD written_bytes = 0;
|
||||||
::WriteFile(file_handle, res.GetData(), res.GetDataSize(), &written_bytes, NULL);
|
::WriteFile(file_handle, buffer.buffer, buffer.buffer_size, &written_bytes, NULL);
|
||||||
::CloseHandle(file_handle);
|
::CloseHandle(file_handle);
|
||||||
|
|
||||||
file.Open(dest_file_name);
|
file.Open(dest_file_name);
|
||||||
|
|
|
||||||
|
|
@ -67,7 +67,7 @@ namespace easy2d
|
||||||
return hr;
|
return hr;
|
||||||
}
|
}
|
||||||
|
|
||||||
HRESULT Transcoder::LoadMediaResource(Resource& res, BYTE** wave_data, UINT32* wave_data_size)
|
HRESULT Transcoder::LoadMediaResource(const Resource& res, BYTE** wave_data, UINT32* wave_data_size)
|
||||||
{
|
{
|
||||||
HRESULT hr = S_OK;
|
HRESULT hr = S_OK;
|
||||||
|
|
||||||
|
|
@ -76,11 +76,12 @@ namespace easy2d
|
||||||
IMFByteStream* byte_stream = nullptr;
|
IMFByteStream* byte_stream = nullptr;
|
||||||
IMFSourceReader* reader = nullptr;
|
IMFSourceReader* reader = nullptr;
|
||||||
|
|
||||||
if (!res.Load()) { return false; }
|
ResourceData buffer;
|
||||||
|
if (!res.Load(&buffer)) { return false; }
|
||||||
|
|
||||||
stream = SHCreateMemStream(
|
stream = SHCreateMemStream(
|
||||||
static_cast<const BYTE*>(res.GetData()),
|
static_cast<const BYTE*>(buffer.buffer),
|
||||||
static_cast<UINT>(res.GetDataSize())
|
static_cast<UINT>(buffer.buffer_size)
|
||||||
);
|
);
|
||||||
|
|
||||||
if (stream == nullptr)
|
if (stream == nullptr)
|
||||||
|
|
|
||||||
|
|
@ -45,7 +45,7 @@ namespace easy2d
|
||||||
);
|
);
|
||||||
|
|
||||||
HRESULT LoadMediaResource(
|
HRESULT LoadMediaResource(
|
||||||
Resource& res,
|
const Resource& res,
|
||||||
BYTE** wave_data,
|
BYTE** wave_data,
|
||||||
UINT32* wave_data_size
|
UINT32* wave_data_size
|
||||||
);
|
);
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue