제가 ActiveX 컴퍼넌트를 BCB에서 임포트해서 사용하고 있습니다.
이 컴퍼넌트에서 사용되는 함수의 리턴값이 Variant 인데, double 배열을 리턴합니다.
그래서 VB에서의 함수원형은 다음과 같습니다.
Syntax : myClass.Func( x, y, z, p)
Return Type : Variant
Parameters :
x[Input] As Variant
y[Input] As Variant
z[Input] As Variant
p[Input/Output] As Variant
아울러 VB에서의 사용예제는 다음과 같습니다.
Dim vData As Variant
Dim p As Variant
p = 0
Const x = 1000
Const y = 1
Const z = 10
vData = myClass1.Func(x, y, z, p)
그리고 BCB로 임포트된 함수는 다음과 같습니다.
=== _TLB.h ===
VARIANT __fastcall Func(VARIANT x, VARIANT y, VARIANT z, VARIANT* p)
{
_TDispID _dispid(/* Func */ DISPID(13));
TAutoArgs<4> _args;
_args[1] = x /*[VT_VARIANT:0]*/;
_args[2] = y /*[VT_VARIANT:0]*/;
_args[3] = z /*[VT_VARIANT:0]*/;
_args[4] = p /*[VT_VARIANT:1]*/;
OleFunction(_dispid, _args);
return _args.GetRetVariant();
}
VARIANT __fastcall Func(VARIANT x, VARIANT y, VARIANT z, VARIANT* p);
template <class T> VARIANT __fastcall
_DmyClassDispT<T>::Func(VARIANT x, VARIANT y, VARIANT z, VARIANT* p)
{
_TDispID _dispid(*this, OLETEXT("Func"), DISPID(13));
TAutoArgs<4> _args;
_args[1] = x /*[VT_VARIANT:0]*/;
_args[2] = y /*[VT_VARIANT:0]*/;
_args[3] = z /*[VT_VARIANT:0]*/;
_args[4] = p /*[VT_VARIANT:1]*/;
OleFunction(_dispid, _args);
return _args.GetRetVariant();
}
=== _OCX.h ===
VARIANT __fastcall Func(VARIANT x, VARIANT y, VARIANT z, VARIANT* p);
=== _OCX.cpp ===
VARIANT __fastcall TmyClass::Func(VARIANT x, VARIANT y, VARIANT z, VARIANT* p)
{
return GetDefaultInterface()->Func(x, y, z, p);
}
문제는 VARIANT* p 파라메터를 주는 방법과 리턴되는 VARIANT 값을 받는 방법을 모르겠습니다.
Variant x,y,z;
Variant p(OPENARRAY(int,(0,200)),varDouble);
Variant vData;
vData = myClass->Func(x, y, z, p);
뭐.. 이런식으로 내지는 여러가지 제가 할 수 있는 표현은 다 이용을 해도 vData에 값이 넘어오지를 않습니다.
VB에서는 리턴값인 vData와 p 값이 Variant로 배열이 드나들면서 배열값이 리턴이 되는데...
제 실력으로는 3일동안 머리만 쥐어뜯고 있네욤..
다른 임포트된 함수들도 저런식으로 배열을 가지는 Variant를 리턴하기 때문에 꼭 해결이 되어야 되는데..
누구 언질을 주실 고수분 안계시나요....
|