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