Absurd писал(а):И что же вы думаете? Наваял от нефиг делать.
Испытывал на таком VBS скрипте:
Set root = CreateObject("AtlSample.Root")
Set element = CreateObject("AtlSample.Element")
element.x = 0
element.y = 1
element.z = 2
root.property1 = element
Wscript.Echo root.property1.x
Wscript.Echo root.property1.y
Wscript.Echo root.property1.z
Вывод:
0
1
2
Обнаружил что VBS не умеет работать с SAFEARRAY, что позволяет задать вопрос: нахрен SAFEARRAY тогда нужны?. Придется делать OLE Automation объект с методами типа GetFirst, GetNext в качестве замены массива.
Кроме того судя по IDL, Visual C++ дуальные интерфейсы наследует все таки от IDispatch (т.е в прошлом сообщении я наврал).
А почему не умеет работать то, я что-то не понял?

Ведь ты присвоил x=0, y=1, z=2, а VBS тебе и вернул эти значения...
Далее...
Спасибо за пример и код. В целом он понятен, но вот для моего случая (вложил .tlb), я так и не понял

как в методе Method1 интерфейса IInterface1 создать объект с интерфейсом IInterface1, заполнить его long Property1 и VARIANT_BOOL Property2, затем вернуть объект. Т.е. чтобы из скриптового языка можно было написать:
Set obj = CreateObject("Project1.Interface1")
Set o = obj.Method1()
Wscript.Echo o.Property1
Wscript.Echo o.Property2
i = o.Какой-нибудь_метод()
и т.д.
Код: Выделить всё
[
uuid(BBDEBC42-9E20-40AD-8704-60C02D062091),
version(1.0),
helpstring("Project1 Library")
]
library Project1
{
importlib("stdole2.tlb");
importlib("stdvcl40.dll");
importlib("stdvcl40.dll");
[
uuid(0B20ABDC-13B2-4B34-ACCC-C2678A4AD6B4),
version(1.0),
helpstring("Dispatch interface for Interface1 Object"),
dual,
oleautomation
]
interface IInterface1: IDispatch
{
[
id(0x00000001)
]
HRESULT _stdcall Method1([out, retval] VARIANT * Val );
};
[
uuid(29AE9F1F-1A88-4EC8-8BA2-35A5179016C7),
version(1.0),
helpstring("Interface1 Object")
]
coclass Interface1
{
[default] interface IInterface1;
};
[
uuid(1533910F-F645-4811-813B-A6FE150DD302),
version(1.0),
helpstring("Dispatch interface for Interface2 Object"),
dual,
oleautomation
]
interface IInterface2: IDispatch
{
[
propget,
id(0x00000001)
]
HRESULT _stdcall Property1([out, retval] long * Value );
[
propget,
id(0x00000002)
]
HRESULT _stdcall Property2([out, retval] VARIANT_BOOL * Value );
};
[
uuid(4317B5C7-4948-44EC-8758-17639BC9DEC8),
version(1.0),
helpstring("Interface2 Object")
]
coclass Interface2
{
[default] interface IInterface2;
};
};