Вызов функций из Rust DLL с помощью Excel VBA

Я пытаюсь создать 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 все работает!


person A. Soikkeli    schedule 19.12.2018    source источник
comment
Вы уверены, что ваша битность верна, например. 64-битная цель excel и 64-битная rust toolchain?   -  person hellow    schedule 19.12.2018
comment
@ljedrz Я думаю, что cdylib было бы даже более правильным ^^ doc.rust-lang.org/ ссылка/linkage.html   -  person hellow    schedule 19.12.2018
comment
Исправлен тип dylib (пробовали dylib, lib, cdylib, staticlib...). Извините, но это именно то, о чем я говорил в конце. Мой пост представляет собой последнее, что я пробовал. В этом уравнении так много движущихся частей, что нам нужно нарисовать многомерную матрицу, чтобы представить все возможные комбинации, которые я должен попробовать. Воспроизвести ситуацию на другом компьютере несложно, так как не нужны никакие зависимости или что-то в этом роде.   -  person A. Soikkeli    schedule 19.12.2018
comment
И @hellow: да, я использую stable-x86_64-pc-windows-msvc.   -  person A. Soikkeli    schedule 19.12.2018
comment
Я должен сказать: У меня работает, если я использую cdylib и правильную цель... Что-то не так с вашей настройкой. Трижды проверьте правильность пути (используйте более простой путь, например D:\lib.dll) и используйте rustc --crate-type=cdylib --target=x86_64-pc-windows-msvc (и убедитесь, что вы используете 64-разрядную версию Excel, взглянув в диспетчер задач!)   -  person hellow    schedule 19.12.2018
comment
Спасибо @hellow за подтверждение, теперь я знаю, где искать. Это было очень полезно.   -  person A. Soikkeli    schedule 19.12.2018
comment
@hellow Я мог бы поцеловать твои ноги. Когда я попытался явно использовать флаг --target, rustc сообщил мне, что цель не может быть установлена, хотя она была там и была по умолчанию. Затем я увидел, что у меня установлен Rust Nightly в Настройки->Приложения и функции. Мне было интересно, не испортило ли это мою настройку, и я удалил это. Теперь все работает как часы при использовании cdylib. Не может быть счастливее, наконец, увидеть, как это работает!   -  person A. Soikkeli    schedule 19.12.2018
comment
Excel сообщит вам, что путь не найден в нескольких случаях, в том числе в тех случаях, когда путь в порядке. Обычно я считаю, что использование журналов событий Windows или такого инструмента, как procmon, для отладки Excel в таких ситуациях более эффективно.   -  person fuglede    schedule 09.06.2020


Ответы (1)


У меня был какой-то старый Rust, явно установленный Nightly в «Настройки» -> «Приложения и функции» (в Windows 10), что каким-то образом мешало моей настройке. После удаления Nightly все работает.

person A. Soikkeli    schedule 19.12.2018
comment
Я не понимаю, что имеется в виду под настройками -> Приложения и возможности. Такой опции нет ни в rust, ни в rustup. Я думаю, вы используете какой-то графический интерфейс, но он не имеет ничего общего с самой ржавчиной. - person hellow; 19.12.2018
comment
Хорошо, я немного отредактировал ответ, чтобы он был более явным. У меня был какой-то вручную установленный пакет Rust Nightly в приложениях и функциях, и поэтому у меня было две отдельные установки (одна через rustup + ручное приложение). Я не могу вспомнить, в какой момент я это установил, но удаление решило проблему. Это объяснило проблему? - person A. Soikkeli; 20.12.2018
comment
Я, должно быть, использовал некоторые старые установщики еще до rustup. Например, здесь вы все еще можете найти ссылки на установщики Rust 1.0 для Windows, которые все еще работают: doc.rust-lang.org/1.0.0/book/installing-rust.html - person A. Soikkeli; 20.12.2018