更新:在打开微软支持电话后的六个月内,它被拒绝,他们声称这不是一个错误(因为文档没有明确说明所看到的行为不正确).他们拒绝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.idl
C:\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
转到根文件夹不是一个选项).
有办法解决这个问题吗?
我使用以下工具/版本进行编程:Windows 10/VS2017 Professional/C++
升级到15.5.1后,我收到以下错误:
MIDL2338:交换机是矛盾的 - no_robust与 - 目标
Microsoft编译器错误说明列表说:编译IDL文件时,不能同时使用/ osf和/ ms_ext命令行开关.
我的项目属性中没有指定这些开关.
我试图降级回15.4.1,但发现除非它是N-1,否则不可能恢复到旧版本.这是基于我读过的许多博客(包括Stack Overflow).
我碰到了一堵墙,我一直处于停滞状态,直到找到这个开关问题.
非常感谢您的帮助.
WinMD 是一个二进制数据文件,其中包含您需要了解的有关本地 WinRT dll 中可用的命名空间、类型、类、方法和参数的所有信息。
Windows 运行时使用 API 元数据(.winmd 文件)公开。这与 .NET 框架 (Ecma-335) 使用的格式相同。底层二进制合同使您可以轻松地直接使用您选择的开发语言访问 Windows 运行时 API。
每个 .winmd 文件公开一个或多个命名空间。这些命名空间按它们提供的功能分组。命名空间包含类、结构和枚举等类型。
伟大的; 我如何访问它?
引擎盖下的 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) 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) 在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甚至不打算运行该步骤.
我应该如何获得它以便我可以构建一个配置然后另一个配置?
查看我们的代码我在一个.idl文件中发现了一个好奇的定义:
[
object,
uuid(uuidhere),
dual,
nonextensible,
oleautomation,
hidden
]
interface IOurInterface : IUnknown {
//methods here
};
Run Code Online (Sandbox Code Playgroud)
如何直接从IUnknown
可能是双接口派生的接口?如果我删除dual
属性会有什么破坏吗?
我有两个带有 COM 接口的类型库,它们是我使用 ATL 和 Microsoft 的 IDL 编写的。我希望一个库中的接口继承另一个库中的接口。
本质上,我想做史蒂文在如何在 VS C++ 中使用 .tlb 类型创建接口方法? 中描述的同样的事情。。唯一回答他的人似乎并不明白这个问题。
这是我想做的,用代码:
interface ISomeInterface : IDispatch { ... };
Run Code Online (Sandbox Code Playgroud)
import "ISomeInterface.idl";
library SomeLibrary
{
interface ISomeInterface;
};
Run Code Online (Sandbox Code Playgroud)
// 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)
import "ISomeOtherInterface.idl";
library SomeOtherLibrary
{
interface ISomeOtherInterface;
};
Run Code Online (Sandbox Code Playgroud)
MIDLimport …
我有一个.dll,其中包含一些带有特定/自定义界面的DirectShow筛选器(COM)进行查询。
大多数第三方DirectShow组件都包含嵌入式.tlb文件,这些文件可用于跨环境通信(C#typelib导入)。
我不想尝试手动创建c#所需的接口,因为没有提供idl / tlb文件。
是否可以从COM .dll生成tlb(或至少是idl,我可以MIDL编译)?
我正在尝试创建一个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 …
我在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)
编译第二个版本似乎没问题,但在运行时会出现任何问题吗?