VST2 接口 dll 入口点

Posted

技术标签:

【中文标题】VST2 接口 dll 入口点【英文标题】:VST2 interface dll entry points 【发布时间】:2015-01-01 17:19:51 【问题描述】:

我正在构建一个 VST2 插件。我想知道何时创建插件窗口:加载 dll(在我的情况下为 InitInstance)或其他一些点(可能是 AEffEditor::open)?

我已经继承了AEffEditor。我正在InitInstance 中创建一个窗口,并在AEffEditor::openAEffEditor::close 中显示和隐藏该窗口。

看来InitInstance(dll加载)不是创建窗口的正确点,但那什么时候?

例如主机正在为 2 个插入实例创建 3 个窗口(一个在加载 dll 时)。

另一个问题:InitInstance(dll 加载)何时被调用?在主机启动时和每次发送/插入时?

我应该为每个 dll 加载创建一个窗口 (m_pMainWnd) 还是在单独的线程中创建它们并跟踪窗口? IE。 m_pMainWnd 会不同还是相同的单个窗口?

【问题讨论】:

通过在open()中创建一个不存在的窗口来解决。 【参考方案1】:

VST 编辑器窗口应该嵌入到宿主应用程序窗口中。这意味着您需要对该主机窗口的窗口引用(Windows 上的 HWND、带有 Carbon 的 Mac 上的 WindowRef 或带有 Cocoa 的 Mac 上的 NSView,如果您使用 Cockos extensions)才能创建您的窗口。

VST API 仅在调用 AEffEditor::open 时传递该窗口引用。当调用 AEffEditor::close 时它变得无效(即使文档不是很具体)。因此,您需要在 AEffEditor::open 中创建您的窗口(作为传递给您的窗口的子窗口)并在 AEffEditor::close 中销毁它。

因此,您需要为每个插件实例创建一个单独的窗口。用户可以将多个插件实例放在不同的轨道中,并且他/她希望对其中一个实例所做的更改不会影响另一个。

【讨论】:

如果open() 创建了窗口(而close() 销毁了它),那么窗口如何保存它的数据呢?我认为openclose 用于显示和隐藏“现有”窗口,而不是用于创建和销毁。还是我错了? @user1288043 VST 插件窗口(“效果编辑器”)反映了插件的当前状态。通常,此状态将是 VST 参数。您需要将此数据保存在某个地方以保存、恢复、存储库/预设切换,可能作为插件对象的成员变量。编辑器需要“愚蠢”,任何调整都应该更新参数。并且任何不是由 GUI 调整引起的参数更改(如自动化或预设更改)都需要反映。就像在经典的模型/视图模式中一样。

以上是关于VST2 接口 dll 入口点的主要内容,如果未能解决你的问题,请参考以下文章

模块“.dll”已加载,但未找到入口点

找不到 DLL 入口点

无法在 DLL 中找到入口点

为啥不从入口点函数调用 FreeLibrary?

System.EntryNotFoundException:无法在 DLL 中找到入口点

模块qtcore.dll已经加载,但找不到入口点怎么解决