簡體   English   中英

接口從IXMLHttpRequest派生時注冊COM服務器時出錯

[英]Error registering COM server when interface derives from IXMLHttpRequest

我們已經在COM服務器(.exe)中創建了自己的IXMLHttpRequest實現,如下所示:

interface IMyXMLHttpRequest : IXMLHttpRequest {
    ...
};

coclass MyXMLHttpRequest {
    [default] interface IMyXMLHttpRequest;
};

問題是,當內部版本嘗試注冊COM服務器時,我們收到錯誤消息“訪問OLE注冊表時出錯”。 我調試了注冊碼,並且它在RegisterTypeLib失敗。 似乎它正在嘗試獲取與IXMLHttpRequest有關的某些類型信息,並且(在此處猜測)無法更改與該接口有關的某些注冊表項。

IXMLHttpRequest派生只是錯誤的做法嗎? 我們是否應該從IDispatch派生出來並使我們的類使用雙重接口? 還是有可能從IXMLHttpRequest派生而我們做錯了?

更新:我已經上傳了可復制的測試用例 我只是使用Visual Studio向導生成了一個ATL COM服務器,然后創建了一個從IXMLHttpRequest和實現它的協類派生的新接口。 如我所述,注冊失敗。 如果我更改接口以從IDispatch派生,那么它可以正常工作。 使用Visual Studio 2010在Windows 7上以提升的特權運行時100%可重現。

錯誤MSB3073 :: VCEnd”,代碼為-2147319780。

僅作記錄,錯誤是0x8002801C TYPE_E_REGISTRYACCESS “訪問OLE注冊表時出錯。”

正如您已經確定的那樣,問題出在從類型庫外部定義的IXMLHttpRequest接口繼承。 首先,通過繼承擴展接口基本上不是一個好主意。 是的,這是有可能的,而且是有道理的,但是,一旦您將其放入類型庫並擁有外部引用,您就可能開始遇到一些奇怪的問題。

一旦引用了IXMLHttpRequest ,MIDL編譯器就會嘗試將其放入類型庫中。 您可以通過查看中間構建文件來見證這一點:

IXMLHttpRequest的意外副本

不是您想要的,是嗎? 您只想引用它,因為它已經由system32(syswow64)目錄中msxml6.dll文件中的另一個類型庫定義和托管。

主要問題是為什么要從IXMLHTTPRequest繼承。 為什么您認為這里的“正常”,單獨的新IDispatch派生接口不夠好? 您仍然仍然可以在此COM類上實現IXMLHTTPRequest 這樣一來,您就不會陷入麻煩。

無論如何,構建問題是在IDL上,編譯器直接從Windows SDK文件中看到IXMLHTTPRequest定義。

您要更改IDL文件,如下所示:

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 ++代碼可見:

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

您的項目可以從這里再次構建。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM