【问题标题】:Export Interface from Dll. C# Delphi VB C++ etc从 Dll 导出接口。 C# Delphi VB C++ 等
【发布时间】:2013-02-24 13:48:15
【问题描述】:

我在 Delphi 中创建了一个能够从 dll 加载插件的应用程序。 dll 导出一个看起来像这样的函数

function GetPlugin: IPluginInterface;

IPluginInterface 是一个 ActiveX 类型库。我想是因为我使用的是类型库,然后我可以使用 C# 或任何其他语言从 dll 导出 IPluginInterface,但经过一番谷歌搜索后我发现情况并非如此,因为有很多关于托管和非托管的讨论代码和无法执行此操作的原因。所以我的问题是,我是否仍然能够在 C# 中创建一个可以导出上述函数的插件?如果不能,除了 C++,还有哪些语言可以做到这一点?

【问题讨论】:

    标签: c# delphi winapi dll


    【解决方案1】:

    所以我的问题是,我仍然能够在 C# 中创建一个插件来导出像上面这样的函数吗?如果不能,除了 C++,还有哪些语言可以做到这一点?

    Windows 上的所有主流编程环境都可以生成和使用 COM 接口。 C、C++、C#、VB6、VB.net、Delphi 等。所以,是的,您可以使用 COM 接口来完成您的任务。

    作为一个细节点,你不能做的是从 Delphi DLL 中传递一个接口作为函数的返回值。那是因为Delphi uses non-standard semantics for function return values。相反,您需要通过 out 参数返回它。

    所以你需要像这样写你的GetPlugin

    procedure GetPlugin(out Plugin: IPluginInterface); stdcall;
    

    【讨论】:

    • 非常感谢。我去做。如果我在 C# 中创建插件,我将如何导出“procedure GetPlugin(out Plugin: IPluginInterface); stdcall;”来自 c# dll?
    • 有几种不同的方法。您可以在 C# 中实现 COM 服务器。或者您可以使用 Robert Giesecke 的Unmanaged Exports
    • +1 从来不知道(甚至考虑过)Delphi 用返回值来做到这一点。
    • 关于函数返回值:我认为这是错误的,你可以返回一个接口指针(或任何其他指针)就好了。有关 WideString 的链接问题中描述的问题可能是由于 WideString 引用计数;我认为将其声明为 PWideChar 会起作用。
    • @TOndrej 不,我不是这么说的。那将是一个荒谬的断言。
    猜你喜欢
    • 1970-01-01
    • 2014-03-22
    • 2022-11-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-06-23
    • 2011-01-17
    相关资源
    最近更新 更多