diff options
Diffstat (limited to 'CPP/7zip/FileManager/RegistryPlugins.cpp')
-rwxr-xr-x | CPP/7zip/FileManager/RegistryPlugins.cpp | 130 |
1 files changed, 130 insertions, 0 deletions
diff --git a/CPP/7zip/FileManager/RegistryPlugins.cpp b/CPP/7zip/FileManager/RegistryPlugins.cpp new file mode 100755 index 00000000..cad3b43d --- /dev/null +++ b/CPP/7zip/FileManager/RegistryPlugins.cpp @@ -0,0 +1,130 @@ +// RegistryPlugins.cpp + +#include "StdAfx.h" + +#include "Common/StringConvert.h" +// #include "Windows/Registry.h" +// #include "Windows/Synchronization.h" +// #include "Windows/COM.h" + +#include "Windows/DLL.h" +#include "Windows/PropVariant.h" +#include "Windows/FileFind.h" + +#include "RegistryPlugins.h" +#include "IFolder.h" + +using namespace NWindows; +using namespace NFile; +// using namespace NRegistry; +// using namespace NCOM; + +/* +static const TCHAR *kLMBasePath = TEXT("Software\\7-Zip\\FM"); + +static const TCHAR *kPluginsKeyName = TEXT("Plugins"); +static const TCHAR *kPluginsOpenClassIDValue = TEXT("CLSID"); +static const TCHAR *kPluginsOptionsClassIDValue = TEXT("Options"); +static const TCHAR *kPluginsTypeValue = TEXT("Type"); + +static CSysString GetFileFolderPluginsKeyName() +{ + return CSysString(kLMBasePath) + CSysString(TEXT('\\')) + + CSysString(kPluginsKeyName); +} + +static NSynchronization::CCriticalSection g_CriticalSection; +*/ +typedef UINT32 (WINAPI * GetPluginPropertyFunc)( + PROPID propID, PROPVARIANT *value); + +static bool ReadPluginInfo(CPluginInfo &pluginInfo) +{ + { + NDLL::CLibrary library; + if (!library.LoadEx(pluginInfo.FilePath, LOAD_LIBRARY_AS_DATAFILE)) + return false; + } + NDLL::CLibrary library; + if (!library.Load(pluginInfo.FilePath)) + return false; + GetPluginPropertyFunc getPluginProperty = (GetPluginPropertyFunc) + library.GetProcAddress("GetPluginProperty"); + if (getPluginProperty == NULL) + return false; + + NCOM::CPropVariant propVariant; + if (getPluginProperty(NPlugin::kName, &propVariant) != S_OK) + return false; + if (propVariant.vt != VT_BSTR) + return false; + pluginInfo.Name = propVariant.bstrVal; + propVariant.Clear(); + + if (getPluginProperty(NPlugin::kClassID, &propVariant) != S_OK) + return false; + if (propVariant.vt != VT_BSTR) + return false; + pluginInfo.ClassID = *(const GUID *)propVariant.bstrVal; + propVariant.Clear(); + + if (getPluginProperty(NPlugin::kOptionsClassID, &propVariant) != S_OK) + return false; + if (propVariant.vt == VT_EMPTY) + pluginInfo.OptionsClassIDDefined = false; + else if (propVariant.vt != VT_BSTR) + return false; + else + { + pluginInfo.OptionsClassIDDefined = true; + pluginInfo.OptionsClassID = *(const GUID *)propVariant.bstrVal; + } + propVariant.Clear(); + + if (getPluginProperty(NPlugin::kType, &propVariant) != S_OK) + return false; + if (propVariant.vt == VT_EMPTY) + pluginInfo.Type = kPluginTypeFF; + else if (propVariant.vt == VT_UI4) + pluginInfo.Type = (EPluginType)propVariant.ulVal; + else + return false; + return true; +} + +UString GetProgramFolderPrefix(); + +void ReadPluginInfoList(CObjectVector<CPluginInfo> &plugins) +{ + plugins.Clear(); + + UString baseFolderPrefix = GetProgramFolderPrefix(); + { + CPluginInfo pluginInfo; + pluginInfo.FilePath = baseFolderPrefix + L"7-zip.dll"; + if (::ReadPluginInfo(pluginInfo)) + plugins.Add(pluginInfo); + } + UString folderPath = baseFolderPrefix + L"Plugins\\"; + NFind::CEnumeratorW enumerator(folderPath + L"*"); + NFind::CFileInfoW fileInfo; + while (enumerator.Next(fileInfo)) + { + if (fileInfo.IsDirectory()) + continue; + CPluginInfo pluginInfo; + pluginInfo.FilePath = folderPath + fileInfo.Name; + if (::ReadPluginInfo(pluginInfo)) + plugins.Add(pluginInfo); + } +} + +void ReadFileFolderPluginInfoList(CObjectVector<CPluginInfo> &plugins) +{ + ReadPluginInfoList(plugins); + for (int i = 0; i < plugins.Size();) + if (plugins[i].Type != kPluginTypeFF) + plugins.Delete(i); + else + i++; +} |