调用 CWnd::InvokeHelper 时出现类型不匹配错误
Getting Type Mismatch Error when calling CWnd::InvokeHelper
所以我尝试调试程序,一旦我进入 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 期望的正确参数类型,所以我不明白为什么我每次 运行 程序时都会在弹出窗口中收到类型不匹配错误 window。 . 关于我的 InvokeHelper 抛出类型不匹配错误的原因有什么想法吗?
我试图查看 Invoke 方法返回的 InvokeHelper method documentation and it's really confusing... What I do know is that it throws the COleException mentioned in the documentation and the SCODE 是 -2147352571
[id(22), helpstring("method AddListener")]
HRESULT AddListener(
[in] IUnknown * pUnk,
[out] IUnknown ** pCookie
);
我按照 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
);
所以我尝试调试程序,一旦我进入 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 期望的正确参数类型,所以我不明白为什么我每次 运行 程序时都会在弹出窗口中收到类型不匹配错误 window。 . 关于我的 InvokeHelper 抛出类型不匹配错误的原因有什么想法吗?
我试图查看 Invoke 方法返回的 InvokeHelper method documentation and it's really confusing... What I do know is that it throws the COleException mentioned in the documentation and the SCODE 是 -2147352571
[id(22), helpstring("method AddListener")]
HRESULT AddListener(
[in] IUnknown * pUnk,
[out] IUnknown ** pCookie
);
我按照 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
);