Mikle писал(а):Но так сделаны многие ф-ции в Direct3D.
Например в DirectX, который предназначен для использования из разных языков, есть такая процедура: D3DX8.BufferGetData, куда данные передаются, как "Data As Any".
Вполне возможно. Правда, у меня нет опыта использования именно DirectX в VB.
Во-первых, DirectX вряд ли написан на VB, поэтому то, как он декларирует свои интерфейсы и методы, не может быть воспроизведено при самостоятельном создании "VB6 ActiveX DLL".
Во-вторых, если VB показывает интерфейс или метод в Object Browser, не факт, что он даст его использовать в программе. Часто бывает, что он пишет, что интерфейс не является OLE совместимым и не отрабатывает.
В-третьих, я посмотрел интерфейс ID3DX8 в OLE/COM Viewer, который содержит указанный тобой метод BufferGetData
- Код: Выделить всё
[odl, uuid(3AC50043-CF82-4C44-862E-B206B4F03301), helpcontext(0x00015c72), hidden]
interface ID3DX8 : IUnknown
{
...
[helpcontext(0x0001512b)] HRESULT _stdcall BufferGetData(
[in] D3DXBuffer* Buffer,
[in] long index, [in] long typesize, [in] long typecount,
[in, out] void* Data);
...
};
Я сомневаюсь, что его просто использовать в VB. Если ты приведешь часть кода, который использует эту или другую подобную функцию, можно и дальше поговорить. Но в любом случае, описание "void* Data" невозможно создать на VB, а описание "long* Data" или естественное "ByRef Data As Long" передает только один элемент для изменения. То же касается всех типов в VB, кроме массивов. А это и есть SAFEARRAY.
PS
Кстати, вот такое описание на IDL
- Код: Выделить всё
[id(1)] HRESULT Test2([in,out] SAFEARRAY(SAFEARRAY(VARIANT)) * v);
приводит к появлению вот такого (смешного и неработающего) описания в Object Browser
- Код: Выделить всё
Sub Test2(v() As () As Variant)