问题标签 [midl]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
visual-studio - MIDL 为 /env win32 和 /env win64 生成相同的文件
在 Visual Studio 中,当您编译 foo.idl 时,MIDL 会在 foo_p.c 中生成代理信息。
不幸的是,对于 Win32 和 x64 文件,它使用相同的文件名。对于 Win32,文件开头为:
对于 x64,文件开头为:
当您为 Win32 构建然后立即为 x64 构建时,它不会替换 foo_p.c 文件,这意味着项目无法链接。
我尝试了一个预构建事件,如果它用于错误的体系结构,则删除 foo_p.c 文件,但 VS 甚至不费心运行该步骤。
我应该如何获得它以便我可以构建一个配置然后另一个?
idl - 如果 typedef 使用未知类型,Microsoft MIDL 不会报告错误,这是一个错误吗?
我想知道我是否遗漏了什么:
当我使用以下命令编译 test.idl 时:
我得到这个输出
我得到一个错误的 test.h (在这条消息的底部),它只有
其中未知的 foo 类型被静默丢弃。
我本来预计会出现一条错误消息,说明“foo 是未知类型”,我错了吗?
我是否需要将任何特定参数传递给 MIDL 命令?
我使用 MIDL 编译器版本 7.00.0500 得到了相同的结果
visual-c++ - midl.exe 6 和 midl.exe 7 的不同输出
我很想将 MSVC 项目从 VS 2005 转换为 VS 2008。它包含一个 IDL 文件,该文件输出用于 RPC 的标头和存根。VS 2005 项目使用 MIDL.exe 版本 6.00.0366。VS 2008 项目使用 MIDL.exe 版本 7.00.0500。
这就是问题所在:MIDL v6 输出以下原型供我在我的服务器代码中实现:
具有相同命令行的 MIDL v7 输出此原型:
我不想将handle_t 参数添加到我现有的所有实现中。(另外,我仍然需要使用 VS 2005 编译一段时间。)
问:如何让 MIDL.exe v7 输出与 v6 相同的 RPC 服务器原型?
com - 使用 IDL 定义纯基类
当我在 IDL 中定义一个不从任何东西派生的接口时,MIDL 预编译器会发出警告(Visual C++ 2008):
警告 MIDL2271:[object] 接口必须派生自另一个 [object] 接口,例如 IUnknown (...)
如果我从另一个不是从 IUnknown 派生的接口派生我的接口,MIDL 将失败:
错误 MIDL2257:只有 IUnknown 可以用作根接口(...)
现在,我的问题是:这是 COM 或 MIDL 预编译器的限制吗?
我最近一直在看D3D10的头文件,d3d10.h显然是使用IDL生成的(MIDL为此添加了注释)。并且所有接口都以一种或另一种方式派生自 IUnknown。
但是,外围头文件(d3d10shader.h、d3d10effect.h 等)包含手动定义的 COM 接口,其中一些会触发此处描述的警告或错误。我只能假设他们必须手动定义它们以避免这些限制。
我对吗?为什么 MIDL 会阻止纯接口?
c++ - 预定义的 IDL 文件中没有类型定义
首先,
使用纯C++,没有 ATL,MFC 试图使用 COM 对象接口。
使用oleview (OLE/COM Object viewer) - 用于设计 IDL 代码。
在这个阶段,使用MIDL编译器,现在我在尝试生成以下内容时遇到了麻烦:
cmd行上的语法:
midl /nologo /env win32 /tlb ".\S8_.tlb" /h ".\S8_.h" /iid ".\S8_i.c" S8.idl
- 对应的 .TLB(类型库)
- A .H(标题)
- IID 定义包含文件 (*_i.c)
- 代理 (*_p.c)
MIDL 编译器错误:
S8.IDL(513):错误 MIDL2025:语法错误:期望“S8SimObject”附近的类型规范
c++ - COM 服务器可以重新分配 ([in, out] CACLSID * arg) 吗?
使用这样声明的 COM 接口方法:
关于编组,是否允许服务器重新分配计数数组?(我认为是,但我不确定了)
它当前的实现只替换了现有的 ID,但我想实现一个更改(不会破坏合同),可以返回更多项目而不引入新接口。
[编辑]请注意CACLSID已经是一个数组,包含一个计数和一个指针。
c++ - COM API - 无法为指针参数传递“NULL”
我有一个 COM API foo,IDL 看起来像:
当我使用这个函数时,foo(0,NULL);
我得到一个错误 - NULL 参数传递。有没有办法解决这个问题?
com - IDL 中不可创建的 coclass 的目的是什么?
在 IDL 中声明如下不可创建的 coclass 的原因是什么?
我的意思是这样的类无论如何都不会注册到 COM。在 IDL 文件和编译该 IDL 文件生成的类型库中提及它的原因是什么?
c++ - 有没有办法让 midl 在单独的 .h 中生成每个接口?
我有一堆继承从 idl 文件生成的抽象接口的对象。使用这些接口的每个对象都包含相同的文件 interfaces.h,其中包含所有 c++ 生成的映射到 idl 接口的抽象类。
每次我将任何内容更改为interfaces.idl 时,每个依赖于此的类都必须重建,因为interfaces.h 发生了变化。是否有一个标志或其他东西告诉 midl 在自己的 .h 中生成每个抽象类?
relative-path - 如何让 MIDL 在其他包含目录中搜索合格路径
更新:在向微软发起支持电话后仅仅六个月,它就被拒绝了,他们声称这不是一个错误(因为文档没有明确说明所看到的行为不是正确的)。他们拒绝了DCR,因为他们在过去 10 年没有听到任何投诉,这显然不是一个常见的用例。
这是号召性用语,如果您遇到同样的问题,请与 Microsoft 联系支持电话,以便他们了解应该修复它。我知道至少有人遇到了同样的问题,因为我在Chrome 的源代码中找到了这条评论:
#
构建 .idl 文件。
#
这是一团糟。MIDL 需要从 $OPEN_DIR 运行,因为
#
将其包含路径应用于“ui/ie/bla.idl”之类的相对路径太愚蠢了
#
(它只在当前目录中查找)。所以我们必须跳过箍来修复
#
我们的相对包含路径和输出文件。
原始问题:
我有以下文件结构:
C:\first\Foo.idl
C:\second\Bar.idl
其中Bar.idl
包含以下行:
编译时如何让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
不能选择根文件夹)。
有没有办法解决这个问题?