2017-01-06 4 views
0

그래서 프로그램을 디버깅하려고 시도하고 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 
       ); 
+0

에 정의 된 유형과 일치 IDL' '에 선언 방법 (0 * 16)를 호출하는 방법을 보여줍니다. 그게 그의 서명이야? – RbMm

+0

거기에 nvbuttonpanel.h 헤더 파일과 클래스에 대한 .cpp하지만 .idl 파일을 앞두고 클래스가 없어 ... 그 0x16 어떻게 AddListener 함수에 매핑 된 유일한 상관 관계를 찾으려고 노력했다. AddListener 메서드가 헤더 파일의 22 번째 메서드임을 확인하십시오. @RbMm –

+0

ok, show nvbuttonpanel.h - 메서드 선언이 어떻게 호출되는지 이해합니다. – RbMm

답변

-1

.idl 파일에 선언 된 형식과 일치하도록 AddListener 및 RemoveListener 함수를 변경하는 RbMm이 제안한 작업을 수행하여이 문제를 해결할 수있었습니다.

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 
     ); 
+0

감사합니다. @RbMm –

관련 문제