【发布时间】: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