2012-12-19 43 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) –