最近、COM インプロセス サーバーで問題が発生しました。
インターフェイスを実装するMCanvasFont
COM オブジェクトがあります。ICanvasFont
ICanvasFont : public IUnknown
{
virtual HRESULT STDMETHODCALLTYPE Create(
/* [in] */ BSTR bstrFamily,
/* [in] */ double fSize) = 0;
virtual HRESULT STDMETHODCALLTYPE SetSize(
/* [retval][out] */ double fSize) = 0;
};
オブジェクトは、実際のフォント操作を実装するオブジェクトへのMCanvasFont
不透明なポインターを保持します。FontDelegate
class MCanvasFont : public ICanvasFont
{
public:
MCanvasFont();
virtual ~MCanvasFont();
virtual HRESULT STDMETHODCALLTYPE QueryInterface(const IID& iid, void** ppv);
virtual ULONG STDMETHODCALLTYPE AddRef();
virtual ULONG STDMETHODCALLTYPE Release();
virtual HRESULT STDMETHODCALLTYPE Create(
/* [in] */ BSTR bstrFamily,
/* [in] */ double fSize);
virtual HRESULT STDMETHODCALLTYPE SetSize(
/* [in] */ double fSize);
protected:
class FontDelegate;
const std::unique_ptr<FontDelegate> m_font; // opaque pointer
// Reference count
long m_cRef;
};
MCanvas
インターフェイスを実装するクラスもありICanvas
ます。ICanvas
インターフェイスには、現在のフォントを設定する抽象SetFont(ICanvasFont* pFont)
メソッドとDrawText
、キャンバスにテキストを描画するメソッドがあります。
class MCanvas : public ICanvas
{
public:
MCanvas();
virtual ~MCanvas();
virtual HRESULT STDMETHODCALLTYPE QueryInterface(const IID& iid, void** ppv);
virtual ULONG STDMETHODCALLTYPE AddRef();
virtual ULONG STDMETHODCALLTYPE Release();
STDMETHODDECL GetFont(
/* [retval][out] */ ICanvasFont** ppFont);
STDMETHODDECL SetFont(
/* [in] */ ICanvasFont* pFont);
// ...
STDMETHODDECL DrawText(
/* [in] */ double x,
/* [in] */ double y,
/* [in] */ BSTR text);
protected:
COMAutoPtr<ICanvasPen> m_pen;
COMAutoPtr<ICanvasBrush> m_brush;
COMAutoPtr<ICanvasFont> m_font;
// Reference count
long m_cRef;
};
FontDelegate
メソッドからオブジェクトにアクセスする方法が必要MCanvas::DrawText
です。これを行う最善の方法は何ですか?