描述:
控件的方法:
方法在头文件中的声明
void GetText(SHORT Index, BSTR* CellText);
方法在实现文件中“调度映射BEGIN_DISPATCH_MAP”部分的定义
DISP_FUNCTION_ID(CYFCtrl, "GetText", dispidGetText, GetText, VT_EMPTY, VTS_I2 VTS_PBSTR)
方法在接口文件中的定义
[id(35), helpstring("方法GetText")] void GetText(SHORT Index, BSTR* CellText);
方法在vbscript中调用如下,出错:“类型不匹配:‘obj.GetText’”
<script language="vbscript">
sub sub1()
dim s
obj.GetText 0, s ’obj是对象名称
msgbox s
end sub
</script>
方法在vb等开发工具中调用没有任何问题。
以下是vb调用,正确执行了。
Dim s As String
Me.Obj.GetText 0, s ’obj是对象名称
MsgBox s
请问各位高手,问题出在那里?怎样解决?
解决方案1:
脚本语言不支持复杂数据类型。复杂数据类型应该被封装为自动化对象,使用其属性、方法来访问里面的数据。
解决方案2: 至于你上面说的,BSTR* CellText,造成无法使用的话(如果是因为指针的话),那么我上面说的表示成字符串的方法似乎又不可行了,其实你不防变通一下,把所有数据表示在一个字符串里面,用分号相隔。
这种解决方案是不是很怪异呢?如果你是搞VB的,非常容易想到的就是这个解决方案了,我也是跟VB人学的。
这个问题,你要和VB人讨论,可能他们告诉你,把所有数据都表示成字符串!
VB人给我的感觉就是没有二进制的概念,这并不是看不起他们,而是他们用得太少了。就像指针一样。
所以,这也算是一种解决方案,但相比于VARIANT,我认为字符串表达方法更慢,所以我不会取它的,我这个人比较看重效率。
从控件中传出来多个参数,考虑到VB、javascript这类语言,所以不能使用指针(他们到底能不能调用带指针的函数,我也不懂,我只懂C语言,网上问也是一部分人说行一部分人说不行)。
所以在我的控件中,我都提供两套函数比如:
BOOL GetValue(float* pv1, float* pv2); //这是给C语言调用的
VARIANT VBGetValue(); //这是给VB调用的
这个时候,VARIANT这种数据类型就发挥作用了,因为它可以表达数组,完全可以把v1,v2放在一个VARIANT里面。
但这样也有个问题,如果v1是float型,v2是double型呢!
总之,一次传出多个参数,不是很好弄。
我也没找到完美的解决方案。
就获取字符串,不用VARIANT,VARIANT这种数据类型速度非常慢,只有非用不可的情况下使用。
你的问题应该这样:
.odl:
[id(29)] BSTR GetUnit(); //29为序号,不定
.h:
afx_msg BSTR GetUnit();
.cpp:
DISP_FUNCTION(CST_CurveCtrl, "GetUnit", GetUnit, VT_BSTR, VTS_NONE)
BSTR CST_CurveCtrl::GetUnit()
{
CString strResult = "something";
return strResult.AllocSysString();
}
这个名字是写控件的时候系统生成的一个名字
这个控件注册的时候注册的ProgID
楼上的方法可行

