coderloader.h
来自「由7-zip提供的压缩、解压缩程序」· C头文件 代码 · 共 148 行
H
148 行
// CoderLoader.h#ifndef __CODERLOADER_H#define __CODERLOADER_H#include "../../../Common/String.h"#include "../../../Common/MyCom.h"#include "../../../Windows/DLL.h"#include "../../ICoder.h"typedef UInt32 (WINAPI * CreateObjectPointer)( const GUID *clsID, const GUID *interfaceID, void **outObject);class CCoderLibrary: public NWindows::NDLL::CLibrary {public: HRESULT CreateObject(REFGUID clsID, REFGUID iid, void **obj) { CreateObjectPointer createObject = (CreateObjectPointer) GetProcAddress("CreateObject"); if (createObject == NULL) return GetLastError(); return createObject(&clsID, &iid, obj); } HRESULT CreateFilter(REFGUID clsID, ICompressFilter **filter) { return CreateObject(clsID, IID_ICompressFilter, (void **)filter); } HRESULT CreateCoder(REFGUID clsID, ICompressCoder **coder) { return CreateObject(clsID, IID_ICompressCoder, (void **)coder); } HRESULT CreateCoderSpec(REFGUID clsID, ICompressCoder **coder); HRESULT LoadAndCreateFilter(LPCTSTR filePath, REFGUID clsID, ICompressFilter **filter) { CCoderLibrary libTemp; if (!libTemp.Load(filePath)) return GetLastError(); RINOK(libTemp.CreateFilter(clsID, filter)); Attach(libTemp.Detach()); return S_OK; } HRESULT LoadAndCreateCoder(LPCTSTR filePath, REFGUID clsID, ICompressCoder **coder) { CCoderLibrary libTemp; if (!libTemp.Load(filePath)) return GetLastError(); RINOK(libTemp.CreateCoder(clsID, coder)); Attach(libTemp.Detach()); return S_OK; } HRESULT LoadAndCreateCoderSpec(LPCTSTR filePath, REFGUID clsID, ICompressCoder **coder); HRESULT CreateCoder2(REFGUID clsID, ICompressCoder2 **coder) { CreateObjectPointer createObject = (CreateObjectPointer) GetProcAddress("CreateObject"); if (createObject == NULL) return GetLastError(); return createObject(&clsID, &IID_ICompressCoder2, (void **)coder); } HRESULT LoadAndCreateCoder2(LPCTSTR filePath, REFGUID clsID, ICompressCoder2 **coder) { CCoderLibrary libTemp; if (!libTemp.Load(filePath)) return GetLastError(); RINOK(libTemp.CreateCoder2(clsID, coder)); Attach(libTemp.Detach()); return S_OK; }};class CCoderLibraries{ struct CPathToLibraryPair { CSysString Path; CCoderLibrary Libary; }; CObjectVector<CPathToLibraryPair> Pairs;public: int FindPath(LPCTSTR filePath) { for (int i = 0; i < Pairs.Size(); i++) if (Pairs[i].Path.CompareNoCase(filePath) == 0) return i; return -1; } HRESULT CreateCoder(LPCTSTR filePath, REFGUID clsID, ICompressCoder **coder) { int index = FindPath(filePath); if (index < 0) { CPathToLibraryPair pair; RINOK(pair.Libary.LoadAndCreateCoder(filePath, clsID, coder)); pair.Path = filePath; Pairs.Add(pair); pair.Libary.Detach(); return S_OK; } return Pairs[index].Libary.CreateCoder(clsID, coder); } HRESULT CreateCoderSpec(LPCTSTR filePath, REFGUID clsID, ICompressCoder **coder) { int index = FindPath(filePath); if (index < 0) { CPathToLibraryPair pair; RINOK(pair.Libary.LoadAndCreateCoderSpec(filePath, clsID, coder)); pair.Path = filePath; Pairs.Add(pair); pair.Libary.Detach(); return S_OK; } return Pairs[index].Libary.CreateCoderSpec(clsID, coder); } HRESULT CreateCoder2(LPCTSTR filePath, REFGUID clsID, ICompressCoder2 **coder) { int index = FindPath(filePath); if (index < 0) { CPathToLibraryPair pair; RINOK(pair.Libary.LoadAndCreateCoder2(filePath, clsID, coder)); pair.Path = filePath; Pairs.Add(pair); pair.Libary.Detach(); return S_OK; } return Pairs[index].Libary.CreateCoder2(clsID, coder); }};#endif
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?