我们目前正在尝试更改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?