windows下构建vst时如何使用外部dll
Posted
技术标签:
【中文标题】windows下构建vst时如何使用外部dll【英文标题】:How to use an external dll when building a vst under windows 【发布时间】:2016-01-13 17:00:43 【问题描述】:我正在尝试在 Windows 10 x64 下使用带有 JUCE vst 插件的 Leap motion sdk。
我已经设置了我的项目exactly like this,并确保 Leap.dll 在我的输出 VstPlugins 目录中。但是我的 DAW (Reaper) 无法检测/打开我的插件的 dll。我还尝试将我的 x86 Leap.dll 放在 C:\Windows\System32 中(以及我的 x64 版本在 C:\Windows\SysWOW64 中),并尝试对它们进行 regsvr32,但被告知 the DLLRegistryServer entry point cannot be found。
当我评论与 Leap sdk 相关的所有内容时,我的插件在 Reaper 中被检测到,其他一切正常,在 Mac OSX 上我也可以使用 Leap,所以看来我的问题确实是我的 Windows 系统没有不知道它必须将 Leap.dll 与我的插件的 dll 一起使用。如何做到这一点?
【问题讨论】:
并试图 regsvr32 他们你为什么这样做?我在说明中根本没有看到 regsvr32。您是否将 dll 复制到与您的应用程序可执行文件(例如示例中的 xcopy 部分)相同的位置? 是的,我确实将 Leap dll 复制到了与我的插件 dll 相同的文件夹中——我的输出是 dll,而不是 .exe。我尝试了 regsvr32 技术(在系统文件夹中使用 dll),因为这在过去对我使用其他 dll 有效。因为我不知道还能做什么! 您是否为 SDK 构建了 dll(未注册我无法下载查看)?我问是因为如果您下载了二进制版本并且您没有正确的 dll 依赖项(安装在您的系统上),即使您在正确的文件夹中也不会加载 dll。 你的结论相当落后,当它确实依赖于 Leap 时它就停止工作了。可能是缺少 DLL,使用 SysInternals 的进程监视器查看您的 DAW 是否正在寻找它。 @drescherjm,我认为您指的是 Leap SDK?他们不提供源代码,只提供 dll。并且没有静态库。他们的说明清楚地表明我们只需要 Leap.dll。并且使用 Leap.dylib 可以在 mac 上运行。 【参考方案1】:如果它是动态库,则无需将其包含在项目中。您只需将文件复制到用户机器的特定文件夹中,然后在您的插件代码中添加如下内容:
DynamicLibrary dynLib;
bool loaded = dynLib.open("DYNAMIC_LIBRARY_FULL_PATH");
if(loaded)
FUNCTIONTEMPLATE functiontemplate = (FUNCTIONTEMPLATE) dynLib.getFunction("functionName");
char *input;
int output = functiontemplate (input);
当然,如果您没有自己编写动态库,那么您需要像依赖遍历器这样的东西来检查 dll 内部并找到函数声明或阅读编写 dll 的文档。无论如何,您需要知道确切的函数声明格式并创建一个指向它的指针。想象一下它是一个接受 char* 作为输入并返回 int 作为输出的函数,那么你需要在你的 .cpp 或 .c 代码顶部有这样一行:
typedef int (*FUNCTIONTEMPLATE) (char *);
【讨论】:
以上是关于windows下构建vst时如何使用外部dll的主要内容,如果未能解决你的问题,请参考以下文章
如何在运行时解析 dll 中的外部符号,而不是使用 Cygwin 进行链接时