그래서 프로그램을 디버깅하려고 시도하고 Windows API 함수 호출이 시작되면 바로 약간의 문제가 발생하고 해당 파일을 디버깅하는 데별로 도움이되지 않습니다. 왜냐하면 나는 어쨌든 그들을 바꿀 수 없기 때문이다. 그런 다음CWnd :: InvokeHelper를 호출 할 때 형식 불일치 오류가 발생합니다.
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();
}
}
}
우리는이 : 기본적으로 내가 무엇에 끼 었어 것은 내가 변경할 수있는 다음과 같은 두 가지 기능 (참고로이 정말 예전의 코드이며, 프로그램이 32 비트 버전에서 작동하지만이 문제를 64 비트로 변환 할 때 발생)입니다 이 작업을 수행하는 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 함수는 디버깅을 통해 예외를 throw합니다. 필자가 이해할 수있는 것은 parms []가 InvokeHelper에 어떤 유형의 매개 변수가 있는지와 얼마나 많은 매개 변수가 있는지 알려주는 것입니다. 나는 정의를 고개를 나는 형식 불일치를 얻을 왜 사실
VTS_UNKNOWN = "\x0D" //IUNKNOWN*
및 따라서 내가 매개 변수의 정확한 유형이 기대하는 InvokeHelper을 말하고
VTS_PI4 = "\x43" //a 'long*'
그래서 난 이해하지 못하는 것을 발견 프로그램을 실행할 때마다 팝업 창에 오류가 발생했습니다 ...
내 InvokeHelper가 유형 불일치 오류를 발생시키는 이유에 대한 아이디어가 있습니까?
는 나는
InvokeHelper 방법을 문서로보고 시도하고 내가 아는 것은이 문서에서 언급 된 COleException를 던졌습니다 것입니다 ... 정말 혼란과
SCODE가 호출 메서드에서 반환
-2147352571
입니다[id(22), helpstring("method AddListener")]
HRESULT AddListener(
[in] IUnknown * pUnk,
[out] IUnknown ** pCookie
);
에 정의 된 유형과 일치 IDL' '에 선언 방법 (0 * 16)를 호출하는 방법을 보여줍니다. 그게 그의 서명이야? – RbMm
거기에 nvbuttonpanel.h 헤더 파일과 클래스에 대한 .cpp하지만 .idl 파일을 앞두고 클래스가 없어 ... 그 0x16 어떻게 AddListener 함수에 매핑 된 유일한 상관 관계를 찾으려고 노력했다. AddListener 메서드가 헤더 파일의 22 번째 메서드임을 확인하십시오. @RbMm –
ok, show nvbuttonpanel.h - 메서드 선언이 어떻게 호출되는지 이해합니다. – RbMm