Как указать функцию, которая принимает void * в модуле C ++ OCX? - PullRequest
2 голосов
/ 09 декабря 2011

Я написал модуль OCX в VC ++ 2010, который будет использоваться с устаревшим приложением 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), но я все еще получаю ту же ошибку.

Как передать указатель на массив байтов в модуль OCX?

1 Ответ

2 голосов
/ 09 декабря 2011

Массив байтов в VB уже является собственным SAFEARRAY, поэтому передайте его в OCX как SAFEARRAY (или VARIANT, содержащий SAFEARRAY).

...