Я выяснил, что некоторые очень специфические машины выдавали ошибку при попытке загрузить R.dll
.Сначала я подумал, что это будет проблемой с McAfee, потому что 100% машин, которые я получил, были вызваны ноутбуками Dell с установленным McAfee.Но позже я обнаружил, что проблема была вызвана Office, который устанавливается с помощью Microsoft Store, а не традиционным способом (загрузка установщика и его выполнение).Office, установленный с помощью Магазина Microsoft, не позволит мне загрузить R.dll
.Он возвращает ноль в следующем коде:
Private Declare Function FreeLibrary Lib "kernel32" (ByVal hLibModule As Long) As Long
Private Declare Function LoadLibrary Lib "kernel32" Alias "LoadLibraryA" (ByVal lpLibFileName As String) As Long
Private Sub TestDLL()
Dim ret As Long
ret = LoadLibrary("C:\Program Files\R\R-3.0.2\bin\i386\R.dll") ' returns zero
MsgBox ret
FreeLibrary ret
End Sub
Для того, чтобы приведенный выше код работал, вам сначала необходимо включить следующую папку в системную переменную PATH
, до открытие VBA:
C:\Program Files\R\R-3.0.2\bin\i386
Приведенный выше код прекрасно работает во всех версиях Office, которые я тестировал (2007 ~ 2019) при загрузке установщика и последующей установке (без использования Магазина Microsoft).Однако, если я вхожу в Windows под своей учетной записью Microsoft, а затем использую Microsoft Store для установки Office, переменная ret
возвращает ноль.Когда я говорю «Microsoft Store», я имею в виду следующее:
Я предполагаю, что R.dll
не может загрузить некоторую зависимую DLL в Office (из Магазина Windows), так как она запускается в песочницеи имеет ограниченный доступ к файловой системе и, возможно, к другим системным ресурсам.
Так что, в принципе, любая информация, касающаяся вопросов ниже, поможет мне:
- Возможно, такая версияофис не позволит мне сделать это и точка?Поэтому я должен отказаться от версии Windows Store Office?
- Стоит ли пытаться отлаживать
R.dll
?Я знаю, что это потребует некоторых усилий для компиляции R.dll
и настройки. - Могу ли я ввести в вызов
LoadLibrary
что-то вроде try-except
, чтобы получить больше информации о , почему не может загрузить R.dll
? - Другие идеи?
Спасибо за чтение и за предоставленную помощь.