从 LibreOffice Basic 调用 C 共享库函数

2023-11-29

我试图从 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* 单词的正确翻译?我找不到有关如何在 LibreOffice Basic 中的函数中使用 char* 参数的文档。)

我通过使用 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”的所有文件夹或位于名字)。

我尝试了一种猎枪方法,并在所有 351 个目录中放置了一个指向共享库的符号链接,但随后 Calc 在启动时挂起。所以我删除了它们,启动了 Calc,然后将它们全部放回原处并尝试了该功能。如果它是一个位置问题,您会认为这会起作用,因为 LibreOffice Basic 应该在声明时加载库。还是没有运气。

在 oooforums 上有一些看起来很有希望的东西,但当我尝试查看该帖子时,该网站超时了。 (编辑:今晚我设法查看了该线程,这是 Windows 安全问题。我关闭了 LibreOffice 中的所有宏安全性,但问题仍然存在。)

那么,是否有人成功地从 LibreOffice Basic 程序调用了 C 共享库函数,并且知道我做错了什么?谢谢!


乔纳森·莱因哈特是正确的;用于调用共享库的“Declare”命令在 Windows 上实现,但在 Linux 上未实现。我之所以能够验证这一点,是因为在博客文章中引用了有关该问题的 OpenOffice 错误报告。

我第一次尝试解决方案是在 LibreOffice Basic 中重写该函数。它有效,但最多需要 3 秒才能返回结果。

我想过放弃,就这样离开,但三秒钟的等待太不愉快了。我研究了如何通过 UNO 实现 C++ 函数,这对于相当琐碎的任务来说过于复杂。

最后我所做的是编写一个仍然给出“即时”结果的拼凑(每个函数调用大约 0.025 秒)。

我将 DLL 重写为 C++ 控制台应用程序,它接受命令行参数并将结果写入临时文件。然后,我将 LibreOffice Basic 代码替换为一个函数,该函数使用 Shell 以阻塞模式调用 C++ 控制台应用程序,并从文件中检索结果。它很丑陋,但它不是多用户的东西,而且它可以工作。

如果有人自己偶然发现这个问题,这里是我用来执行此操作的 LibreOffice Basic 代码 - 它非常简单。

option explicit

function scorewords(wordlist as string, bonuslist as string) as integer
   dim cparams as string
   dim fileno as integer
   dim results_file as string
   dim score as integer

   if wordlist = "" then
       scorewords = 0
       exit function
   end if

   cparams = """" + wordlist + """" + " " + """" + bonuslist + """"
   results_file = "/tmp/scrabblescore.dat"
   Shell("/usr/bin/getscrabblescore", 6, cparams, true)

   fileno = freefile
   open results_file for input as fileno
   input #fileno, score
   close #fileno

   kill results_file

   scorewords = score
end function
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

