在Visual Studio 2019中编译ATL项目时在propidlbase.idl中重新定义错误

问题描述

我正在尝试将以前的旧项目从Visual Studio 2010迁移到Visual Studio的当前版本(2019)。 我是Microsoft有关升级的变更说明,与以前的做法相比,VS 2019中使用ATL属性似乎有所变化。

我能够编译该项目,因为尝试在Visual Studio 2019中编译该项目时遇到了一堆重新定义错误

4>64 bit Processing .\vc140.idl
4>vc140.idl
4>64 bit Processing C:\Program Files (x86)\Windows Kits\10\Include\10.0.17763.0\shared\wtypes.idl
4>wtypes.idl
4>64 bit Processing C:\Program Files (x86)\Windows Kits\10\Include\10.0.17763.0\shared\wtypesbase.idl
4>wtypesbase.idl
4>64 bit Processing C:\Program Files (x86)\Windows Kits\10\Include\10.0.17763.0\shared\basetsd.h
4>basetsd.h
4>64 bit Processing C:\Program Files (x86)\Windows Kits\10\Include\10.0.17763.0\shared\guiddef.h
4>guiddef.h
4>64 bit Processing C:\Program Files (x86)\Windows Kits\10\Include\10.0.17763.0\um\wincrypt.idl
4>wincrypt.idl
4>64 bit Processing C:\Program Files (x86)\Windows Kits\10\Include\10.0.17763.0\um\prsht.idl
4>prsht.idl
4>64 bit Processing C:\Program Files (x86)\Windows Kits\10\Include\10.0.17763.0\um\objidl.idl
4>objidl.idl
4>64 bit Processing C:\Program Files (x86)\Windows Kits\10\Include\10.0.17763.0\um\unknwn.idl
4>unknwn.idl
4>64 bit Processing C:\Program Files (x86)\Windows Kits\10\Include\10.0.17763.0\um\propidlbase.idl
4>propidlbase.idl
4>64 bit Processing C:\Program Files (x86)\Windows Kits\10\Include\10.0.17763.0\um\oaidl.idl
4>oaidl.idl
4>64 bit Processing C:\Program Files (x86)\Windows Kits\10\Include\10.0.17763.0\um\urlmon.idl
4>urlmon.idl
4>64 bit Processing C:\Program Files (x86)\Windows Kits\10\Include\10.0.17763.0\um\oleidl.idl
4>oleidl.idl
4>64 bit Processing C:\Program Files (x86)\Windows Kits\10\Include\10.0.17763.0\um\servprov.idl
4>servprov.idl
4>64 bit Processing C:\Program Files (x86)\Windows Kits\10\Include\10.0.17763.0\um\msxml.idl
4>msxml.idl
4>64 bit Processing C:\Program Files (x86)\Windows Kits\10\Include\10.0.17763.0\um\propidl.idl
4>propidl.idl
4>c:\program files (x86)\windows kits\10\include\10.0.17763.0\um\propidlbase.idl(56): error MIDL2003: redeFinition : tagVersionedStream
4>c:\program files (x86)\windows kits\10\include\10.0.17763.0\um\propidlbase.idl(60): error MIDL2003: redeFinition : PROPSETFLAG_DEFAULT
4>c:\program files (x86)\windows kits\10\include\10.0.17763.0\um\propidlbase.idl(61): error MIDL2003: redeFinition : PROPSETFLAG_NONSIMPLE
4>c:\program files (x86)\windows kits\10\include\10.0.17763.0\um\propidlbase.idl(62): error MIDL2003: redeFinition : PROPSETFLAG_ANSI
4>c:\program files (x86)\windows kits\10\include\10.0.17763.0\um\propidlbase.idl(64): error MIDL2003: redeFinition : PROPSETFLAG_UNBUFFERED
4>c:\program files (x86)\windows kits\10\include\10.0.17763.0\um\propidlbase.idl(66): error MIDL2003: redeFinition : PROPSETFLAG_CASE_SENSITIVE
4>c:\program files (x86)\windows kits\10\include\10.0.17763.0\um\propidlbase.idl(70): error MIDL2003: redeFinition : PROPSET_BEHAVIOR_CASE_SENSITIVE
4>c:\program files (x86)\windows kits\10\include\10.0.17763.0\um\propidlbase.idl(90): error MIDL2003: redeFinition : tagCAC
4>c:\program files (x86)\windows kits\10\include\10.0.17763.0\um\propidlbase.idl(91): error MIDL2003: redeFinition : tagCAUB
4>c:\program files (x86)\windows kits\10\include\10.0.17763.0\um\propidlbase.idl(92): error MIDL2003: redeFinition : tagCAI
4>c:\program files (x86)\windows kits\10\include\10.0.17763.0\um\propidlbase.idl(93): error MIDL2003: redeFinition : tagCAUI
4>c:\program files (x86)\windows kits\10\include\10.0.17763.0\um\propidlbase.idl(94): error MIDL2003: redeFinition : tagCAL
4>c:\program files (x86)\windows kits\10\include\10.0.17763.0\um\propidlbase.idl(95): error MIDL2003: redeFinition : tagCAUL
4>c:\program files (x86)\windows kits\10\include\10.0.17763.0\um\propidlbase.idl(96): error MIDL2003: redeFinition : tagCAFLT
4>c:\program files (x86)\windows kits\10\include\10.0.17763.0\um\propidlbase.idl(97): error MIDL2003: redeFinition : tagCADBL
4>c:\program files (x86)\windows kits\10\include\10.0.17763.0\um\propidlbase.idl(98): error MIDL2003: redeFinition : tagCACY
4>c:\program files (x86)\windows kits\10\include\10.0.17763.0\um\propidlbase.idl(99): error MIDL2003: redeFinition : tagCADATE
4>c:\program files (x86)\windows kits\10\include\10.0.17763.0\um\propidlbase.idl(100): error MIDL2003: redeFinition : tagCABSTR
4>c:\program files (x86)\windows kits\10\include\10.0.17763.0\um\propidlbase.idl(101): error MIDL2003: redeFinition : tagCABSTRBLOB
4>c:\program files (x86)\windows kits\10\include\10.0.17763.0\um\propidlbase.idl(102): error MIDL2003: redeFinition : tagCABOOL
4>c:\program files (x86)\windows kits\10\include\10.0.17763.0\um\propidlbase.idl(103): error MIDL2003: redeFinition : tagCASCODE
4>c:\program files (x86)\windows kits\10\include\10.0.17763.0\um\propidlbase.idl(104): error MIDL2003: redeFinition : tagCAPROPVARIANT
4>c:\program files (x86)\windows kits\10\include\10.0.17763.0\um\propidlbase.idl(105): error MIDL2003: redeFinition : tagCAH
4>c:\program files (x86)\windows kits\10\include\10.0.17763.0\um\propidlbase.idl(106): error MIDL2003: redeFinition : tagCAUH
4>c:\program files (x86)\windows kits\10\include\10.0.17763.0\um\propidlbase.idl(107): error MIDL2003: redeFinition : tagCALPSTR
4>c:\program files (x86)\windows kits\10\include\10.0.17763.0\um\propidlbase.idl(108): error MIDL2003: redeFinition : tagCALPWSTR
4>c:\program files (x86)\windows kits\10\include\10.0.17763.0\um\propidlbase.idl(109): error MIDL2003: redeFinition : tagCAFILETIME
4>c:\program files (x86)\windows kits\10\include\10.0.17763.0\um\propidlbase.idl(110): error MIDL2003: redeFinition : tagCACLIPDATA
4>c:\program files (x86)\windows kits\10\include\10.0.17763.0\um\propidlbase.idl(111): error MIDL2003: redeFinition : tagCACLSID
4>c:\program files (x86)\windows kits\10\include\10.0.17763.0\um\propidlbase.idl(276): error MIDL2003: redeFinition : tag_inner_PROPVARIANT
4>c:\program files (x86)\windows kits\10\include\10.0.17763.0\um\propidlbase.idl(309): error MIDL2003: redeFinition : PID_DICTIONARY
4>c:\program files (x86)\windows kits\10\include\10.0.17763.0\um\propidlbase.idl(310): error MIDL2003: redeFinition : PID_CODEPAGE
4>c:\program files (x86)\windows kits\10\include\10.0.17763.0\um\propidlbase.idl(311): error MIDL2003: redeFinition : PID_FirsT_USABLE
4>c:\program files (x86)\windows kits\10\include\10.0.17763.0\um\propidlbase.idl(312): error MIDL2003: redeFinition : PID_FirsT_NAME_DEFAULT

