Странная ошибка IDL после перехода на VS2010 - PullRequest
1 голос
/ 06 сентября 2011

Вот очень простой интерфейс IDL, который мы успешно использовали в VS2008 (список аргументов сокращен для краткости):

interface Mailer
{
    string findNode( [in] string requestedNode );
    unsigned short addMessage( [in] string msg, [in] unsigned short kind );
};

Мы переносим решение на VS2010 SP1. Теперь у нас есть следующая ошибка сборки:

M.idl(3): error MIDL2025: syntax error : expecting a type specification near "string"

Это всегда работало как шарм, используя VS2008 SP1 Обратите внимание, что я уже заменил in на [in]. Почесывая голову, я обнаружил, что MIDL 2010 также не любит in, но ничего не говорит о [in].

Обратите внимание, что unsigned short принимается (что наблюдается при инвертировании двух методов интерфейса).

Как получилось? Как я могу заставить MIDL снова понять string?

ТИА.

Ответы [ 3 ]

1 голос
/ 06 сентября 2011

Похоже, что компилятор не знает о типе 'string', может быть, вы забыли включить какую-либо ссылку в проект, или ее местоположение изменилось в VS2010 и т. Д. Двойная проверка включений, ссылок и тому подобного.

P.S. имеет ли смысл?

0 голосов
/ 14 сентября 2011

Похоже, что файл IDL, хотя и присутствует в проекте, вообще не используется.VS2008 молча проигнорировал его (как это было бы для файла .h без ссылки).По какой-то причине VS2010 пытается скомпилировать его, даже если на него больше нет ссылок.И так как содержимое полностью глючит (строка действительно не является собственным типом IDL, а лучшим атрибутом), у меня теперь есть ошибки.

Решение: исключить файл из проекта!

0 голосов
/ 06 сентября 2011

Для экспонирования из C # это:

  interface Mailer
    {
        [return, MarshalAs(UnmanagedType.BStr)]
        string findNode( [In, MarshalAs(UnmanagedType.BStr)] string requestedNode );
        unsigned short addMessage( [In, MarshalAs(UnmanagedType.BStr)] string msg, [in] unsigned short kind );
    };

Я видел, что вы, возможно, имеете в виду разоблачение этого из C ++:

interface Mailer
{
    HRESULT findNode( [out, retval] BSTR* result, [in] BSTR requestedNode );
    HRESULT addMessage( [out, retval] unsigned short* result, [in] BSTR msg, [in] unsigned short kind );
};
...