如何强制MIDL编译器在Visual Studio 2010中使用“C ++模式”而不是“C模式”?

时间:2013-04-08 09:57:18

标签: c++ visual-studio-2010 com migration midl

我的问题很简单,但我不知道如何解决它:我有一个带有idl文件的Visual Studio 2010项目,用于生成COM类型库。该项目最初由VC ++ 6.0创建。 VC 6.0可以编译该项目而不会出现任何错误。但我最近转换它并继续尝试在VC 2010中编译它。我总是得到以下控制台输出消息:

1>------ Build started: Project: myProject, Configuration: Debug Win32 ------ 
1>Build started 08.04.2013 11:23:12.
1>InitializeBuildStatus:
1>  Touching ".\Debug\myProject.unsuccessfulbuild".
1>Midl:
1> Processing .\myFile.idl
1>  myProject.idl
1>C:\Programme\Microsoft Visual Studio 10.0\VC\include\typeinfo(29): fatal error C1189: #error :  This header requires a C++ compiler ...
1>
1>midl : command line error MIDL1003: error returned by the C preprocessor (2)
1>
1>Build FAILED.

我已经发现这只是意味着,MIDL以“C模式”调用编译器,而不是“C ++模式”。该项目既不包含.c也不包含.cpp,只包含.h和.idl文件:C / C ++部分在项目属性页面中不可用。我尝试添加一个dummy.cpp文件,使缺少的部分可用,并能够在其中默认C ++编译器。

Midl文件如下:

import "unknwn.idl";

//Globale Definitionen
#include "MyProjectGlobaleDefinitionen.h"

//Interfacedeklarationen

interface IMyProjectDcomSchnittstellen;

[

uuid(E6C14CB3-CFFE-11d4-B1A2-00104BC1A971),
helpstring(MyProject_SCHNITTSTELLE_RELEASE_2_HELPSTRING),
version (MyProject_SCHNITTSTELLE_VERSIONSNUMMER)

]

library MyProject_SCHNITTSTELLE_KURZBEZEICHNER

{

    importlib("..\\..\\..\\Files\\DLL\\stdole32.tlb");
    importlib("..\\..\\..\\Files\\DLL\\MSADO15.dll");

    //  #include "..\..\common\Hresult_Werte.h"
#include "MyProjectDcomSchnittstellenTypdefinitionen.idl"

#include "IObj1ManagerMyProject.idl"
#include "IObj1ManagerMyProjectEvents.idl"

#include "IObj2Manager.idl"
#include "IObj2NotifySink.idl"

    //************ Obj2Manager **************************
    [uuid(F0284CF2-8E24-11d4-8941-006097AA387A)]

        coclass Obj2Manager
    {
        [default] interface IObj2Manager;
        [default, source] interface IObj2NotifySinkEvents;
    }

    //************ Obj1ManagerMyProject ************************
    [uuid(E6C14CB2-CFFE-11d4-B1A2-00104BC1A971)]

        coclass Obj1ManagerMyProject
    {
        [default] interface IObj1ManagerMyProject;
        [default, source] interface IObj1ManagerMyProjectEvents;

    }   
};                                                //Ende library Obj1_myProject

如何强制MIDL以“C ++模式”调用编译器/预处理器?

2 个答案:

答案 0 :(得分:1)

不应该这个

#include "MyProjectDcomSchnittstellenTypdefinitionen.idl"

#include "IObj1ManagerMyProject.idl"
#include "IObj1ManagerMyProjectEvents.idl"

#include "IObj2Manager.idl"
#include "IObj2NotifySink.idl"

实际上就是这个

import "MyProjectDcomSchnittstellenTypdefinitionen.idl"

import "IObj1ManagerMyProject.idl"
import "IObj1ManagerMyProjectEvents.idl"

import "IObj2Manager.idl"
import "IObj2NotifySink.idl"

好的...... this一个人怎么样:

此页面仅适用于有特定理由将Microsoft C / C ++预处理器替换为MIDL使用的预处理器或必须指定自定义预处理器开关的开发人员的开发人员。 MIDL开关/ cpp_cmd,/ cpp_opt和/ no_cpp用于覆盖编译器的默认行为。通常没有理由替换Microsoft C / C ++预处理器,也没有理由指定自定义预处理器开关。

MIDL编译器在初始处理IDL文件期间使用C预处理器。编译IDL文件时使用的构建环境与默认的C / C ++预处理器相关联。如果要使用不同的预处理器,MIDL编译器开关/ cpp_cmd将覆盖默认的C / C ++ - 预处理器名称:

midl /cpp_cmd preprocessor_name filename

答案 1 :(得分:0)

在包含文件MyProjectGlobaleDefinitionen.h中有一个包含文件。我只需删除这个包含,因为它根本不需要。