Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/280.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 将com visible方法的签名更改为使用stdcall并返回接口_C#_.net_Delphi_Com_Com Interop - Fatal编程技术网

C# 将com visible方法的签名更改为使用stdcall并返回接口

C# 将com visible方法的签名更改为使用stdcall并返回接口,c#,.net,delphi,com,com-interop,C#,.net,Delphi,Com,Com Interop,我们目前正在尝试更改COM可视方法的签名,因为这将允许我们使用相同的接口,而无需考虑实际对象是否已通过COM创建 为此,我们在Delphi中定义了一个接口,如: ISomeInterface = interface(IUnknown) ['{67C7E941-DB69-41A0-B325-1C76ADEFFC33}'] function GetSomeValue: Integer; stdcall; function GetInterface: ISomeInterface; std

我们目前正在尝试更改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语言中实现了相应的接口#

我们在TLB中看到的签名似乎与预期的一样。签名和呼叫约定相互匹配。我们可以编译、创建实现接口的对象,并使用“GetSomeValue”和“GetInterface2”方法

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

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

此外:似乎可以“按值”返回值(如GetSomeValue),但这是否有效?或者COM方法一定要返回HResult吗

[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);
}