【发布时间】:2012-08-11 12:15:33
【问题描述】:
我正在用 Qt 编写一个我想用插件扩展的应用程序。 我的应用程序还有一个插件将使用的库。所以,我需要一种双向通信。基本上,插件可以调用库,我加载插件的应用程序会调用它们。
现在,我的库是用 C++ 编写的,所以它有一些类。插件可以包含头文件,链接到它并使用它。我的接口也有一个头文件,它是插件必须实现的抽象基类。他们还应该导出一个函数,该函数将返回指向该类的指针,并使用 C 链接。
到目前为止,我相信一切都清楚了,一个标准的插件界面。但是,有 3 个主要问题或子任务:
如何使用其他语言的库? 我只用 Python 试过这个。我使用 SIP 生成了一个 Python 组件,该组件已成功导入到 test.py 文件中,并从库中的一个类中调用了函数。我没有尝试过任何其他语言。
如何为其他语言的抽象类生成适当的声明或存根?由于插件必须实现这个类,我应该能够以某种方式生成与其他语言中的标头等效的内容,例如 Python 的 .py 文件、Java 的 .class 文件等。 我还没有尝试过,但我想有其他语言的生成器。
如何在插件中创建对象实例?如果我到了这一点,该类将在插件中实现。现在我需要调用返回已实现抽象类实例的函数,并获取指向它的指针。 根据我的研究,为了完成这项工作,我必须获得 Python 解释器、JVM 等的句柄,然后从那里与插件通信。
它看起来并不太复杂,但是当我开始研究时,即使是最简单的案例也需要大量的工作。我成功地只达到了第一点,而且只在 Python 中。这让我想知道我是否采取了正确的方法?你对此有什么想法。也许我不应该在我的库和抽象基类中使用 Qt,而只使用纯 C++。它可能会使事情变得更容易一些。或者也许我应该在我的库中只使用 C,并让插件返回一个 C 结构而不是一个类。我相信这会使事情变得更容易,因为调用图书馆将是一件微不足道的事情。而且我相信 C 结构的实现会比实现 C++ 类容易得多,甚至比实现使用 Qt 对象的 C++ 类更容易。
请为我指明正确的方向,并分享您在这方面的专业知识。另外,如果您知道任何有关该主题的书籍,我将非常乐意购买。或者一些处理这个的链接会做。
【问题讨论】:
-
您要支持哪些语言?
-
现在,我想支持 Java 和 Python。以后如果不是很复杂我会支持更多。
标签: java c++ python qt plugins