所以我尝试调试程序,一旦进入Windows API函数调用就会有点疯狂,而且调试这些文件没什么帮助,因为我无论如何都无法改变它们。基本上我坚持的是以下两个我可以改变的功能(仅供参考,这是真正的旧代码,程序工作在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
);
答案 0 :(得分:-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
);