static bool ReadPluginInfo(CPluginInfo &pluginInfo, bool needCheckDll) { if (needCheckDll) { NDLL::CLibrary lib; if (!lib.LoadEx(pluginInfo.FilePath, LOAD_LIBRARY_AS_DATAFILE)) return false; } NDLL::CLibrary lib; if (!lib.Load(pluginInfo.FilePath)) return false; GetPluginPropertyFunc getPluginProperty = (GetPluginPropertyFunc)lib.GetProc("GetPluginProperty"); if (getPluginProperty == NULL) return false; NCOM::CPropVariant prop; if (getPluginProperty(NPlugin::kName, &prop) != S_OK) return false; if (prop.vt != VT_BSTR) return false; pluginInfo.Name = prop.bstrVal; prop.Clear(); if (getPluginProperty(NPlugin::kClassID, &prop) != S_OK) return false; if (prop.vt == VT_EMPTY) pluginInfo.ClassIDDefined = false; else if (prop.vt != VT_BSTR) return false; else { pluginInfo.ClassIDDefined = true; pluginInfo.ClassID = *(const GUID *)prop.bstrVal; } prop.Clear(); if (getPluginProperty(NPlugin::kOptionsClassID, &prop) != S_OK) return false; if (prop.vt == VT_EMPTY) pluginInfo.OptionsClassIDDefined = false; else if (prop.vt != VT_BSTR) return false; else { pluginInfo.OptionsClassIDDefined = true; pluginInfo.OptionsClassID = *(const GUID *)prop.bstrVal; } prop.Clear(); if (getPluginProperty(NPlugin::kType, &prop) != S_OK) return false; if (prop.vt == VT_EMPTY) pluginInfo.Type = kPluginTypeFF; else if (prop.vt == VT_UI4) pluginInfo.Type = (EPluginType)prop.ulVal; else return false; return true; }