Вызван неправильный метод перегрузки - PullRequest
2 голосов
/ 02 февраля 2011

Я написал компонент COM в C #.Методы интерфейса объявляются следующим образом:

[ComImport,
    Guid("7D37EE00-143E-40DF-B177-BF091D7CD36A"),
    InterfaceType(ComInterfaceType.InterfaceIsIUnknown)]
public interface IMonogramServiceHost
{
    void Send(
        [In, MarshalAs(UnmanagedType.BStr)] string text);

    void Send([In, MarshalAs(UnmanagedType.LPArray, SizeParamIndex=1)]byte[] data,
        [In, MarshalAs(UnmanagedType.I4)] int length);
}

Эти методы вызываются из кода C ++.Этот же интерфейс, объявленный в C ++:

DECLARE_INTERFACE_(IMonogramServiceHost, IUnknown)
{
    STDMETHOD(Send)(BSTR text);
    STDMETHOD(Send)(uint8 *buf, int length);
};

Я вызываю второй метод.Его параметром является просто массив без знака, длина которого определяется параметром 'length'.По какой-то неизвестной причине код переходит в метод 'void Send (string text)'.После возврата из COM-метода отладчик отображает следующее сообщение об ошибке:

Ошибка проверки времени выполнения # 0 - значение ESP не было должным образом сохранено при вызове функции.Обычно это является результатом вызова функции, объявленной с одним соглашением о вызовах, с указателем функции, объявленным с другим соглашением о вызовах.

Когда я переименовываю метод в AS, вызывается правильная версия.Почему это происходит?Я не вижу в этом логики.

Ответы [ 2 ]

2 голосов
/ 02 февраля 2011

COM не поддерживает перегрузку функций. Не совсем понятно, как вы делаете вызов, но позднее связывание, безусловно, не удастся. IDispatch :: GetIDsOfNames () будет возвращать неправильный показ, когда его спросят «Отправить». Это не сильно указано в этом случае, так как вы наследуете IUnknown. Но само по себе достаточно причин, чтобы дать этим методам разные имена.

Я бы предложил SendText против SendBytes. Само по себе оправдано, байты и символы совсем не эквивалентны в Юникоде.

0 голосов
/ 02 февраля 2011

AC # char - это массив C ++ uint16, а не массив uint8Вторая подпись - несоответствие.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...