控件的方法:方法在头文件中的声明
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
请问各位高手,问题出在那里?怎样解决?
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
请问各位高手,问题出在那里?怎样解决?
<script language="vbscript">
sub sub1()
dim s
set obj=CreateObject("yourPro.IyourProObj") '这个改成你的接口标识
On Error Resume Next
if err<>0 then
MsgBox("init error")
else
obj.GetText(0, s) 'obj是对象名称
MsgBox(s)
end if
end sub
</script>
这个控件注册的时候注册的ProgID
这是一个activex控件,不是com自动化对象,您那样写好像不行。期待com技术的牛人啊!
void GetText(SHORT Index, VARIANT* CellText);
方法在实现文件中“调度映射BEGIN_DISPATCH_MAP”部分的定义
DISP_FUNCTION_ID(CYFCtrl, "GetText", dispidGetText, GetText, VT_EMPTY, VTS_I2 VTS_PVARIANT)方法在cpp文件中的实现为:
。。
CellText->VT_BSTR;
CString s = “abc”;
CurSheet->bstrVal = s.AllocSysString();。。
方法在接口文件中的定义
[id(35), helpstring("方法GetText")] void GetText(SHORT Index, VARIANT* CellText);方法在vbscript中调用如下,正确执行了
<script language="vbscript">
sub sub1()
dim s
obj.GetText 0, s ’obj是对象名称
msgbox s
end sub
</script>
你的问题应该这样:
.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();
}
谢谢,您的方法很正确。不过我想通过一个方法一次传递出多个参数,所有才有这个问题。
BOOL GetValue(float* pv1, float* pv2); //这是给C语言调用的
VARIANT VBGetValue(); //这是给VB调用的这个时候,VARIANT这种数据类型就发挥作用了,因为它可以表达数组,完全可以把v1,v2放在一个VARIANT里面。但这样也有个问题,如果v1是float型,v2是double型呢!
总之,一次传出多个参数,不是很好弄。
我也没找到完美的解决方案。
VB人给我的感觉就是没有二进制的概念,这并不是看不起他们,而是他们用得太少了。就像指针一样。所以,这也算是一种解决方案,但相比于VARIANT,我认为字符串表达方法更慢,所以我不会取它的,我这个人比较看重效率。
唉,书到用时方恨少啊,学艺不精。
苍天啊,大地啊,csdn上的大侠啊,就没人能说清楚这个问题吗??谢谢yang79tao()兄!!
我给你留言了,看看。
谢谢谢谢!!
那我用一个方法的若干个出参数返回控件的状态的做法本身是否就比较愚蠢,不能够和脚本语言很好的互动,是这样的吗?另外,我用vs2003新建自动化类向导创建的自动化类及接口,再用向导给它增加方法或属性时,没有选项让我设置参数是 out 或 in,也没有创建只读属性的选项。就像下面的接口:
[ uuid(81B10AC6-0A63-4DBF-9626-E97635D862B8) ]
dispinterface IYFCellRangeInf
{
properties:
[id(1), helpstring("属性 Left")] LONG Left;
[id(2), helpstring("属性 Top")] LONG Top;
methods:
};
该怎么给方法的参数设置out 或 in 属性,给属性设置只读呢?