如何在C ++ OCX模块中指定一个带* *的函数?

时间:2011-12-09 02:04:50

标签: c++ vb6 activex bytearray ocx

我在VC ++ 2010中编写了一个OCX模块,用于传统的VB6应用程序。在其中,我有一个函数,它应该采用任意数据数组(指向内存的指针)。

该函数现在实现为空体并声明为:

afx_msg void Test(void const* pSrc);

发货地图是:

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

并且IDL文件说:

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

VB6的对象目录将函数的类型列为

Sub Test(pSrc As Any)
Member of OcxTestLib.OcxTest

我的调用代码是

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

然而,它总是告诉我“错误13:类型不兼容”。这是我唯一遇到问题的类型,所有其他电话都是按计划进行的。

我使用char const*byte const*INT8 const*代替void const*,但这一切都无效。当我使用INT8 const*时,VB6会将函数列为Sub Test(pSrc As Byte),但我仍会遇到相同的错误。

如何将指向Byte数组的指针传递给OCX模块?

1 个答案:

答案 0 :(得分:2)

VB中的Byte数组已经是本地SAFEARRAY,因此将其作为SAFEARRAY(或包含SAFEARRAY的VARIANT)传递给OCX。