问题标签 [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.

0 投票
1 回答
1319 浏览

com - COM coclass 实现来自另一个类型库的接口

我在 COM 中相对较新,所以如果这是一个愚蠢的问题,我很抱歉。我将一堆 COM 接口编译到类型库A中。此类型库是我的解决方案中的一个 DLL ( a.dll ) 中的资源。在进入单独 DLL ( b.dll )的单独类型库 ( B ) 中,我想定义一个实现类型库A接口的 coclass 。请参阅下面的 IDL 代码作为我想到的简化示例:

我可以编译上面的ok,但是当我在oleview中打开MIDL生成的tlb文件时,我得到一个错误信息TYPE_E_CANTLOADLIBRARY。我开始怀疑我想做的事情是不可能的。到目前为止,我的实验表明类型库需要包含 coclass 实现的所有接口以及 coclass 定义本身。这是真的?

如果我删除该importlib("MyLibA.tlb);语句,我可以在 oleview 中查看编译的 tlb 文件而不会出错,但是MyLibB.tlb还包含接口的定义IMyInterface,即接口在两个类型库中都定义了两次。我不希望这样,因为在我的应用程序中,我使用免注册 COM 加载了a.dllb.dll。在这种情况下,当在多个类型库中遇到相同的接口定义时,激活上下文生成会失败。

有什么建议可以在单独的类型库中实现所需的接口和 coclass 分离吗?

0 投票
2 回答
4521 浏览

c++ - 如何强制 MIDL 编译器在 Visual Studio 2010 中使用“C++ 模式”而不是“C 模式”?

我的问题很简单,但我不知道如何解决:我有一个 Visual Studio 2010 项目,其中包含用于生成 COM 类型库的 idl 文件。该项目最初由 VC++ 6.0 创建。VC 6.0 可以编译这个项目而没有任何错误。但我最近对其进行了转换并继续尝试在 VC 2010 中对其进行编译。我总是收到以下控制台输出消息:

我已经发现这仅意味着 MIDL 在“C 模式”中调用编译器,而不是在“C++ 模式”中。该项目既不包含 .c 也不包含 .cpp,只有 .h 和 .idl 文件:C/C++ 部分在项目属性页中不可用。我尝试添加一个 dummy.cpp 文件,以使缺少的部分可用并能够在其中默认 C++ 编译器。

Midl 文件如下所示:

如何强制 MIDL 在“C++ 模式”下调用编译器/预处理器?

0 投票
2 回答
1473 浏览

midl - 在非托管 C++ 中使用 size_is 的 MIDL 编组结构数组

我正在尝试通过 COM 接口检索结构数组。它在结构数为 1 时起作用。当结构数大于 1 时,只有第一个结构被正确编组。数组中的其余结构具有垃圾数据。我的界面如下所示:

我像这样分配结构内存:

然后填写数组中每个结构的成员。我可以在调试器中看到所有数组元素的所有成员都已正确分配。填写完结构后,我分配“*ppStruct = pstruct”来传递数组。我还可以看到输出参数“*Count”被正确设置为正确的元素数量。

为什么这不起作用?

0 投票
2 回答
2356 浏览

c++ - 全局范围枚举和命名空间冲突

我有一个 ATL COM 服务,在 .IDL 文件中,我声明了一个枚举,如下所示:

在 Gourmet.idl

头文件会自动生成,创建 Gourmet_i.h。

在同一个 ATL COM 项目的另一个 .CPP 文件(我们称之为 Decadence.cpp)中,我 #include Gourmet_i.h。我在这个 .CPP 中实现了一个类,它位于命名空间“Chocolate”下。

例如在 Decadence.cpp 中:

编译后,我收到有关 Gourmet_i.h 的以下错误:

我看到这是因为 IDL 的枚举是在全局命名空间中定义的,但是是否可以包含这个定义——所以它不会污染全局命名空间——而且我不会有这个冲突?

0 投票
1 回答
565 浏览

visual-studio-2010 - Visual Studio 始终编译 MIDL,尽管未更改

我有一个包含几个 MIDL 文件的项目,尽管它们没有改变,但 VS 总是重新编译。我尝试了几个技巧,包括将项目目录放入包含路径等,但没有任何帮助。问题是生成的头文件会影响其他“子项目”的重新编译,从而导致不必要的组件重建。

有什么解决方法吗?我什至尝试使用自定义构建工具(使用 midl.exe),这通常适用于其他类型的问题,但使用 midl.exe 表现出完全相同的行为,即 MIDL 总是被重新编译。

有点沮丧...

0 投票
0 回答
786 浏览

c# - COM OLE_HANDLE type mismatch in generated C# interop DLL

I have inherited a Microsoft Visual C++ COM project which is a dependency of a core C# application I work with. When recompiling the project and regenerating the interop DLL (using tlbimp), several methods in my library that take in an OLE_HANDLE change their signature from the previous version of my interop DLL.

I wasn't around when the previous interop was generated, but it was almost certainly compiled under VS2005 on Windows Server 2003 / Windows XP. My workstation is now Windows 7 using Visual Studio 2010 (C++ Visual Studio Compiler version 16.00.40219.01 for x64).

This is the generated C# interface for the original and new DLL (using ILSpy):

New Interface (second parameter is marshaled using the ComAliasName attribute & as int):

Old Interface (second parameter is uint):

As far as I can see, the input IDL file hasn't changed and there don't seem to be any #includes / conditional statements that would affect the definition of an OLE_HANDLE.

Whenever the methods in question are invoked, an AccessViolationException is thrown.

Does anyone have any ideas why the generated interface may have changed (not sure if any changes in MIDL/TLBIMP would result in this behaviour) or how I might start to debug this further?

Header:

C++ source for method:

0 投票
1 回答
2820 浏览

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

我有一个 .dll,其中包含一些带有特定/自定义接口的 directshow 过滤器 (COM) 以进行查询。

大多数第 3 方 directshow 组件包含可用于跨环境通信(C# typelib 导入)的嵌入式 .tlb 文件。

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

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

0 投票
0 回答
93 浏览

c++ - 仅本地进程 COM 对象所需的最少中间生成文件?

我正在制作一个 COM 接口,ITest它是仅在本地进程中运行的测试套件的一部分。我正在测试的特定功能并不重要,但重点是我不会使用CoCreateInstance()或任何工厂对象来实例化支持对象并获取指向接口的指针。我将简单地调用一个看起来像这样的简单函数:

显然,我只需要 COM 提供的全部功能的一个相当小的子集。

考虑到这一点,这是我的问题。

我知道您可以使用nul这种方式告诉midl不要生成特定文件(例如midl itest.idl /iid nul,禁止生成 IID 文件)。如果我只打算ITest通过上面显示的普通函数实例化支持我的接口的对象,并且只打算在本地进程中使用它,那么midl我实际需要的输出文件的最小子集是什么?

0 投票
1 回答
195 浏览

c++ - midl 生成的文件中 CINTERFACE 标志的用途?

使用 Microsoft 的 IDL 编译器,如果我这样做:

iid.cpp由于以下警告,我无法在 MinGW 上编译:

但是,如果我将它生成为 C 文件,或者放在-DCINTERFACE命令g++行上,它就会编译。这个标志的目的是什么,如果我编译为 C++,为什么我必须设置它?

0 投票
1 回答
1091 浏览

c++ - 中间错误 MIDL2379

我们有一个 c++ 库,我们正在为该库自动生成 COM 接口。所以我自动生成了 IDL 文件,一切正常。但是随着时间的推移,当更多接口被添加到 COM 时,我们开始收到错误

我在 VS2008 和 VS2010 中都遇到了这个错误。

谁能帮我解决这个问题。我搜索了整个互联网,找不到合适的解决方案。Microsoft Connect中报告了一个错误,但其状态为关闭。他们建议的一种解决方法是拆分 IDL 文件,这在我的情况下是不可能的,因为接口相互依赖。

我上传了一个示例 IDL 文件SampleGenerated.idl

这是midl的命令行。