标签: midl

如何让MIDL搜索合格路径的其他包含目录

更新:在打开微软支持电话后的六个月内,它被拒绝,他们声称这不是一个错误(因为文档没有明确说明所看到的行为不正确).他们拒绝DCR说,由于他们在过去十年没有听到任何投诉,这显然不是一个常见的用例.

这是对武器的呼吁,如果您遇到同样的问题,请打开与Microsoft的支持电话,以便他们了解应该修复它.我知道至少有人遇到了同样的问题,因为我在Chrome的源代码中发现了这条评论:

#构建.idl文件.
#这是一团糟.MIDL需要从$ OPEN_DIR运行,因为
#将其包含路径应​​用到像"ui/ie/bla.idl"这样的相对路径
#(它只查看当前目录)太愚蠢了.所以我们必须跳过箍来修复
#我们的相对包含路径和输出文件.


原始问题:

我有以下文件结构:

  • C:\first\Foo.idl
  • C:\second\Bar.idl

其中Bar.idl包含以下行:

import "first/Foo.idl";
Run Code Online (Sandbox Code Playgroud)

如何从编译时获得midl编译?Bar.idlC:\second

如果我Foo.idl直接导入(没有指定first/),那么指定first为一个额外的包含目录就足够了(midl /I c:\first Bar.idl)并且它会找到Foo.idl

或者,如果我从C:\(midl second\Bar.idl)编译也可以.

问题是,当C:\second使用命令行从内部编译时midl /I C:\ Bar.idl,我得到以下编译错误:

c1:致命错误C1083:无法打开源文件:'first\Foo.idl':没有这样的文件或目录

看起来midl只是在相对于当前目录而不是指定的其他包含目录之一时才愿意搜索相对路径,并且仅对非限定文件名使用其他包含目录,此行为特定于import关键字,使用include结果如预期.

我希望能够添加两个不同的附加包含目录,这样如果我在本地计算机上有文件midl将采用该版本,否则它将从服务器获取文件(因此chdir转到根文件夹不是一个选项).

有办法解决这个问题吗?

relative-path midl include-path

10
推荐指数
1
解决办法
3094
查看次数

将VS2017从15.4.1升级到15.5.1会导致构建错误

我使用以下工具/版本进行编程:Windows 10/VS2017 Professional/C++

升级到15.5.1后,我收到以下错误:

MIDL2338:交换机是矛盾的 - no_robust与 - 目标

Microsoft编译器错误说明列表说:编译IDL文件时,不能同时使用/ osf和/ ms_ext命令行开关.

我的项目属性中没有指定这些开关.

我试图降级回15.4.1,但发现除非它是N-1,否则不可能恢复到旧版本.这是基于我读过的许多博客(包括Stack Overflow).

我碰到了一堵墙,我一直处于停滞状态,直到找到这个开关问题.

非常感谢您的帮助.

c++ compiler-errors midl vcxproj visual-studio-2017

9
推荐指数
1
解决办法
2172
查看次数

如何读取 winmd(WinRT 元数据文件)?

WinMD 是一个二进制数据文件,其中包含您需要了解的有关本地 WinRT dll 中可用的命名空间、类型、类、方法和参数的所有信息。

Windows 运行时设计

Windows 运行时使用 API 元数据(.winmd 文件)公开。这与 .NET 框架 (Ecma-335) 使用的格式相同。底层二进制合同使您可以轻松地直接使用您选择的开发语言访问 Windows 运行时 API。

每个 .winmd 文件公开一个或多个命名空间。这些命名空间按它们提供的功能分组。命名空间包含类、结构和枚举等类型。

伟大的; 我如何访问它?

Winmd 是 COM

引擎盖下的 WinRT 仍然是 COM。WinRT 中的 Winmd(Windows 元数据)是来自 COM 的旧 TLB(类型库)文件的现代版本。

