从C# COM dll返回S_FALSE

3

我有一个在IDL中定义的方法,如下:

interface IMyFunc : IDispatch
{
    [id(1), helpstring("method GetNextFunction")] HRESULT GetNextFunction(
        [in,out] long* lPos, [out, retval] BSTR* bstrName);
}

我通常使用C++来实现以下内容:

STDMETHODIMP CMyFunc::GetNextFunction(long *nID, long *lPos, BSTR *bstrName)
{
    if ( function to return )
    {
        // setup return values;
        return S_OK;
    }
    else
    {
        // just exit
        return S_FALSE;
    }
}

现在我正在使用C#实现这个功能,并且已经在类型库上使用了tlbimp,得到了以下结果:

public string GetNextFunction(ref int nID, ref int lPos)

我了解这是因为使用[out, retval]作为返回类型而不是C++中的HRESULT。有没有简单的方法在不更改方法定义的情况下返回S_OK / S_FALSE值?我唯一能想到的方式是使用ildasm / ilasm添加preservesig,以便最终得到如下结果:
public int GetNextFunction(ref int nID, ref int lPos, ref string bstrName)

我在想是否有其他方法可以避免进行 il 编译步骤。

2个回答

2

谢谢。这正是我想要的。如果这些功能能够在标准的VS2008 / VS2010 RC tlbimp程序中实现,那就太好了。 - AntonyW

1

另一篇答案中所提到的, 您可以使用/PreserveSig标志来指示您想要在生成的接口上附加PreserveSig属性

如果您不想将PreserveSig属性应用于所有方法,则可以轻松地在C#代码中定义COM接口,然后应用PreserveSig属性并相应地修改函数的签名。然后,在TLBIMP中从您的co类转换类实现,并按照您的意愿使用您的接口定义。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接