查看我们的代码我在一个.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 …
我正在研究一个遗留的c ++ COM项目,我正在转移到Visual Studio 2010.在这个项目的IDL文件中,我必须从另一个c ++项目中引用一个ODL文件.我的问题是另一个项目生成其头文件为$(filename)_h.h.当我的IDL文件生成其头文件时,它生成ODL文件名为$ filename.h,并且它无法引用正确的文件.
换句话说,在我的IDL文件("MyIDLFile.idl")中,我有一个类似的声明
导入"MyODLFile.odl"
在生成的文件("MyIDLFile.h")中成为
当我需要它来生成
如何指定我希望IDL在import语句中生成的文件名?
我想从 IDL 返回一组接口。我试试这个:
interface ISecurityPolicy : IDispatch{
[id(6)] HRESULT GetPolicyList([out, ref, retval] SAFEARRAY(IEntityPolicy*)* result);
}
Run Code Online (Sandbox Code Playgroud)
我收到此警告(在 VS 2010 中):警告 1 警告 MIDL2456:SAFEARRAY(接口指针)无法使用 midl 生成的代理工作:[过程“GetPolicyList”的参数“结果”(接口“ISecurityPolicy”)]
这是一个虚假警告,正如http://social.msdn.microsoft.com/Forums/en-US/vcmfcatl/thread/84a632a9-4e29-4a95-8da7-f7aedb650339可能建议的那样?
MS IDL具有指定defaultvalue for参数的语法.我试图为接受以下内容的函数指定默认值VARIANT_BOOL:
[id(42)] HRESULT Foo([in, defaultvalue(VARIANT_TRUE)] VARIANT_BOOL bar);
Run Code Online (Sandbox Code Playgroud)
并收到以下错误消息:
错误MIDL2035:预期的常量表达式
指定默认值bar应该是什么的正确语法是VARIANT_TRUE什么?
有谁知道从类型库(.tlb)生成 idl 文件的命令行工具?这样做的原因是为了去掉 regasm 生成的枚举值中的下划线。本博客讨论了枚举中下划线的问题
http://blogs.artinsoft.net/mrojas/archive/2010/05/17/interop-remove-prefix-from-c-enums-for-com.aspx
我知道 OLEView 可以生成 IDL 文件,但我正在寻找适合自动构建的解决方案。
我正在尝试创建一个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 …
我有一个自定义工具,该工具处理给定IDL文件列表并生成许多.cpp和.h文件作为输出。我想将这些文件添加到要在我的CMakeLists中进行编译的事物列表中,并且还要对这些文件对IDL的依赖关系进行建模。为简单起见,我声明对任何IDL文件的任何更改都应触发所有cpp / h的重新生成。
我有一个自定义命令,负责运行生成器工具并列出所有IDL文件作为依赖项。
我的问题是在构建时将后续的cpp / h文件列表放入cmake。无法从IDL文件的名称推断出将生成哪些cpp文件。但是,我的生成器工具会将生成的文件列表输出到文本文件。
所以我的问题是:我如何指示cmake“从此文本文件中读取内容并将其添加为要编译的额外源文件和头文件”,还要记住,所述文本文件仅在构建的某个阶段存在?
我正在尝试更新现有的COM API以包含新的可选输出参数,并且遇到了IDL文件和相关C++头文件中参数类型的强制排序问题.
以前我有一个这样的IDL文件(更改名称以保护无辜者):
HRESULT CreateSomething(
[in] BSTR base_uri,
[in] ISomethingDescription* something_description,
[out, retval] BSTR* something_uri
);
Run Code Online (Sandbox Code Playgroud)
和相关的C++标题看起来像:
HRESULT __stdcall CreateSomething(
/* [in] */ BSTR study_uri,
/* [in] */ ISomethingDescription* something_description,
/* [out, retval] */ BSTR* something_uri
);
Run Code Online (Sandbox Code Playgroud)
这需要更新以添加可选的输出参数,该参数可以为一些客户端提供额外的错误报告信息,遵循针对内部SDK的其余部分的现有模式.
为此,我计划将IDL文件更新为如下所示:
HRESULT CreateSomething(
[in] BSTR base_uri,
[in] ISomethingDescription* something_description,
[out, defaultvalue(0)] ErrorCode* error_code,
[out, retval] BSTR* something_uri
);
Run Code Online (Sandbox Code Playgroud)
其中ErrorCode是在单独的IDL文件中定义的枚举.这遵循我在网上看到的关于如何订购带有defaultvalue和retval属性的参数的指导.但是,当我尝试更新C++头文件时,我遇到的问题是默认参数不在参数列表的末尾,即
HRESULT __stdcall CreateSomething(
/* [in] */ BSTR study_uri,
/* [in] */ ISomethingDescription* something_description,
/* [out, defaultvalue(0)] */ ErrorCode* error_code = 0, // this …Run Code Online (Sandbox Code Playgroud)