そのため、プログラムをデバッグしようとしましたが、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
);