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)

これは、C ++のようにHRESULTではなく、[out、retval]が戻り型として使用されているためだと理解しています。メソッド定義を変更せずにS_OK/S_FALSE値を返す簡単な方法はありますか?私が見ることができる唯一の方法は、私がildasm / ilasmを使用してpreservesigを追加する必要があるということです。そのため、次のようになります。

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

ilのコンパイル手順を実行せずに他の方法があるかどうか疑問に思いました。

4

2 に答える 2

2

/PreserveSigフラグをtlbimpに渡してみてください。これにより、生成されるメソッドにPreserveSigAttributeが追加されます。これは、最新バージョンに追加された新機能です。詳細については、tlbimpCodePlexサイトをご覧ください。

于 2010-04-07T13:49:53.020 に答える
1

別の回答で述べたように/PreserveSigフラグを使用して、生成されるインターフェイスにエクスポートされるすべてのメソッドにPreserveSig属性をアタッチすることを示すことができます。

すべてのメソッドにPreserveSig属性を適用したくない場合は、C#コードでCOMインターフェイスを簡単に定義してから、PreserveSig属性を適用し、それに応じて関数の署名を変更できます。次に、TLBIMPのcoクラスからクラス実装をキャストし、必要に応じてインターフェイス定義を操作できます。

于 2010-04-07T13:55:20.963 に答える