我正在尝试从 LibreOffice Basic 调用 C 共享库函数,但是当它到达 Declare 行时,我总是得到“基本运行时错误。未实现”。这只是为了一件有趣的事情,但无法做到这一点让我很烦恼。
Declare 语句如下所示:
Declare Function score_word Lib "libscrabblescore.so" (ByRef word As String, ByRef bonus As String) As Integer
C 函数声明如下所示:
int score_word(char* word, char* word_bonuses)
(也许 ByRef word As String 不是 char* word 的正确翻译?我找不到有关如何将 char* 参数用于 LibreOffice Basic 函数的文档。)
我通过使用 Python 的 ctypes 模块调用它来验证共享库本身:
>>> from ctypes import CDLL
>>> lib = CDLL("/usr/lib/libscrabblescore.so")
>>> lib.score_word("qi", "dw dlq")
42
>>>
(所以我有“生命、宇宙和一切的终极问题的答案”,而不是关于如何在 LibreOffice Basic 中做到这一点!)
我也尝试在 Declare 语句中使用绝对路径,但没有任何区别。
我发现了一个关于调用 DLL 主题的 Windows 线程,提问者说他需要将 DLL 放在特定位置(LibreOffice bin 目录),以便 LibreOffice 可以访问它。Linux 上本身没有 LibreOffice bin 目录,不幸的是,我可以在我的机器上识别出 351 个候选目录(我的路径,以及名称中带有“libreoffice”的所有文件夹或带有“libreoffice”的文件夹下的所有文件夹)名字)。
我尝试了一种霰弹枪方法并在所有 351 个目录中放置了一个指向共享库的符号链接,但随后 Calc 在启动时挂起。所以我删除了这些,启动了 Calc,然后将它们全部放回原处并尝试了该功能。如果这是一个位置问题,您会认为 LibreOffice Basic 应该在声明点加载库。仍然没有运气。
oooforums 上有一些看起来很有希望的东西,但是当我尝试查看该线程时,该站点会超时。(编辑:我今晚设法查看了该线程,这是 Windows 安全问题。我关闭了 LibreOffice 中的所有宏安全性,但问题仍然存在。)
那么,有没有人从一个知道我做错了什么的 LibreOffice Basic 程序中成功调用了 C 共享库函数?谢谢!