【问题标题】:Weird IDL error after migration to VS2010迁移到 VS2010 后出现奇怪的 IDL 错误
【发布时间】:2011-09-06 10:24:30
【问题描述】:

这是我们在 VS2008 下成功使用的一个非常简单的 IDL 接口(为简洁起见缩短了参数列表):

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 被接受(通过反转接口的 2 个方法观察到)。

怎么会?如何让 MIDL 再次理解string

TIA。

【问题讨论】:

  • string 是 IDL 中的一个属性,但只能出现在 [brackets] 中,并且后面必须跟一个类型说明符。您使用它的方式表明您只是忘记包含您自己的名为“string”的类型的定义。

标签: c++ visual-studio-2010 idl midl


【解决方案1】:

看起来编译器不知道类型“字符串”,也许你忘记在项目中包含一些引用,或者它在 VS2010 中更改的位置等。仔细检查包含、引用等。

附: that 有意义吗?

【讨论】:

  • 其实我不需要额外的参考资料。反之亦然:我需要删除此文件:-) 无论如何+1 寻求您的帮助。
【解决方案2】:

为了从 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 );
};

【讨论】:

  • 还需要使用:using System.Runtime.InteropServices;
  • 感谢您的回答,但.NET 并未参与此项目。
【解决方案3】:

似乎 IDL 文件虽然存在于项目中,但根本没有使用。 VS2008 默默地忽略了它(就像它对未引用的 .h 文件所做的那样)。 出于某种原因,VS2010 会尝试编译它,即使它没有在其他任何地方引用。而且由于内容完全是错误的(字符串确实不是原生 IDL 类型,而是最好的属性),我现在有错误。

解决方案:从项目中排除文件!

【讨论】:

    猜你喜欢
    • 2020-11-23
    • 2013-06-20
    • 1970-01-01
    • 1970-01-01
    • 2019-03-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多