我正在将VBA和关联的dylib程序从Windows Excel 2010/2014移植到Mac Excel 2010.在执行操作之前,VBA会将当前工作目录更改为安装文件夹,以使输入文件可用于DLL。
dylib基于gfortran 4.9.0。我将dylib文件放在〜/ lib文件夹中,VBA可以找到它,用它来执行计算并返回结果。
但是,当我尝试执行任何磁盘操作(getcwd,open)时,会抛出错误。我可以返回错误(13),根据“/usr/include/sys/errno.h”,它似乎是“许可被拒绝”。
我能够在〜/ lib中放置一个gfortran dll,并让另一个fortran程序成功调用它(从命令提示符,而不是在Excel中)并在当前工作目录中写入一个文件,所以看起来它应该是工作。
任何关于谁“拥有”衍生的dylib进程以及如何通过来自VBA调用的gfortran dylib执行磁盘操作的想法都将不胜感激。
答案 0 :(得分:0)
事实证明,在Mac上从Excel 2011调用dylib(至少是gfortran dylib)时,dylib的cwd是Mac上的root /文件夹。这与Windows不同,其中dll的cwd是用户的cwd。因此,在Windows vba上,您可以更改Excel中的cwd并假设dll默认也会拥有它,但是在Mac上,dylib本身每次从VBA调用时都需要自己执行CHDIR(它会重置并且不会不记得它以前的位置。
另请注意,StrConv在Mac 2011下工作,至少要将字符串更改为单字节字符,但如果已修复,以前用于帮助unicode的字符串的后半部分可能无法正确转换长度字符串。使用超长的固定长度字符串可以解释:
Function StrConv2(s as string, coding as integer) as String
' used to convert fixed length strings between unicode and ascii for Mac
' (not needed for Windows)
Dim s2 as string*2048 ' at least twice as long as your original string
If coding = vbUnicode Then
StrConv2 = StrConv(s, coding)
Else
s2 = s
StrConv2 = StrConv(s2, coding)
s = s2
End If
End Function