Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/qt/6.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对象在C中被询问未知接口{B86A98CC-DCC0-3205-8777-7911A07DAAAF}_C#_Com_Idispatch_Ole Automation - Fatal编程技术网

C# 动态COM对象在C中被询问未知接口{B86A98CC-DCC0-3205-8777-7911A07DAAAF}

C# 动态COM对象在C中被询问未知接口{B86A98CC-DCC0-3205-8777-7911A07DAAAF},c#,com,idispatch,ole-automation,C#,Com,Idispatch,Ole Automation,在C中通过变量访问的基于检测的COM对象的查询接口日志显示了未知的IID{B86A98CC-DCC0-3205-8777-7911A07DAAAF}。谷歌、GitHub和微软(microsoft.com)的搜索结果一文不值。有人知道这个接口可能是什么吗?如果有人知道的话,可以用来做什么 FWIW,对象被实例化如下: var type = Type.GetTypeFromProgID(THE_PROGID); var obj = (dynamic)Activator.CreateInstance(

在C中通过变量访问的基于检测的COM对象的查询接口日志显示了未知的IID{B86A98CC-DCC0-3205-8777-7911A07DAAAF}。谷歌、GitHub和微软(microsoft.com)的搜索结果一文不值。有人知道这个接口可能是什么吗?如果有人知道的话,可以用来做什么

FWIW,对象被实例化如下:

var type = Type.GetTypeFromProgID(THE_PROGID);
var obj = (dynamic)Activator.CreateInstance(type);
Console.WriteLine("ApartmentType {0}", obj.ApartmentType);
然后立即转储接口查询日志。在我看来:

099AC468 {00000000-0000-0000-C000-000000000046} IUnknown
-------- {C3FCC19E-A970-11D2-8B5A-00A0C9B7C9C4} IManagedObject
099AC420 {B196B283-BAB4-101A-B69C-00AA00341D07} IProvideClassInfo
-------- {AF86E2E0-B12D-4C6A-9C5A-D7AA65101E90} IInspectable
-------- {ECC8691B-C1DB-4DC0-855E-65F6C551AF49} INoMarshal
-------- {94EA2B94-E9CC-49E0-C0FF-EE64CA8F5B90} IAgileObject
-------- {00000003-0000-0000-C000-000000000046} IMarshal
-------- {00000144-0000-0000-C000-000000000046} IRpcOptions
099AC42C {00020400-0000-0000-C000-000000000046} IDispatch
-------- {A6EF9860-C720-11D0-9337-00A0C90DCAA9} IDispatchEx
099AC42C {00020400-0000-0000-C000-000000000046} IDispatch
099AC42C {00020400-0000-0000-C000-000000000046} IDispatch
-------- {B86A98CC-DCC0-3205-8777-7911A07DAAAF}
-------- {00000038-0000-0000-C000-000000000046} IWeakReferenceSource
099AC42C {00020400-0000-0000-C000-000000000046} IDispatch
C单元测试用例VS2015框架4.5.2中的相同代码给出了类似的结果:

0A41BFF0 {00000000-0000-0000-C000-000000000046} IUnknown
-------- {C3FCC19E-A970-11D2-8B5A-00A0C9B7C9C4} IManagedObject
0A41BFA8 {B196B283-BAB4-101A-B69C-00AA00341D07} IProvideClassInfo
-------- {AF86E2E0-B12D-4C6A-9C5A-D7AA65101E90} IInspectable
-------- {ECC8691B-C1DB-4DC0-855E-65F6C551AF49} INoMarshal
-------- {94EA2B94-E9CC-49E0-C0FF-EE64CA8F5B90} IAgileObject
-------- {00000003-0000-0000-C000-000000000046} IMarshal
-------- {00000144-0000-0000-C000-000000000046} IRpcOptions
-------- {B86A98CC-DCC0-3205-8777-7911A07DAAAF}
-------- {B86A98CC-DCC0-3205-8777-7911A07DAAAF}
0A41BFB4 {00020400-0000-0000-C000-000000000046} IDispatch
-------- {A6EF9860-C720-11D0-9337-00A0C90DCAA9} IDispatchEx
0A41BFB4 {00020400-0000-0000-C000-000000000046} IDispatch
当然,除了显示指针的宽度外,32位和64位模式之间没有明显的差异

对象本身是从Delphi派生的,它解释了如何响应查询。但是,对于不支持此接口的其他对象,初始接口查询序列基本相同,无论它们是响应0还是响应1

但是,每个成员访问不仅会导致对IDispatch的查询,还会导致对未知接口的两个查询:

099A5068 {00020400-0000-0000-C000-000000000046} IDispatch
-------- {B86A98CC-DCC0-3205-8777-7911A07DAAAF}
-------- {B86A98CC-DCC0-3205-8777-7911A07DAAAF}
099A5068 {00020400-0000-0000-C000-000000000046} IDispatch
-------- {B86A98CC-DCC0-3205-8777-7911A07DAAAF}
-------- {B86A98CC-DCC0-3205-8777-7911A07DAAAF}
... and so on ad infinitum ...
这是从一长串这样重复的台词中剪下来的;无法判断未知查询是在相应的IDispatch调用之前、括号中还是之后

