【发布时间】:2017-01-11 04:13:44
【问题描述】:
所以我尝试调试程序,一旦我进入 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
);
【问题讨论】:
-
显示如何在
IDL中声明调用方法(0x16)。哪个是他的签名? -
有一个 nvbuttonpanel.h 头文件和类的 .cpp 但我没有类前的 .idl 文件...我试图找到 0x16 如何映射到AddListener 函数,但我看到的唯一相关性是 AddListener 方法是头文件中的第 22 个方法... @RbMm
-
好的,显示
nvbuttonpanel.h- 需要了解如何声明调用方法 -
不,你不懂我。不是这个。我的意思是由
Invoke调用的dispinterface方法(dispid = 0x16)的定义@ -
好的,我在 DLL 中找到了它,我会发布它@RbMm
标签: c++ windows visual-c++ cwnd