[VC->VB@DLL]如何给SAFEARRAY**类型的参数传值?
用VB6实现一个COM部件,接口class1定义如下:
Public Function test(aos() As String) As String
Dim r As Integer
For r = LBound(aos) To UBound(aos)
test = test + aos(r)
Next
End Function
Public Function multiply(a As Double, b As Double) As Double
multiply=a*b
End Function
编译,生成yy.dll
VC.NET2003,添加类型库中的MFC类后,生成Cclass1类:
class Cclass1 : public COleDispatchDriver
{
public:
Cclass1(){} // 调用 COleDispatchDriver 默认构造函数
Cclass1(LPDISPATCH pDispatch) : COleDispatchDriver(pDispatch) {}
Cclass1(const Cbaobiao& dispatchSrc) : COleDispatchDriver(dispatchSrc) {}
public:
CString test(SAFEARRAY * * aos)
{
CString result;
static BYTE parms[] = VTS_UNKNOWN ;
InvokeHelper(0x60030002, DISPATCH_METHOD, VT_BSTR, (void*)&result, parms, aos);
return result;
}
double sum(SAFEARRAY * * v)
{
double result;
static BYTE parms[] = VTS_UNKNOWN ;
InvokeHelper(0x60030003, DISPATCH_METHOD, VT_R8, (void*)&result, parms, v);
return result;
}
};
我这样调用:
void test2()
{
cerr<<"BEGIN test2\n";
SAFEARRAYBOUND bounds[1];
bounds[0].cElements = 3;
bounds[0].lLbound = 0;
//
SAFEARRAY *sa = ::SafeArrayCreate(VT_BSTR,1u,bounds);
wchar_t *s[5]={L"111",L"222",L"333",L"444",L"555"};
for (long i = 0; i<5; ++i)
{
::SafeArrayPutElement(sa,&i,s[i]);
}
Cclass1 bb;
bb.CreateDispatch("yy.class1");
try{
cout<<bb.test(&sa).GetBuffer()<<endl;
}
catch(COleException *e)
{
char msg[256];
e->GetErrorMessage(msg,256);
cerr << msg << endl;
}
bb.ReleaseDispatch();
cerr<<"END test2\n";
}
结果:
BEGIN test2
类型不匹配。
END test2
void test1()
{
cerr <<"BEGIN test1\n";
Cclass1 bb;
bb.CreateDispatch("yy.class1");
SAFEARRAYBOUND bounds[1];
bounds[0].cElements=3;
bounds[0].lLbound=0;
SAFEARRAY *sa = ::SafeArrayCreate(VT_R8,1u,bounds);
double v[3]={1.0,2.0,3.0};
for (long i=0;i<3;++i)
{
HRESULT hr = ::SafeArrayPutElement(sa, &i,&v[i]);
// cerr<< hr<<endl;
}
cerr<<"OK1\n";
try{
double r = bb.sum(&sa);
cout<<r<<endl;
}
catch(COleException *e)
{
char msg[256];
e->GetErrorMessage(msg,256);
cerr << msg << endl;
}
cout << r <<endl;
cerr <<"END test1\n";
bb.ReleaseDispatch();
}
结果:
BEGIN test1
类型不匹配。
END test1
问题:
如果用VB6实现COM Component,该如何给SAFEARRAY**类型的参数传值?