COM類可以修改其自身的虛擬表條目在運行時? (不考慮線程問題)
完整版:
我提供了一些其實現com接口C++類的。 COM接口在第三方框架中定義。
(編輯: COM接口的虛函數表是Windows平臺上的標準;但是C++虛函數表和COM虛函數表之間的關係,我不清楚。)
爲了注入我的實現正確地進入該框架,它需要使用兩步初始化:首先創建一個沒有參數的對象,然後用所有參數調用Initialize
方法。這是我可以選擇我的一個實現的時刻。
要做到這一點,我添加了一個「解析」類(或只是一個包裝類),其唯一的責任是選擇在Initialize
方法的實現。之後,每個對其COM方法的調用都將被轉發給實際的實現。
解析器類然後被注入框架。這繞過了框架限制。
現在,看到解析器類在初始化後沒有任何用處,我想知道是否有辦法擺脫虛方法的間接成本?我的想法是將每個COM vtable條目從具體實現複製到解析器類的vtable。
這項工作?
例子:
// (FYI) #define HRESULT unsigned long
struct IInterface
{
// ... the usual AddRef, Release and QI omitted
virtual HRESULT Initialize(VARIANT v) = 0; // the Initialize method, where implementation gets chosen
virtual HRESULT DoWork() = 0; // can only call after initialization.
};
class MyResolver : public IInterface
{
// ... the usual AddRef, Release and QI omitted
public:
virtual HRESULT Initialize(VARIANT v)
{
if (/* some conditions based on v */)
return Implem_One.Create((void**) &m_pImpl);
else
return Implem_Two.Create((void**) &m_pImpl);
"Here, can I copy the vtable entries from m_pImpl to the vtable of MyResolver (*this) ?";
for (int k = 0; k < num_virtual_methods; ++k)
this->vtbl[k] = m_pImpl->vtbl[k];
}
virtual HRESULT DoWork()
{
if (!m_pImpl) return ERROR_NOT_INITIALIZED;
m_pImpl->DoWork();
}
public:
// this creation method is injected into the framework
static HRESULT Create(void**) { /* create an instance of this class and return it */ }
private:
MyResolver() : m_pImpl(NULL) {}
virtual ~MyResolver() { if (m_pImpl) m_pImpl->Release(); }
IInterface* m_pImpl;
};
什麼是「STDMETHOD」? –
@ phresnel:我用'virutal long'代替了那個。感謝您的建議。 – rwong
現在你有一些不返回任何東西的函數。 –