0

そのため、プログラムをデバッグしようとしましたが、Windows API 関数呼び出しに入るとすぐに、少しおかしくなりました。さらに、これらのファイルを変更できないため、これらのファイルのデバッグにはあまり助けがありません。基本的に私が立ち往生しているのは、変更できる次の2つの機能です(参考までに、これは本当に古いコードであり、プログラムは32ビットバージョンで動作しますが、64ビットに変換するとこの問題が発生しました):

void CSalvoPage::AdviseScrollingButtonPanel()
{
    if ( m_SBPCookie == 0 )
    {
        IUnknown * pSinkUnk;
        long * pCookie = &m_SBPCookie;
        m_spSBPControlSink->QueryInterface(IID_IUnknown, (void **) &pSinkUnk);

        if (pSinkUnk != NULL)
        {
            m_SalvoButtons.AddListener(pSinkUnk, pCookie);//here is the problem~~~~
            pSinkUnk->Release();
        }
    }
}

次に、これを行う AddListener 呼び出しがあります。

void CNvButtonPanel::AddListener(LPUNKNOWN pUnk, long* pCookie)
{
    static BYTE parms[] =
        VTS_UNKNOWN VTS_PI4;
    InvokeHelper(0x16, DISPATCH_METHOD, VT_EMPTY, NULL, parms,
         pUnk, pCookie);
}

InvokeHelper 関数がデバッグを通じて例外をスローするという事実を知っています。私が理解しているように見えるのは、parms[] によって InvokeHelper が取得するパラメーターの種類と数を知ることができるということだけです。定義を調べたところ、実際には

VTS_UNKNOWN = "\x0D" //IUNKNOWN*

VTS_PI4 = "\x43" //a 'long*'

したがって、私は InvokeHelper に期待する正しいタイプのパラメーターを伝えているので、プログラムを実行するたびにポップアップウィンドウにタイプミスマッチエラーが表示される理由がわかりません...なぜ私の InvokeHelper がタイプミスマッチエラーをスローするのかについてのアイデア?

InvokeHelperメソッドのドキュメントを調べてみましたが、本当に混乱しています...ドキュメントに記載されている COleException がスローされ、Invoke メソッドから返されるSCODEは -2147352571 であることがわかっています。

[id(22), helpstring("method AddListener")] 
            HRESULT AddListener(
                [in] IUnknown * pUnk,
                [out] IUnknown ** pCookie
                );
4

1 に答える 1

-1

RbMm が提案したことを実行することで問題を修正できました。これは、関数 AddListener および RemoveListener 関数を .idl ファイルで宣言された型と一致するように変更することでした。

void AddListener(LPUNKNOWN pUnk, LPUNKNOWN* pCookie);
void RemoveListener(LPUNKNOWN pCookie);

関数は、.idl ファイルで定義された型と正しく一致するようになりました

[id(22), helpstring("method AddListener")] 
    HRESULT AddListener(
        [in] IUnknown * pUnk,
        [out] IUnknown ** pCookie
        );

[id(23), helpstring("method RemoveListener")] 
    HRESULT RemoveListener(
        [in] IUnknown * pCookie
        );
于 2017-01-09T18:58:19.380 に答える