Возврат S_FALSE из C # COM dll - PullRequest
       88

Возврат S_FALSE из C # COM dll

3 голосов
/ 07 апреля 2010

У меня есть метод, определенный в 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] используется в качестве возвращаемого типа вместо HRESULT, как в C ++.Есть ли простой способ вернуть значения S_OK / S_FALSE без изменения определения метода?Единственный способ понять, что мне нужно использовать ildasm / ilasm для добавления preserveig, поэтому я получаю что-то вроде этого:

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

Мне было интересно, был ли какой-то другой способ без компиляции ilшаг.

Ответы [ 2 ]

2 голосов
/ 07 апреля 2010

Попробуйте передать флаг /PreserveSig в tlbimp. Это должно добавить PreserveSigAttribute к методам, которые он генерирует. Это новая функция, добавленная в последнюю версию. Больше информации на сайте tlbimp CodePlex .

1 голос
/ 07 апреля 2010

Как указано в другом ответе , вы можете использовать флаг /PreserveSig, чтобы указать, что вы хотите присоединить атрибут PreserveSig ко всем методам, экспортируемым в интерфейсах. которые генерируются.

Если вы не хотите применять атрибут PreserveSig ко всем методам, вы можете легко определить интерфейс COM в коде C #, а затем применить атрибут PreserveSig и соответствующим образом изменить сигнатуру функций. Затем вы можете привести реализации классов из ваших co-классов в TLBIMP и работать с определением интерфейса по своему усмотрению.

...