Delphi 通过COM访问静态属性

Delphi 通过COM访问静态属性,delphi,com,static,properties,Delphi,Com,Static,Properties,是否可以访问COM对象的静态属性而不创建该对象的实例 我的情况是: 我有一个非托管应用程序(用delphi编写)。此应用程序公开了一个基于COM的插件接口。到目前为止,我只在c#中编写托管插件。插件通过一个静态属性提供其信息(名称、作者等),该属性返回一个PluginInfo实例(实现了IPluginInfo)。我可以使用在托管插件上访问此静态属性 现在我想在同一个接口上编写非托管插件。我可以使用以下方式加载它们: plug := CreateComObject(TGuid) as IMyPlu

是否可以访问COM对象的静态属性而不创建该对象的实例

我的情况是: 我有一个非托管应用程序(用delphi编写)。此应用程序公开了一个基于COM的插件接口。到目前为止,我只在c#中编写托管插件。插件通过一个静态属性提供其信息(名称、作者等),该属性返回一个PluginInfo实例(实现了IPluginInfo)。我可以使用在托管插件上访问此静态属性

现在我想在同一个接口上编写非托管插件。我可以使用以下方式加载它们:

plug := CreateComObject(TGuid) as IMyPlugInterface;
他们运行,但我不知道如何读出他们的插件信息


因此,问题再次是:除了在插件类中实现IPluginInfo并仅在创建插件实例后访问信息之外,还有其他方法吗?

没有。Delphi的接口在对象实例上实现为虚拟方法(基本上),AFAIK不能接受静态成员。不过,这可能是一个有用的增强。

它可能不像您习惯的C#插件体系结构所提供的静态属性那样“优雅”,但您可以在COM DLL中提供一个导出函数,返回IPluginInfo。按照惯例,此导出函数在设计用于在体系结构中运行的每个插件DLL中具有相同的名称

宿主应用程序将在运行时动态获取导出函数的proc地址,然后调用它以获取特定插件DLL的IPluginInfo接口对象。这方面的机制都可以封装在插件体系结构的类中,隐藏实现细节


只需很少的工作,插件体系结构就可以像您更习惯的C#基础结构一样方便地使用和编写代码。

这里的限制因素当然不是Delphi接口本身,而是COM。从某种程度上说,Delphi接口主要是为COM设计的,因此反映了COM的特性,但将C#插件体系结构与任何COM插件体系结构进行比较会发现许多类似的差异。我很确定COM没有“COM对象的静态属性”这样的概念所以你的整个前提是有缺陷的。你不能访问不存在的东西。如果您访问C#类的静态属性,这很好,但它不是COM的可能副本