// native_bridge/include/VstDllSearch.h // iZotope VST3 (Ozone 11, Nectar, Neutron...) là single-file .vst3 — core // DLL (vd iZOzone11Core.dll) nằm RIÊNG ở // C:\Program Files\iZotope\\Cores // KHÔNG cạnh plugin → LoadLibraryW của VST3 SDK fail ERROR_MOD_NOT_FOUND // (0x7E) dù setPluginSearchPath đã trỏ dir cạnh plugin. Helper này quét các // dir Cores cố định và thêm vào PATH (process-global — bridge load 1 plugin // 1 lúc, giống SetDllDirectoryW hiện có). #ifndef VST_DLL_SEARCH_H #define VST_DLL_SEARCH_H #include #ifdef _WIN32 #ifndef NOMINMAX #define NOMINMAX #endif #include #endif #ifdef _WIN32 inline std::string vstDllSearchExtras() { std::string extras; const char* bases[] = { "C:\\Program Files\\iZotope", "C:\\Program Files\\Common Files\\iZotope", }; for (const char* base : bases) { std::string pat = std::string(base) + "\\*"; WIN32_FIND_DATAA fd; HANDLE h = FindFirstFileA(pat.c_str(), &fd); if (h == INVALID_HANDLE_VALUE) continue; do { if (!(fd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)) continue; if (fd.cFileName[0] == '.') continue; std::string cores = std::string(base) + "\\" + fd.cFileName + "\\Cores"; if (GetFileAttributesA(cores.c_str()) != INVALID_FILE_ATTRIBUTES) { if (!extras.empty()) extras += ";"; extras += cores; } } while (FindNextFileA(h, &fd)); FindClose(h); } return extras; } // Append extras vào PATH (bỏ dir đã có). Gọi TRƯỚC Module::create. inline void vstAddDllSearchPath(const std::string& extras) { if (extras.empty()) return; char buf[32768]; DWORD n = GetEnvironmentVariableA("PATH", buf, sizeof(buf)); std::string path = n ? std::string(buf) : ""; std::string toAdd; size_t start = 0; while (start <= extras.size()) { size_t end = extras.find(';', start); std::string dir = extras.substr(start, end == std::string::npos ? std::string::npos : end - start); if (!dir.empty() && path.find(dir) == std::string::npos) { if (!toAdd.empty()) toAdd += ";"; toAdd += dir; } if (end == std::string::npos) break; start = end + 1; } if (toAdd.empty()) return; if (!path.empty()) path += ";"; path += toAdd; SetEnvironmentVariableA("PATH", path.c_str()); } #else inline std::string vstDllSearchExtras() { return std::string(); } inline void vstAddDllSearchPath(const std::string&) {} #endif #endif // VST_DLL_SEARCH_H