更改com可见方法的签名以使用stdcall并返回接口

时间:2017-04-26 13:49:20

标签: c# .net delphi com com-interop

我们目前正在尝试更改COM可见方法的签名,因为这样我们可以使用相同的接口,而无需考虑是否通过COM创建了实际对象。

为此,我们在Delphi中定义了一个接口,如:

ISomeInterface = interface(IUnknown)
  ['{67C7E941-DB69-41A0-B325-1C76ADEFFC33}']
  function GetSomeValue: Integer; stdcall;
  function GetInterface: ISomeInterface; stdcall;
  procedure GetInterface2(out pParam: ISomeInterface); stdcall;
end;

和C#中的相应界面

[ComVisible(true)]
[Guid("67C7E941-DB69-41A0-B325-1C76ADEFFC33")]
[InterfaceType(ComInterfaceType.InterfaceIsIUnknown)]
public interface ISomeInterface
{
    [PreserveSig]
    int GetSomeValue();
    [PreserveSig]
    ISomeInterface GetInterface();
    [PreserveSig]
    void GetInterface2(out ISomeInterface);
}

我们在TLB中看到的签名似乎与预期一致。签名和CallingConventions相互匹配。我们可以编译,创建实现接口的对象,并使用方法'GetSomeValue'和'GetInterface2'。

但调用'GetInterface'函数不起作用(似乎CLR立即被终止,甚至没有提供异常)。

这最终导致了一个问题:是否可以更改com方法的返回类型以返回接口(通过ref)?如果是这样,怎么样?

此外:似乎可以“按值”返回值(如在GetSomeValue中),但这是否有效?或者COM-Methods肯定要返回HResult?

0 个答案:

没有答案