是否可以在不创建对象实例的情况下访问COM对象的静态属性?
我的情况是这样的: 我有一个非托管应用程序(用delphi编写)。此应用程序公开了一个基于COM的插件接口。到目前为止我只在c#中编写了托管插件。插件通过返回PluginInfo实例(实现IPluginInfo)的静态属性提供其信息(名称,作者,...)。我可以使用http://managedvcl.com在托管插件上访问此静态属性。
现在我想在同一个界面上编写非托管插件。我可以使用以下方式加载它们:
plug := CreateComObject(TGuid) as IMyPlugInterface;
他们跑了,但我不知道如何读出他们的PluginInfo。
所以问题再次是:除了在插件类中实现IPluginInfo并且仅在我创建插件实例后访问信息之外,还有其他方法吗?
答案 0 :(得分:2)
它可能不像您习惯使用的C#插件架构提供的静态属性那样“优雅”,但您可以在COM DLL中提供返回IPluginInfo的导出函数。按照惯例,这个导出的函数在设计用于在您的体系结构中运行的每个插件DLL中都具有相同的名称。
宿主应用程序将在运行时动态获取导出函数的proc地址,然后调用它以获取该特定插件DLL的IPluginInfo接口对象。这个机制可以封装在一个用于插件架构的类中,隐藏实现细节。
要完成非常的工作,您的插件架构将像您更习惯使用的C#基础架构一样方便使用和编码。
答案 1 :(得分:1)
没有。 Delphi的接口在对象实例上实现为虚拟方法(基本上),AFAIK不能接受静态成员。不过,这可能会有所增强。