Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/153.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 在COM IDL中,如何从COM依赖项引用枚举?_C++_Enums_Com_Idl - Fatal编程技术网

C++ 在COM IDL中,如何从COM依赖项引用枚举?

C++ 在COM IDL中,如何从COM依赖项引用枚举?,c++,enums,com,idl,C++,Enums,Com,Idl,我正在使用ATL创建进程内COM服务器。此COM服务器将公开的类型中有一个枚举。需要使用来自此COM服务器所依赖的另一个COM服务器的值来定义此枚举的值。我已经尝试了几乎所有我能想到的方法来让它工作,但没有真正的成功 下面是COM服务器依赖项的IDL Type1Lib.idl 导入“oaidl.idl”; 导入“ocidl.idl”; [ uuid(B777544C-77D9-4417-8302-4EAC8272DEDC), 版本(1.0), ] 库类型1lib { //必需的系统导入。 imp

我正在使用ATL创建进程内COM服务器。此COM服务器将公开的类型中有一个枚举。需要使用来自此COM服务器所依赖的另一个COM服务器的值来定义此枚举的值。我已经尝试了几乎所有我能想到的方法来让它工作,但没有真正的成功

下面是COM服务器依赖项的IDL

Type1Lib.idl
导入“oaidl.idl”;
导入“ocidl.idl”;
[
uuid(B777544C-77D9-4417-8302-4EAC8272DEDC),
版本(1.0),
]
库类型1lib
{
//必需的系统导入。
importlib(“stdole2.tlb”);
//另一个COM服务器要使用的简单枚举。
类型定义
[
uuid(EF82F7A5-3A55-44B9-AD06-201A6D0A6021)
]
枚举枚举1
{
一,,
二,,
三,,
四,,
五
}枚举1;
};
下面是尝试使用Enum1的依赖于COM服务器的IDL(包括我尝试过的一些方法)

Type2Lib.idl
//所需的系统导入。
导入“oaidl.idl”;
导入“ocidl.idl”;
//(2)FAIL允许在此idl文件中使用Type1Lib枚举,但只要使用
//这些类型中的任何一种都是完全不合格的。问题是当一个tlh文件
//从该idl文件创建的类型库生成,该tlh文件格式不正确
//因为非限定枚举引用不会解析为任何内容。
导入“Type1Lib.idl”;
//FAIL这两条语句均未编译,发出错误:
//“本地编译器支持仅在C++编译器中可用”。
/TLH是C++,显然不能由MIDL解析。
//导入“type1lib.tlh”;
//#包括“type1lib.tlh”
[
uuid(D40AC182-8744-42D1-B194-602AEDDC6E7C),
版本(1.0),
]
库类型2lib
{
//必需的系统导入。
importlib(“stdole2.tlb”);
//导入Type1Lib而不重新声明其包含的类型。
//(1)FAIL允许使用Type1Lib中的枚举类型,但不允许使用枚举值,
//所以这完全没用。
//importlib(“Type1Lib.dll”);
类型定义
[
uuid(“0B8D400A-6A8F-44B3-986D-9E099830BB6D”)
]
枚举枚举2
{
A=0x8000000+1,//一个引用Type1Lib中的枚举值。
B
C
D
E
}枚举2;
[
对象
uuid(F5BA0CB0-B7C7-4483-A3D9-D4B9E39E6269),
二重的
不可扩展,
指针\u默认值(唯一)
]
接口IType2:IDispatch
{
[id(1)]HRESULT方法1([out,retval]LONG*retval);
//部分成功。可以使用importlib引用类型定义的枚举。但是无法访问枚举值。
[id(2)]HRESULT Method2([in]enum Enum1 arg1);
};
[
uuid(6179272F-4B34-4EF0-926B-296D3AA73DB7)
]
dispinterface\u IType2Events
{
特性:
方法:
};
[
uuid(75CE545A-D2DA-4EC9-80CF-37531516DFC1)
]
辅类类型2
{
[默认]接口类型2;
[默认,源]显示接口_IType2Events;
};
};
因此,在typelibrary(嵌入在dll中)上使用importlib不起作用,因为它不允许访问Enum1的值

导入Type1Lib.idl并不十分有效,因为尽管枚举值可用,但它们只能以非限定形式使用,因此尽管Type2Lib.idl现在可以编译,但当Type2Lib_i.h包含在dllmain.cpp中时,枚举值不会解析为任何内容。另一个问题是import“Type1Lib.idl”语句导致在Type2Lib_i.h中添加“#include”Type1Lib.h”行,文件Type1Lib.h不存在,也没有理由存在它

这两个问题都有解决办法,但总体而言,它们并不能真正产生可行的解决方案

在stdafx.h中导入没有_名称空间的Type1Lib将解决不解析非限定枚举的问题,但现在您将面临无法解决的类型名冲突的可能性,因为现在您无法使用名称空间

在stdafx.h中导入Type1Lib之前,可以使用#pragma include#别名将#include“Type1Lib.h”从不存在的标头重定向到存在的标头,例如

#pragma include_alias("Type1Lib.h", "windows.h")
#import <Type1Lib.dll> no_namespace
#pragma包括别名(“Type1Lib.h”、“windows.h”)
#导入无名称空间
现在一切都建立起来了。问题是,你现在有几个棘手而脆弱的解决办法,只是等着把事情搞砸,还有一个我还没有提到的突出问题,就是这个。如果您通过“importlib”引用COM依赖项,那么您只会得到一个对依赖项的引用,您的IDL文件可以使用引用的typelibrary中的类型,但您不会重新定义任何内容。但是,如果您使用“导入”导入idl文件,那么您基本上拥有的是一个在idl文件中使用的“include”版本。这样做的问题是,使用“导入”将导致在依赖IDL文件中创建依赖IDL文件中类型的副本,而这是您最不希望看到的


所以我完全不知所措。我想做的似乎很直截了当,但尽管我尽了我所能,我只看到了错误。我迫切需要一些专家来帮助我找到一条有用的道路。

尝试了Hans的建议,并注意到它仍然导致了从Type1Lib复制Enum1的定义,作为Type2Lib中的一个新类型,我做了一些进一步的实验,并偶然发现了这种方法,它似乎工作得相当优雅

类型1lib的IDL与以前相同。枚举typedef上的guid似乎不是必需的,所以我省略了它

//Type1Lib.idl
导入“oaidl.idl”;
导入“ocidl.idl”;
[
uuid(B777544C-77D9-4417-8302-4EAC8272DEDC),
版本(1.0),
]
库类型1lib
{
//必需的系统导入。
importlib(“stdole2.tlb”);
//另一个COM服务器要使用的简单枚举。
类型定义枚举枚举1
{
一,,
二,,
三,,
四,,
五