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