从 LibreOffice Basic 调用 C 共享库函数 的相关文章

  • EF Core Group By 翻译支持条件总和

    听说 EF Core 2 1 将支持翻译小组 我感到非常兴奋 我下载了预览版并开始测试它 但发现我在很多地方仍然没有得到翻译分组 在下面的代码片段中 对 TotalFlagCases 的查询将阻止翻译分组工作 无论如何 我可以重写这个以便我
  • C 编程 - 文件 - fwrite

    我有一个关于编程和文件的问题 while current NULL if current gt Id Doctor 0 current current gt next id doc current gt Id Doctor if curre
  • 没有强命名的代码签名是否会让您的应用程序容易被滥用?

    尝试了解authenticode代码签名和强命名 我是否正确地认为 如果我对引用一些 dll 非强命名 的 exe 进行代码签名 恶意用户就可以替换我的 DLL 并以看似由我签名但正在运行的方式分发应用程序他们的代码 假设这是真的 那么您似
  • 以文化中立的方式将字符串拆分为单词

    我提出了下面的方法 旨在将可变长度的文本拆分为单词数组 以进行进一步的全文索引处理 删除停止词 然后进行词干分析 结果似乎不错 但我想听听关于这种实现对于不同语言的文本的可靠性的意见 您会建议使用正则表达式来代替吗 请注意 我选择不使用 S
  • GLKit的GLKMatrix“列专业”如何?

    前提A 当谈论线性存储器中的 列主 矩阵时 列被一个接一个地指定 使得存储器中的前 4 个条目对应于矩阵中的第一列 另一方面 行主 矩阵被理解为依次指定行 以便内存中的前 4 个条目指定矩阵的第一行 A GLKMatrix4看起来像这样 u
  • Web 客户端和 Expect100Continue

    使用 WebClient C NET 时设置 Expect100Continue 的最佳方法是什么 我有下面的代码 我仍然在标题中看到 100 continue 愚蠢的 apache 仍然抱怨 505 错误 string url http
  • 为什么两个不同的 Base64 字符串的转换会返回相等的字节数组?

    我想知道为什么从 base64 字符串转换会为不同的字符串返回相同的字节数组 const string s1 dg const string s2 dq byte a1 Convert FromBase64String s1 byte a2
  • 秒表有最长运行时间吗?

    多久可以Stopwatch在 NET 中运行 如果达到该限制 它会回绕到负数还是从 0 重新开始 Stopwatch Elapsed返回一个TimeSpan From MSDN https learn microsoft com en us
  • 在哪里可以找到列出 SSE 内在函数操作的官方参考资料?

    是否有官方参考列出了 GCC 的 SSE 内部函数的操作 即 头文件中的函数 除了 Intel 的 vol 2 PDF 手册外 还有一个在线内在指南 https www intel com content www us en docs in
  • 不同枚举类型的范围和可转换性

    在什么条件下可以从一种枚举类型转换为另一种枚举类型 让我们考虑以下代码 include
  • C# 中通过 Process.Kill() 终止的进程的退出代码

    如果在我的 C 应用程序中 我正在创建一个可以正常终止或开始行为异常的子进程 在这种情况下 我通过调用 Process Kill 来终止它 但是 我想知道该进程是否已退出通常情况下 我知道我可以获得终止进程的错误代码 但是正常的退出代码是什
  • 使用 WebClient 时出现 System.Net.WebException:无法创建 SSL/TLS 安全通道

    当我执行以下代码时 System Net ServicePointManager ServerCertificateValidationCallback sender certificate chain errors gt return t
  • C++ OpenSSL 导出私钥

    到目前为止 我成功地使用了 SSL 但遇到了令人困惑的障碍 我生成了 RSA 密钥对 之前使用 PEM write bio RSAPrivateKey 来导出它们 然而 手册页声称该格式已经过时 实际上它看起来与通常的 PEM 格式不同 相
  • 带动态元素的 WPF 启动屏幕。如何?

    我是 WPF 新手 我需要一些帮助 我有一个加载缓慢的 WPF 应用程序 因此我显示启动屏幕作为权宜之计 但是 我希望能够在每次运行时更改屏幕 并在文本区域中显示不同的引言 这是一个生产力应用程序 所以我将使用非愚蠢但激励性的引言 当然 如
  • 如何查看网络连接状态是否发生变化?

    我正在编写一个应用程序 用于检查计算机是否连接到某个特定网络 并为我们的用户带来一些魔力 该应用程序将在后台运行并执行检查是否用户请求 托盘中的菜单 我还希望应用程序能够自动检查用户是否从有线更改为无线 或者断开连接并连接到新网络 并执行魔
  • 覆盖子类中的字段或属性

    我有一个抽象基类 我想声明一个字段或属性 该字段或属性在从该父类继承的每个类中具有不同的值 我想在基类中定义它 以便我可以在基类方法中引用它 例如覆盖 ToString 来表示 此对象的类型为 property field 我有三种方法可以
  • 如何使用 C# / .Net 将文件列表从 AWS S3 下载到我的设备?

    我希望下载存储在 S3 中的多个图像 但目前如果我只能下载一个就足够了 我有对象路径的信息 当我运行以下代码时 出现此错误 遇到错误 消息 读取对象时 访问被拒绝 我首先做一个亚马逊S3客户端基于我的密钥和访问配置的对象连接到服务器 然后创
  • 通过指向其基址的指针删除 POD 对象是否安全?

    事实上 我正在考虑那些微不足道的可破坏物体 而不仅仅是POD http en wikipedia org wiki Plain old data structure 我不确定 POD 是否可以有基类 当我读到这个解释时is triviall
  • 如何在Xamarin中删除ViewTreeObserver?

    假设我需要获取并设置视图的高度 在 Android 中 众所周知 只有在绘制视图之后才能获取视图高度 如果您使用 Java 有很多答案 最著名的方法之一如下 取自这个答案 https stackoverflow com a 24035591
  • 是否可以在 .NET Core 中将 gRPC 与 HTTP/1.1 结合使用?

    我有两个网络服务 gRPC 客户端和 gRPC 服务器 服务器是用 NET Core编写的 然而 客户端是托管在 IIS 8 5 上的 NET Framework 4 7 2 Web 应用程序 所以它只支持HTTP 1 1 https le

随机推荐