2011-12-09 1 views
2

레거시 VB6 응용 프로그램과 함께 사용하기 위해 VC++ 2010에 OCX 모듈을 작성했습니다. 그것에서, 나는 임의의 데이터의 배열 (메모리로의 포인터)을 취해야하는 하나의 함수를 가지고있다.C++ OCX 모듈에서 void *를 사용하는 함수를 지정하는 방법은 무엇입니까?

기능은 지금 빈 몸으로 구현으로 선언 :

BEGIN_DISPATCH_MAP(COcxTestCtrl, COleControl) 
    DISP_FUNCTION_ID(COcxTestCtrl, "Test", 1, Test, VT_EMPTY, VTS_PI1 /*??*/) 
END_DISPATCH_MAP() 

과 IDL 파일은 말한다 :

afx_msg void Test(void const* pSrc); 

디스패치지도입니다

dispinterface _DOcxTest { 
    properties: 
    methods:  [id(1)] void Test(void const* pSrc); 
}; 

VB6의 개체 카탈로그는 함수의 형식을

으로 나열합니다.
Sub Test(pSrc As Any) 
Member of OcxTestLib.OcxTest 

내 호출 코드는 항상 "유형 호환되지 않는 오류 13"나에게 말한다, 그러나

Private Sub TestButton_Click() 
    Dim text() As Byte 
    Dim buflen As Long 
    buflen = 2^16 
    text = String(buflen, "Z") 
    OcxTest1.Test (text(0)) 
End Sub 

입니다. 이것은 내가 문제가있는 유일한 유형이며, 다른 모든 호출은 계획대로 이루어집니다.

나는 void const* 대신 char const*, byte const*, INT8 const*을 사용하여 놀았지만이 중 아무 것도 작동하지 않았습니다. INT8 const*을 사용할 때 VB6은이 함수를 Sub Test(pSrc As Byte)으로 표시하지만 여전히 동일한 오류가 발생합니다.

어떻게 바이트 배열에 대한 포인터를 OCX 모듈에 전달할 수 있습니까?

+0

void *는 자동화 호환 유형이 아닙니다. 대신 VARIANT를 사용하십시오. 또는 배열을 전달하려는 경우 SAFEARRAY. –

답변

2

VB의 바이트 배열은 이미 기본 SAFEARRAY이므로 SAFEARRAY (또는 SAFEARRAY가 포함 된 VARIANT)로 OCX에 전달합니다.

+0

'SAFEARRAY'를 포함하는'VARIANT'로 전달하는 것이 효과적입니다 :'static_cast ((* (pSrc-> pparray)) -> pvData)':) –