【发布时间】:2013-07-26 08:17:07
【问题描述】:
我在 LabVIEW 中加载 DLL 时遇到问题。
我正在使用 LabVIEW 连接到流量计,为此,制造流量计的公司非常好,为我提供了一个子 VI 库。这些子 VI 中的每一个都从该公司提供的两个 DLL 库之一调用一个函数。
所以这些子VI中有一半依赖于一个DLL,另一半依赖于另一个DLL。 那些使用第一个 DLL 的人工作得很好,而且他们没有问题。 但是那些使用第二个 DLL 的人有一些错误:每次我打开其中一个子 VI 时,都会弹出一个窗口,上面写着:
加载“绝对路径\name.dll”时出错。 DLL 库初始化例程失败。
然后子VI无法执行,运行按钮显示为已破解。但是有一个转折点。如果我右键单击“配置库函数节点”并选择配置,然后在相应字段中重新选择完全相同的 dll 绝对路径,然后单击确定,子VI 运行得非常好,并且完全正确它应该这样做。我实际上并没有在节点配置窗口中更改任何内容,我只是重新选择了相同的路径。更奇怪的是,这个奇怪的“技巧”只有大约 75% 的时间有效。另外 25% 的时间,我需要关闭 VI 和任何其他引用它的 VI,然后重新打开它。
然后还有一个对我来说更不合理的转折:公司还给我发送了几个“示例 VI”,它们展示了不同的子 VI 应该如何相互关联使用。这些示例运行良好!但后来我编写了自己的 VI,它是“示例 VI”的更简单版本,但我不断收到 DLL 加载错误。
我做错了什么,如何确保 VI 可执行而无需每次都重新配置库函数节点?你认为是什么导致了这个问题?
注意:部分问题是我并不真正了解在 labview 中读取 DLL 是如何工作的,因此我们也非常感谢任何有关这方面的信息。
【问题讨论】:
-
LabVIEW DLL 处理非常简单,它加载 DLL 并列出函数。 DLL 加载(在 VI 打开时)通常由于不满足的依赖关系或 DLL 初始化失败而失败。您可以访问 DLL 的源代码吗?它在Dependency Walker 中是否正确打开?
-
很遗憾,我无权访问 DLL 源代码,但我已经下载了依赖项walker。 DLL 似乎打开得很好,虽然我真的不知道如果没有依赖 wlaker 会说什么。有趣的是,我将我自己的 VI 移动到与示例 VI 相同的目录中,我注意到了这一点:如果我打开示例 VI 然后我自己的 VI,则不会引发 DLL 加载错误,并且子 VI 在这两个示例中都是可执行的VI和我自己的。但是,如果我打开自己的 VI,然后打开示例 VI,都会抛出错误。这意味着什么?
-
“重置”路径后是否保存 VI? LabVIEW存储相对或绝对路径,可能会混淆。当你打开VI(坏掉的)并且不修复它时,你可以在LabVIEW项目依赖列表中检查路径。还要确保在项目的“路径”部分(项目窗口中的 ctrl-e)DLL 列在正确的位置。可能是某些依赖项在您的 VI 尝试加载它们之前尝试从另一个位置加载 DLL。
-
听起来名字被弄乱了,而且 DLL 的编写者在使用 __declspec(dllexport) 时没有使用 extern "C"。这个名字有很多@和其他杂项吗?
-
不,这个名字似乎没有奇怪的杂项。我找到了一个临时解决方案,只需复制公司给我的 VI 并通过删除我需要的子 VI 并添加一些包装代码来编辑它,使其完全符合我的要求。我仍然想知道那个错误是从哪里来的......