这是我的stdafx.h文件中的内容

#pragma once
#include <SDKDDKVer.h>
#include <atlbase.h>
#include <atlcom.h>
#include <atlwin.h>
#include <atltypes.h>
#include <atlctl.h>
#include <atlhost.h>
#include <comdef.h>

using namespace ATL;

深入研究代码,看起来像#if宏触发了包含第二个定义的内容。 来自propidlbase.idl

cpp_quote("#if WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_APP | WINAPI_PARTITION_SYstem)")

这与项目或编译器设置有关吗,或者我是否需要另一个#define? 为了在应用程序项目中使用ATL属性,是否有特别需要设置的隐式解决方案设置(即2019年)?

编辑:根据Simon的评论,这是我尝试使用midl编译的生成的idl文件的导入:

import "C:\Program Files (x86)\Windows Kits\10\Include\10.0.17763.0\um\wincrypt.idl";
import "C:\Program Files (x86)\Windows Kits\10\Include\10.0.17763.0\um\prsht.idl";
import "C:\Program Files (x86)\Windows Kits\10\Include\10.0.17763.0\um\objidl.idl";
import "c:\program files (x86)\windows kits\10\include\10.0.17763.0\um\unknwn.idl";
import "C:\Program Files (x86)\Windows Kits\10\Include\10.0.17763.0\um\propidlbase.idl";
import "c:\program files (x86)\windows kits\10\include\10.0.17763.0\um\oaidl.idl";
import "C:\Program Files (x86)\Windows Kits\10\Include\10.0.17763.0\um\urlmon.idl";
import "c:\program files (x86)\windows kits\10\include\10.0.17763.0\um\oleidl.idl";
import "c:\program files (x86)\windows kits\10\include\10.0.17763.0\um\servprov.idl";
import "c:\program files (x86)\windows kits\10\include\10.0.17763.0\um\msxml.idl";
import "C:\Program Files (x86)\Windows Kits\10\Include\10.0.17763.0\um\propidl.idl";
import "C:\Program Files (x86)\Windows Kits\10\Include\10.0.17763.0\um\ocidl.idl";
import "C:\Program Files (x86)\Windows Kits\10\Include\10.0.17763.0\um\comcat.idl";
import "C:\Program Files (x86)\Microsoft Visual Studio\2017\Community\VC\Tools\MSVC\14.16.27023\atlmfc\include\atliface.idl";
import "C:\Program Files (x86)\Windows Kits\10\Include\10.0.17763.0\um\oleacc.idl";
import "C:\Program Files (x86)\Windows Kits\10\Include\10.0.17763.0\um\shtypes.idl";
import "C:\Program Files (x86)\Windows Kits\10\Include\10.0.17763.0\um\MsHTML.idl";
import "c:\program files (x86)\windows kits\10\include\10.0.17763.0\um\dimm.idl";
import "c:\program files (x86)\windows kits\10\include\10.0.17763.0\um\dispex.idl";
import "C:\Program Files (x86)\Windows Kits\10\Include\10.0.17763.0\shared\dxgitype.idl";
import "c:\program files (x86)\windows kits\10\include\10.0.17763.0\shared\dxgicommon.idl";
import "c:\program files (x86)\windows kits\10\include\10.0.17763.0\shared\dxgiformat.idl";
import "C:\Program Files (x86)\Windows Kits\10\Include\10.0.17763.0\um\MsHtmHst.idl";
import "c:\program files (x86)\windows kits\10\include\10.0.17763.0\um\docobj.idl";
import "C:\Program Files (x86)\Windows Kits\10\Include\10.0.17763.0\um\Exdisp.idl";
import "C:\Program Files (x86)\Windows Kits\10\Include\10.0.17763.0\um\ObjSafe.idl";

