Ошибка несоответствия типов при вызове 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 правильные типы ожидаемых параметров, поэтому я не понимаю, почему я получаю ошибку несоответствия типов во всплывающем окне при каждом запуске программы … Есть идеи, почему мой InvokeHelper выдает ошибку несоответствия типов?

Я пытался заглянуть в InvokeHelper документация по методу, и это действительно сбивает с толку … Что я знаю, так это то, что он вызывает исключение COleException, упомянутое в документации и SCODE возвращается из метода Invoke -2147352571

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

0

Решение

Я смог решить проблему, выполнив то, что предложил 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
);
-1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]