【问题标题】:mysterious include of comdef.hcomdef.h 的神秘包含
【发布时间】:2018-06-21 01:04:51
【问题描述】:

在我的项目中有一些编译错误C2872由于byte的模糊定义,在我设置-Include后,输出显示C2872是由于包含文件:

C:\Program Files (x86)\Microsoft Visual Studio\2017\Professional\VC\Tools\MSVC\14.12.25827\include\comdef.h

来自我的myado.h 文件之一。

但是,myado.h 的任何地方都没有这样的包含,怎么会被包含呢?

myado.h 做了这样的事情:

#import "C:/Program Files/Common Files/System/ado/msado15.dll"  rename("EOF", "adoEOF") rename("BOF", "adoBOF")

#include <icrsint.h>  // ADO C/C++ Record Binding Definitions

#define TESTHR(x) if FAILED(x) _com_issue_error(x)

,这里FAILED是一个宏定义在

c:\Program Files (x86)\Windows Kits\10\Include\10.0.16299.0\shared\winerror.h

_com_issue_error 定义在

c:\Program Files (x86)\Microsoft Visual Studio\2017\Professional\VC\Tools\MSVC\14.12.25827\include\comutil.h

是这个原因吗?

但如果是这种情况,由于使用了 marco,头文件是如何包含在内的?

或者,c++ 编译器 Visual Studio 是如何识别宏定义的?

【问题讨论】:

  • 显示来自myado.h 的实际代码,而不是类似的代码。 为什么这段代码会有这样的行为?如果我们看不到实际的代码就无法回答。 (import语句是从DLL中导入一个类型库(TLB),那个TLB是给ADO用的,它是基于ActiveX的,它是基于COM的,就是_com*引用的,COM的定义来自comdef .h.)
  • @KenWhite 没必要——简单地说,我的代码使用了与 com 相关的东西,但从未直接包含comutil.h,但是,Visual Studio 编译输出是这样说的,所以comutil.h怎么会不请自来就参加聚会?
  • 来自导入的 TLB。我以为我在上面解释过。
  • @KenWhite 但代码仅从 C:/Program Files/Common Files/System/ado/ 导入 msado5.dll,没有导入或包含 .tlb 文件,我也找不到硬盘上的msado15.tlb -- 不过System 文件夹中有一些msado20/21/25/26/27/28/60.tlb
  • TLB 嵌入在 DLL 中。它是通过(奇怪的是)#import 语句从该 DLL 导入的。你认为#import 的目的是什么?

标签: c++ macros include-path


【解决方案1】:

所有功劳归于肯·怀特。

编译后,由于#import "C:/Program Files/Common Files/System/ado/msado15.dll" rename("EOF", "adoEOF") rename("BOF", "adoBOF")

,在项目的Debug文件夹下会生成一个msado15.tlh,开头为:

// Created by Microsoft (R) C/C++ Compiler Version 14.12.25830.2 (dbe79e7e).
//
// c:\c20180411hp_cpp17_01\debug\msado15.tlh
//
// C++ source equivalent of type library C:/Program Files/Common Files/System/ado/msado15.dll
// compiler-generated file created 06/20/18 at 15:50:36 - DO NOT EDIT!

#pragma once
#pragma pack(push, 8)

#include <comdef.h>

,瞧!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-03-11
    • 2013-08-13
    • 1970-01-01
    • 1970-01-01
    • 2012-11-01
    • 1970-01-01
    相关资源
    最近更新 更多