[英]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編譯器就會嘗試將其放入類型庫中。 您可以通過查看中間構建文件來見證這一點:
不是您想要的,是嗎? 您只想引用它,因為它已經由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.