代码之家  ›  专栏  ›  技术社区  ›  Max

MIDL编译错误(可能还有IDL文件生成问题)

  •  1
  • Max  · 技术社区  · 14 年前

    我们正在考虑将我们的应用程序从VS2008移动到VS2010。

    我们使用“属性编程”生成一些COM对象,并自动生成IDL。

    两个文件的导入指令不同,在VS2010上编译失败。

    在VS2008上,它生成如下内容:

    import "docobj.idl";
    

    论VS 2010

    import "C:\Program Files (x86)\Microsoft SDKs\Windows\v7.0A\include\wincrypt.idl";
    import "C:\Program Files (x86)\Microsoft SDKs\Windows\v7.0A\include\exdisp.idl";
    import "C:\Program Files (x86)\Microsoft SDKs\Windows\v7.0A\include\shldisp.idl";
    import "C:\Program Files (x86)\Microsoft SDKs\Windows\v7.0A\include\prsht.idl";
    import "C:\Program Files (x86)\Microsoft SDKs\Windows\v7.0A\include\mshtmhst.idl";
    import "C:\Program Files (x86)\Microsoft SDKs\Windows\v7.0A\include\mshtml.idl";
    import "c:\program files (x86)\microsoft sdks\windows\v7.0a\include\dimm.idl";
    import "c:\program files (x86)\microsoft sdks\windows\v7.0a\include\dispex.idl";
    

    在VS2010上编译IDL时,会生成以下错误

    20>  Microsoft (R) 32b/64b MIDL Compiler Version 7.00.0555 
    20>  Copyright (c) Microsoft Corporation. All rights reserved.
    20>  Processing .\_my_idl.idl
    20>  _my_idl.idl
    20>  Processing C:\Program Files (x86)\Microsoft SDKs\Windows\v7.0A\include\wincrypt.idl
    20>  wincrypt.idl
    20>C:\Program Files (x86)\Microsoft SDKs\Windows\v7.0A\include\wincrypt.idl(47): error MIDL2025: syntax error : expecting a type specification or a storage specifer or a type qualifier near "WCHAR"
    20>C:\Program Files (x86)\Microsoft SDKs\Windows\v7.0A\include\wincrypt.idl(47): error MIDL2026: cannot recover from earlier syntax errors; aborting compilation
    20>LINK : fatal error LNK1240: failed to compile IDL content
    

    手动删除“wincrypt.idl”导入指令将删除编译错误,但这不是解决方案,因为idl是自动生成的。

    我不确定这两个IDL为什么不同,以及添加导入指令的责任是什么,甚至不知道如何修复MIDL编译错误。

    有什么想法吗?

    事先谢谢。

    最大值。

    2 回复  |  直到 11 年前
        1
  •  3
  •   Hans Passant    14 年前

    它丢失了

     #import "ocidl.idl"
    

    您可以在代码中使用[importidl]属性来修复它。

    属性化编程有点错误,当它在VS2008中作为ATL项目向导的一个选项被删除时,它基本上被否决了。对于代码库的长期维护,请考虑删除它。您可以使用自动生成的.idl作为开始的方法。

        2
  •  1
  •   Greg Thayer    11 年前

    也许我用的是 [importidl] 属性错误,但我无法得到汉斯的答案来解决这个问题。但是修复 here 工作。只需将此添加到stdafx.h文件的顶部:

    [idl_quote("import \"ocidl.idl\";")];