【问题标题】:Calling functions from Rust DLL with Excel VBA使用 Excel VBA 从 Rust DLL 调用函数
【发布时间】:2019-05-19 17:13:10
【问题描述】:

我正在尝试创建一个 Rust DLL 并从 64 位 Excel(Windows 10 和 Office 365)调用这些函数。

目前我的 lib.rs 看起来像这样:

#[no_mangle]
pub extern "stdcall" fn square(x: f64) -> f64 {
    {x * x}
}

我正在用命令编译:

rustc --crate-type=cdylib lib.rs

我的 VBA 代码如下所示:

Private Declare PtrSafe Function square Lib "C:\Users\user\rust\excelfunctions\src\lib.dll" (ByVal x As Double) As Double

Sub testsquare()
    MsgBox square(10)
End Sub

Excel 通过总是给出相同的错误来“帮助”我进行调试:

Run-time error '48':

File not found. C:\Users\user\rust\excelfunctions\src\lib.dll

我显然已经检查过该文件是否存在,并且我可以使用 DLL Export Viewer 查看该功能。如果我用 C 库替换文件,我可以使函数工作。我也设法使用 Haskell 进行这项工作,所以我知道 Excel 正在与外界交流,只是在给出错误消息时没有说任何更具体的内容。

我花了很多时间来解决这个问题,并尝试了我能想到的所有可能的组合。如果回答这个问题的人首先仔细检查所提出的解决方案是否真的在他/她的机器上工作,我将非常感激,所以我们最终不会有很长的问题和“不”的答案(已经在那里)。只是不可能在这里列出我已经尝试过的所有可能的变化。

编辑:我在设置 -> 应用程序和功能中安装了 Rust Nightly,这以某种方式弄乱了我的设置。卸载 Nightly 后,一切正常!

【问题讨论】:

  • 你确定你的位数是正确的,例如64 位 excel 和 64 位 rust 工具链目标?
  • @ljedrz 我认为cdylib 会更正确^^ doc.rust-lang.org/reference/linkage.html
  • 修复了 dylib 的类型(尝试过 dylib、lib、cdylib、staticlib...)。对不起,但这正是我最后所说的。我的帖子代表了我尝试过的最新内容。这个方程中有太多的移动部分,我们必须绘制多维矩阵来表示我应该尝试的所有可能的组合。在其他计算机上复制情况并不难,因为不需要依赖或任何东西。
  • 还有@hellow:是的,我使用的是 stable-x86_64-pc-windows-msvc。
  • 如果我使用cdylib 和正确的目标,我必须说:“为我工作”...您的设置有问题。请三重检查路径是否正确(使用更简单的路径,例如D:\lib.dll)并使用rustc --crate-type=cdylib --target=x86_64-pc-windows-msvc(并通过查看任务管理器验证您正在运行64位Excel!)

标签: excel vba dll rust stdcall


【解决方案1】:

我在设置 -> 应用程序和功能(Windows 10)中明确安装了一些旧的 Rust,不知何故弄乱了我的设置。卸载 Nightly 后,一切正常。

【讨论】:

  • 我不明白“设置 -> 应用程序和功能”是什么意思。在 rust 和 rustup 中都没有这样的选择。我认为您正在使用某种 gui,但它与 rust 本身没有任何关系..
  • 好的,我将答案编辑得更明确一点。我在应用程序和功能中手动安装了某种 Rust Nightly 包,因此我有两个单独的安装(一个通过 rustup + 手动应用程序)。我不记得我在什么时候安装了它,但卸载它解决了这个问题。这是否解释了问题?
  • 我一定是在 rustup 之前使用过一些旧的安装程序。例如,您仍然可以从这里找到仍然有效的 Rust 1.0 Windows 安装程序的链接:doc.rust-lang.org/1.0.0/book/installing-rust.html
猜你喜欢
  • 2015-09-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多