1

最近、COM インプロセス サーバーで問題が発生しました。

インターフェイスを実装するMCanvasFontCOM オブジェクトがあります。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です。これを行う最善の方法は何ですか?

4

2 に答える 2

1

おそらく私は何かを見逃しています。MCanvasFont 内で MCanvas をフレンド クラスとして宣言し、MCanvas::DrawText 内で ICanvasFont ポインタを MCanvasFont にダウンキャストすることはできませんか?

使用している ICanvasFont ポインターは MCanvasFont 型ではない可能性があることに注意してください。ダウンキャストに使用する場合dynamic_cast、これは、与えられた ICanvasFont ポインターが MCanvas インスタンスと同じインプロセス サーバーから発信された場合にのみ成功します。これは、あなたがやろうとしていることさえ可能であると私が見ることができる唯一のシナリオです. ただし、FontDelegate にアクセスする前に、このコンテキストで操作していることを検出して確認する必要があります。

于 2012-05-29T00:41:02.540 に答える