解决方法

您应该以oa / oc / ole idls开始,并且不要使用直接的SDK路径,否则,midl编译器很可能会感到困惑。

只需确保midl.exe在路径中(例如使用Visual Studio 2019 developer command prompt时),并使用简化的.idl即可,如下所示:

import "ocidl.idl";
import "oleidl.idl";
import "oaidl.idl";

import "wincrypt.idl";
import "prsht.idl";
import "objidl.idl";
import "unknwn.idl";
import "propidlbase.idl";
import "urlmon.idl";
import "servprov.idl";
import "msxml.idl";
import "comcat.idl";
import "atliface.idl";
import "oleacc.idl";
import "shtypes.idl";
import "MsHTML.idl";
import "dimm.idl";
import "dispex.idl";
import "dxgitype.idl";
import "dxgicommon.idl";
import "dxgiformat.idl";
import "MsHtmHst.idl";
import "docobj.idl";
import "ExDisp.idl";
import "ObjSafe.idl";
,

根据Microsoft Documents,错误https://docs.microsoft.com/en-us/azure/databricks/administration-guide/access-control/workspace-acl为:您的工具链设置为自动引用系统名称空间中的任何类型。在您的IDL文件中,删除Windows名称空间的任何FileModel fileModel = DependencyService.Get<IImageFetcher>().ReadImagesAsync(); var items = new List<FileImageInfo>(); for (int i = 0; i < fileModel.Images.Count; i++) { var imageStream = ImageSource.FromStream(() => new MemoryStream(fileModel.Images[i])); items.Add(new FileImageInfo { FileType = "Jpeg",FileSize = fileModel.Sizes[i],DateCreated = fileModel.Dates[i],imageSource = imageStream }); } Items.ItemsSource = items; 指令;您只需import就可以在项目中定义任何类型。

您可以编辑stdafx.h并参考此MIDL2003以获得更多信息。

import