2012-12-19 41 views
1
派生

我们已经创建了自己的实施IXMLHttpRequest在COM服务器(.exe)的,像这样:错误注册COM服务器时,接口从IXMLHttpRequest

interface IMyXMLHttpRequest : IXMLHttpRequest { 
    ... 
}; 

coclass MyXMLHttpRequest { 
    [default] interface IMyXMLHttpRequest; 
}; 

问题是构建尝试时,注册COM服务器,我们得到错误“访问OLE注册表错误”。我调试了注册码,它在RegisterTypeLib中失败。它看起来像试图拉入与IXMLHttpRequest有关的一些类型信息,并且(在这里猜测)不能改变与该接口相关的一些注册表项。

IXMLHttpRequest得出的结论是否是错误的?我们是否应该从IDispatch中派生出来,让我们的课程使用双接口?或者是否有可能从IXMLHttpRequest派生出来,我们只是做错了?

更新:我上传了reproducible test case。我只是使用Visual Studio向导生成一个ATL COM服务器,然后我创建了一个从IXMLHttpRequest派生的新接口和一个实现它的coclass。正如我所描述的,注册失败。如果我更改界面从IDispatch派生,那么它工作正常。使用Visual Studio 2010在Windows 7上重现100%,使用提升的权限运行。

+0

这个项目对我来说太难以理解了。您的测试程序是一个进程外服务器。你的.rgs文件是空的。您没有在资源中嵌入类型库。不知道你在做什么。 –

+0

我们正在开发问题的应用程序使用进程外服务器。我不确定这有什么奇怪的。我上传的项目完全是* Visual Studio 2010生成的样板文件(包括空的.rgs),只修改了.idl文件。我不知道为什么类型库需要嵌入资源中。只需在VS 2010中打开项目,生成并发生错误。对我来说,这是一个可重复的测试案例应该做的。 –

+0

关于类型库:我的(很可能是错误的)理解是.idl文件用于生成嵌入到.exe资源中的类型库。当我在Visual Studio中打开它时,我当然可以在.exe中看到一个类型库。我以为只有在使用通过其他方式获得的类型库(即不是从项目中的.idl文件编译)时才需要在资源中嵌入类型库。我误解了什么吗? –

回答

1

错误MSB3073:VCEnd”与代码-2147319780退出

为了记录,误差为0x8002801CTYPE_E_REGISTRYACCESS。 “访问OLE注册表错误”

正如你已经确定。 ,问题是在IXMLHttpRequest继承自类型库之外定义的接口,通过继承扩展接口基本上不是一个好主意,是的,这是可能的,它是有道理的,然而只要你接近这个接口进入一个类型库a nd有外部引用,你可能会开始触及奇怪的问题。

只要您引用了IXMLHttpRequest,MIDL编译器也会尝试将它放入类型库中。

​​

这是不是你想要的,是:你可以寻找到中间编译文件见证呢?你只是想引用它,因为它已经被system32(syswow64)目录中的msxml6.dll文件中的另一个类型库定义和托管。

主要问题是您为什么要继承IXMLHTTPRequest。为什么你认为一个“正常的”独立的新IDispatch派生接口在这里不够好?您仍然可以在此COM类上实现IXMLHTTPRequest。那么你就不会首先陷入麻烦中。

无论如何,建设问题是在IDL上编译器直接从Windows SDK文件中看到IXMLHTTPRequest的定义。

你想改变你的IDL文件,如下所示:从这里

#include "stdafx.h" 
#include "resource.h" 
#include <msxml6.h> // <<--- Re-add IXMLHTTPRequest definition for C++ code 
#include "COMServerTest_i.h" 

您的项目可建再次:

import "oaidl.idl"; 
//import "ocidl.idl"; // <<--- Make direct IXMLHTTPRequest definition invisible 

[ 
    uuid(7397D60F-A428-42C5-B698-9FA850638074), 
    version(1.0), 
] 
library COMServerTestLib 
{ 
    importlib("stdole2.tlb"); 
    importlib("msxml6.dll"); // <<--- Reference MSXML type library to import the right interface 

在你的C++文件,你想为C++代码界面上显示。

+0

好东西。我们已经改变了从'IDispatch'派生出来,但是我想a)检查这是正确的方法,并且b)更好地理解我正在观察的行为。 –

+0

使用属性C++代码时,有什么办法可以实现importlib的功能吗?我有一个非常大的COM库,它正在导入msxml并重新定义组件的tlb中的所有接口,这会导致问题。 –

+1

您可以使用['idl_quote']将'importlib'注入到IDL中(http://msdn.microsoft.com/en-us/library/s5cy953h%28v=vs.110%29.aspx) –