问题标签 [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.
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.dll和b.dll。在这种情况下,当在多个类型库中遇到相同的接口定义时,激活上下文生成会失败。
有什么建议可以在单独的类型库中实现所需的接口和 coclass 分离吗?
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++ 模式”下调用编译器/预处理器?
midl - 在非托管 C++ 中使用 size_is 的 MIDL 编组结构数组
我正在尝试通过 COM 接口检索结构数组。它在结构数为 1 时起作用。当结构数大于 1 时,只有第一个结构被正确编组。数组中的其余结构具有垃圾数据。我的界面如下所示:
我像这样分配结构内存:
然后填写数组中每个结构的成员。我可以在调试器中看到所有数组元素的所有成员都已正确分配。填写完结构后,我分配“*ppStruct = pstruct”来传递数组。我还可以看到输出参数“*Count”被正确设置为正确的元素数量。
为什么这不起作用?
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 的枚举是在全局命名空间中定义的,但是是否可以包含这个定义——所以它不会污染全局命名空间——而且我不会有这个冲突?
visual-studio-2010 - Visual Studio 始终编译 MIDL,尽管未更改
我有一个包含几个 MIDL 文件的项目,尽管它们没有改变,但 VS 总是重新编译。我尝试了几个技巧,包括将项目目录放入包含路径等,但没有任何帮助。问题是生成的头文件会影响其他“子项目”的重新编译,从而导致不必要的组件重建。
有什么解决方法吗?我什至尝试使用自定义构建工具(使用 midl.exe),这通常适用于其他类型的问题,但使用 midl.exe 表现出完全相同的行为,即 MIDL 总是被重新编译。
有点沮丧...
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:
c++ - 未提供时从 COM+ dll 获取 IDL(用于 TLB)
我有一个 .dll,其中包含一些带有特定/自定义接口的 directshow 过滤器 (COM) 以进行查询。
大多数第 3 方 directshow 组件包含可用于跨环境通信(C# typelib 导入)的嵌入式 .tlb 文件。
我不愿意尝试手动创建 c# 所需的接口,因为没有提供 idl/tlb 文件。
是否可以从 COM .dll 生成一个 tlb(或者至少是一个我可以 MIDL 编译的 idl)?
c++ - 仅本地进程 COM 对象所需的最少中间生成文件?
我正在制作一个 COM 接口,ITest
它是仅在本地进程中运行的测试套件的一部分。我正在测试的特定功能并不重要,但重点是我不会使用CoCreateInstance()
或任何工厂对象来实例化支持对象并获取指向接口的指针。我将简单地调用一个看起来像这样的简单函数:
显然,我只需要 COM 提供的全部功能的一个相当小的子集。
考虑到这一点,这是我的问题。
我知道您可以使用nul
这种方式告诉midl
不要生成特定文件(例如midl itest.idl /iid nul
,禁止生成 IID 文件)。如果我只打算ITest
通过上面显示的普通函数实例化支持我的接口的对象,并且只打算在本地进程中使用它,那么midl
我实际需要的输出文件的最小子集是什么?
c++ - midl 生成的文件中 CINTERFACE 标志的用途?
使用 Microsoft 的 IDL 编译器,如果我这样做:
iid.cpp
由于以下警告,我无法在 MinGW 上编译:
但是,如果我将它生成为 C 文件,或者放在-DCINTERFACE
命令g++
行上,它就会编译。这个标志的目的是什么,如果我编译为 C++,为什么我必须设置它?
c++ - 中间错误 MIDL2379
我们有一个 c++ 库,我们正在为该库自动生成 COM 接口。所以我自动生成了 IDL 文件,一切正常。但是随着时间的推移,当更多接口被添加到 COM 时,我们开始收到错误
我在 VS2008 和 VS2010 中都遇到了这个错误。
谁能帮我解决这个问题。我搜索了整个互联网,找不到合适的解决方案。Microsoft Connect中报告了一个错误,但其状态为关闭。他们建议的一种解决方法是拆分 IDL 文件,这在我的情况下是不可能的,因为接口相互依赖。
我上传了一个示例 IDL 文件SampleGenerated.idl
这是midl的命令行。