| COM                        | WinRT                          |
|----------------------------|--------------------------------|
| CoInitialize               | RoInitialize                   |
| CoCreateInstance(ProgID)¹  | RoActivateInstance(ClassName)  |
| *.tlb                      | *.winmd                        |
| compiled from idl          | compiled from idl              |
| HKCR\Classes\[ProgID]      | HKLM\Software\Microsoft\WindowsRuntime\ActivatableClassId\[ClassName] |
| Code stored in …
Run Code Online (Sandbox Code Playgroud)

com midl windows-runtime winmd

9
推荐指数
1
解决办法
2786
查看次数

如何在COM类型库中创建模块定义的函数

VBA使用的VBE7.dll类型库具有以下Conversion模块的MIDL :

[
  dllname("VBE7.DLL"),
  uuid(36785f40-2bcc-1069-82d6-00dd010edfaa),
  helpcontext(0x000f6ebe)
]
module Conversion {
    [helpcontext(0x000f6ea2)] 
    BSTR _stdcall _B_str_Hex([in] VARIANT* Number);
    [helpcontext(0x000f652a)] 
    VARIANT _stdcall _B_var_Hex([in] VARIANT* Number);
    [helpcontext(0x000f6ea4)] 
    BSTR _stdcall _B_str_Oct([in] VARIANT* Number);
    [helpcontext(0x000f6557)] 
    VARIANT _stdcall _B_var_Oct([in] VARIANT* Number);
    [hidden, helpcontext(0x000f6859)] 
    long _stdcall MacID([in] BSTR Constant);
    [helpcontext(0x000f6ea9)] 
    BSTR _stdcall _B_str_Str([in] VARIANT* Number);
    [helpcontext(0x000f658a)] 
    VARIANT _stdcall _B_var_Str([in] VARIANT* Number);
    [helpcontext(0x000f659f)] 
    double _stdcall Val([in] BSTR String);
    [helpcontext(0x000f64c8)] 
    BSTR _stdcall CStr([in] VARIANT* Expression);
    [helpcontext(0x000f64c8)] 
    BYTE _stdcall CByte([in] VARIANT* Expression);
    [helpcontext(0x000f64c8)] 
    VARIANT_BOOL _stdcall CBool([in] VARIANT* Expression);
    [helpcontext(0x000f64c8)] …
Run Code Online (Sandbox Code Playgroud)

c++ module typelib midl hresult

8
推荐指数
1
解决办法
346
查看次数

MIDL为/ env win32和/ env win64生成相同的文件

在Visual Studio中,当您编译foo.idl时,MIDL会在foo_p.c中生成代理信息.

不幸的是,对于Win32和x64文件,它使用相同的文件名.对于Win32,该文件以:

#if !defined(_M_IA64) && !defined(_M_AMD64)
Run Code Online (Sandbox Code Playgroud)

对于x64,文件以:

#if defined(_M_AMD64)
Run Code Online (Sandbox Code Playgroud)

当您为Win32构建然后立即为x64构建时,它不会替换foo_p.c文件,这意味着项目无法链接.

我尝试了一个预构建事件,如果它是错误的架构,删除foo_p.c文件,但VS甚至不打算运行该步骤.

我应该如何获得它以便我可以构建一个配置然后另一个配置?

midl visual-studio

5
推荐指数
1
解决办法
1933
查看次数

在IDL中将IUnknown派生的接口标记为双重的任何意义?

查看我们的代码我在一个.idl文件中发现了一个好奇的定义:

[
    object,
    uuid(uuidhere),
    dual,
    nonextensible,
    oleautomation,
    hidden
]
interface IOurInterface : IUnknown {
    //methods here
};
Run Code Online (Sandbox Code Playgroud)

如何直接从IUnknown可能是双接口派生的接口?如果我删除dual属性会有什么破坏吗?

windows com idl com-interop midl

5
推荐指数
1
解决办法
1596
查看次数

从外部类型库导入 IDL 接口

我有两个带有 COM 接口的类型库,它们是我使用 ATL 和 Microsoft 的 IDL 编写的。我希望一个库中的接口继承另一个库中的接口。

本质上,我想做史蒂文在如何在 VS C++ 中使用 .tlb 类型创建接口方法? 中描述的同样的事情。。唯一回答他的人似乎并不明白这个问题。

这是我想做的,用代码:


一些库DLL/TLB

ISomeInterface.idl

interface ISomeInterface : IDispatch { ... };
Run Code Online (Sandbox Code Playgroud)

一些库.idl

import "ISomeInterface.idl";

library SomeLibrary
{
    interface ISomeInterface;
};
Run Code Online (Sandbox Code Playgroud)

一些其他库 DLL/TLB

ISomeOtherInterface.idl

// What do I put here so that the MIDL compiler knows
// what to do when it encounters the ISomeInterface type?

interface ISomeOtherInterface : ISomeInterface { ... };
Run Code Online (Sandbox Code Playgroud)

其他一些库.idl

import "ISomeOtherInterface.idl";

library SomeOtherLibrary
{
    interface ISomeOtherInterface;
};
Run Code Online (Sandbox Code Playgroud)

MIDLimport …

idl atl typelib midl

5
推荐指数
1
解决办法
3128
查看次数

未提供COM + dll时获取IDL(用于TLB)

我有一个.dll,其中包含一些带有特定/自定义界面的DirectShow筛选器(COM)进行查询。

大多数第三方DirectShow组件都包含嵌入式.tlb文件,这些文件可用于跨环境通信(C#typelib导入)。

我不想尝试手动创建c#所需的接口,因为没有提供idl / tlb文件。

是否可以从COM .dll生成tlb(或至少是idl,我可以MIDL编译)?

c++ com idl typelib midl

5
推荐指数
1
解决办法
2072
查看次数

当MIDL无法创建tlb时,您会怎么做?

我正在尝试创建一个C#inproc服务器sbtsv.idl(它包含在Windows 8 SDK中).找到的几乎所有指令都会告诉您使用MIDL创建.tlb文件然后tlbimport创建代理dll.

但是,如果IDL不包含某个library部分,则不会生成任何.tlb文件,sbtsv.idl也不包含library部分.

我尝试创建自己的IDL文件,声明我想在库中创建的接口

#include "C:\Program Files (x86)\Microsoft SDKs\Windows\v7.1A\Include\sbtsv.idl"

[uuid(43250D0C-BBC6-4109-BCD2-6F61F0D3B611)]
library sbtsvClientLib
{
    interface ITsSbResourceNotification;
};
Run Code Online (Sandbox Code Playgroud)

但是,当我尝试运行它时,MIDL我得到以下错误

Microsoft (R) 32b/64b MIDL Compiler Version 8.00.0603  
Copyright (c) Microsoft Corporation. All rights reserved.  
Processing .\sbtsvClientLib.idl  
sbtsvClientLib.idl  
Processing C:\Program Files (x86)\Windows Kits\8.1\include\um\oaidl.idl  
oaidl.idl  
Processing C:\Program Files (x86)\Windows Kits\8.1\include\um\objidl.idl  
objidl.idl  
Processing C:\Program Files (x86)\Windows Kits\8.1\include\um\unknwn.idl  
unknwn.idl  
Processing C:\Program …

c# idl midl tlbimp

5
推荐指数
1
解决办法
2346
查看次数

连续的接口功能ID

我在midl中有一个COM对象接口

interface InterfaceName : IDispatch
{
  [id(1)] HRESULT FunA(...);
  [id(2)] HRESULT FunB(...);
  [id(3)] HRESULT FunC(...);
}
Run Code Online (Sandbox Code Playgroud)

ID需要连续吗?或者我可以定义它

interface InterfaceName : IDispatch
{
  [id(1)] HRESULT FunA(...);
  [id(3)] HRESULT FunB(...);
  [id(5)] HRESULT FunC(...);
}
Run Code Online (Sandbox Code Playgroud)

编译第二个版本似乎没问题,但在运行时会出现任何问题吗?

windows com midl

5
推荐指数
1
解决办法
60
查看次数