针对Charlieface的评论进行了澄清:成员通过一系列printf语句访问,如下所示:

var type = Type.GetTypeFromProgID(THE_PROGID);
var obj = (dynamic)Activator.CreateInstance(type);
Console.WriteLine("ApartmentType {0}", obj.ApartmentType);
如果我将每个成员访问的结果转换为其真实数据类型,然后将其传递给Console,则对未知接口的双重查询将完全消失。WriteLine:

未知查询似乎是CLR的东西,而不是LINQPad的东西,因为它也出现在VS2015中


有人知道{B86A98CC-DCC0-3205-8777-7911A07DAAAF}代表哪个接口,以及它的用途吗?

之所以会出现这种情况,是因为您使用的动态关键字将触发来自.NET的各种调用。相应的代码位于以下位置:

{B86A98CC-DCC0-3205-8777-7911A07DAAAF}是自动生成的IID,即:typeOfDynamicMetaObjectProvider.GUID。它是一个纯托管接口,因此从本机代码看它没有用处

要找到它,只需查看调用堆栈,但要确保线程分区类型与对象兼容,否则将得到RPC远程处理堆栈

在我的例子中,我必须在.NET方法上添加属性:


这是因为您使用的是dynamic关键字,它将触发来自.NET的各种调用。相应的代码位于以下位置:

{B86A98CC-DCC0-3205-8777-7911A07DAAAF}是自动生成的IID,即:typeOfDynamicMetaObjectProvider.GUID。它是一个纯托管接口,因此从本机代码看它没有用处

要找到它,只需查看调用堆栈,但要确保线程分区类型与对象兼容,否则将得到RPC远程处理堆栈

在我的例子中,我必须在.NET方法上添加属性:


您是否在任何地方尝试强制转换?@Charlieface:成员访问的结果将传递到Console.WriteLine;谁知道CLR格式化逻辑正在尝试什么类型的强制转换。。。不过接得好!在将所有成员访问结果传递到Console.WriteLine之前,将所有成员访问结果强制转换为其真正的数据类型所有标量,如string、int和DateTime,从而完全消除了对连接到成员访问的未知接口的双重查询。情节变厚…可能是IFormattable请参见并发布您的控制台代码。WriteLineI尝试转换为IFormattable,即{9a604ee7-e630-3ded-9444-BAAE24775AB},但IID从未出现在COM中。不过,这是有道理的,因为IFormattable是一个.NET接口,深深植根于.NET世界,而不是.NET只通过CCW和RCW代码COM可调用包装器和运行时可调用包装器的层看到的外来COM世界的一部分,分别。您是否在任何地方尝试强制转换?@Charlieface:成员访问的结果将传递到Console.WriteLine;谁知道CLR格式化逻辑正在尝试什么类型的强制转换。。。不过接得好!在将所有成员访问结果传递到Console.WriteLine之前,将所有成员访问结果强制转换为其真正的数据类型所有标量,如string、int和DateTime,从而完全消除了对连接到成员访问的未知接口的双重查询。情节变厚…可能是IFormattable请参见并发布您的控制台代码。WriteLineI尝试转换为IFormattable,即{9a604ee7-e630-3ded-9444-BAAE24775AB},但IID从未出现在COM中。不过,这是有道理的,因为IFormattable是一个.NET接口,深深植根于.NET世界,而不是.NET仅通过CCW和RCW代码COM可调用包装层和运行时可调用包装层看到的外来COM世界的一部分。谢谢,您的回答非常有用!识别接口不仅打开了新的信息源,而且
如此令人兴奋的新研究途径。注意:我使用IDispatch和dynamic,因为所讨论的结构是在运行时通过从用户指定的XSD读取类型信息生成的。VisualBasic或FoxPro/VFP等动态语言的用户可以通过引用动态生成的类型库获得调试器支持和代码完成成员选择,但C用户迄今为止一直被冷落。IDynamicMetaObject可能允许部分补救。首先,IDynamicMetaObject可能允许我将类型信息从COM端隧道到.NET,这样像LINQPad的.Dump这样的东西就可以像处理本机对象一样工作,而不是只打印系统。u ComObject.谢谢,您的回答非常有用!识别接口不仅开辟了新的信息来源,而且还开辟了令人兴奋的研究新途径。注意:我使用IDispatch和dynamic,因为所讨论的结构是在运行时通过从用户指定的XSD读取类型信息生成的。VisualBasic或FoxPro/VFP等动态语言的用户可以通过引用动态生成的类型库获得调试器支持和代码完成成员选择,但C用户迄今为止一直被冷落。IDynamicMetaObject可能允许部分修复。首先,IDynamicMetaObject可能允许我将类型信息从COM端隧道到.NET,这样像LINQPad的.Dump这样的东西就可以像处理本机对象一样工作,而不是只打印系统。\uu ComObject。