控件的方法:方法在头文件中的声明
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.   

    试试下面的方法:
    <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>
      

  2.   

    这个名字是写控件的时候系统生成的一个名字
    这个控件注册的时候注册的ProgID
      

  3.   

    谢谢 huzs_82(cFan.hu) :
    这是一个activex控件,不是com自动化对象,您那样写好像不行。期待com技术的牛人啊!
      

  4.   

    我做了如下修改,可以执行了,但不知其所以然。方法在头文件中的声明为
    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>
      

  5.   

    就获取字符串,不用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();
    }
      

  6.   

    to:yang79tao()
    谢谢,您的方法很正确。不过我想通过一个方法一次传递出多个参数,所有才有这个问题。
      

  7.   

    从控件中传出来多个参数,考虑到VB、javascript这类语言,所以不能使用指针(他们到底能不能调用带指针的函数,我也不懂,我只懂C语言,网上问也是一部分人说行一部分人说不行)。所以在我的控件中,我都提供两套函数比如:
    BOOL GetValue(float* pv1, float* pv2); //这是给C语言调用的
    VARIANT VBGetValue(); //这是给VB调用的这个时候,VARIANT这种数据类型就发挥作用了,因为它可以表达数组,完全可以把v1,v2放在一个VARIANT里面。但这样也有个问题,如果v1是float型,v2是double型呢!
    总之,一次传出多个参数,不是很好弄。
    我也没找到完美的解决方案。
      

  8.   

    这个问题,你要和VB人讨论,可能他们告诉你,把所有数据都表示成字符串!
    VB人给我的感觉就是没有二进制的概念,这并不是看不起他们,而是他们用得太少了。就像指针一样。所以,这也算是一种解决方案,但相比于VARIANT,我认为字符串表达方法更慢,所以我不会取它的,我这个人比较看重效率。
      

  9.   

    至于你上面说的,BSTR* CellText,造成无法使用的话(如果是因为指针的话),那么我上面说的表示成字符串的方法似乎又不可行了,其实你不防变通一下,把所有数据表示在一个字符串里面,用分号相隔。这种解决方案是不是很怪异呢?如果你是搞VB的,非常容易想到的就是这个解决方案了,我也是跟VB人学的。
      

  10.   

    看来只有再写一个自动化对象,将这些需要传递的参数作为其属性,传递这个自动化对象给调用者了。
    唉,书到用时方恨少啊,学艺不精。
    苍天啊,大地啊,csdn上的大侠啊,就没人能说清楚这个问题吗??谢谢yang79tao()兄!!
      

  11.   

    to yrb(老土傻帽)
    我给你留言了,看看。
      

  12.   

    jiangsheng(蒋晟.Net[MVP]) 的到来,本帖蓬荜生辉啊。
    谢谢谢谢!!
    那我用一个方法的若干个出参数返回控件的状态的做法本身是否就比较愚蠢,不能够和脚本语言很好的互动,是这样的吗?另外,我用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 属性,给属性设置只读呢?
      

  13.   

    http://www.mozilla.org/scriptable/faq.html#i4