我完全不懂VB,所以还请大家原谅!
VC中代码如下:
BOOL CST_CurveCtrl::QueryLegend(long Address, OLE_COLOR FAR* pColor) 
这个函数取出一个OLE_COLOR FAR类型数据放入pColor这个指针所指向的内存中,至于我为什么要这样,因为如果这样的话:
OLE_COLOR CST_CurveCtrl::QueryLegend(long Address),将无法表达函数执行失败时的情况。我老是担心我这个方法不能被VB调用,或者很难被VB调用,于是我增加了下面的方法:
VARIANT CST_CurveCtrl::VBQueryLegend(long Address) 
这个方法如果函数执行失败,则返回的VARIANT是空的,如果成功,则返回的VARIANT就包涵需要的OLE_COLOR(其实就是long)。我想问的问题是,到底需不需要提供VBQueryLegend函数?或者说,我提供的VBQueryLegend函数,有没有为VB使用者提供一些方便?

解决方案 »

  1.   

    建议你将CST_CurveCtrl转换为COM对象,这样对VB使用者来说是最理想的
      

  2.   

    ActiveX就是在COM基础上做出来的,肯定比COM好用,难道还倒退了?
    就算我做成COM,接口仍然是这个样子:
    BOOL CST_CurveCtrl::QueryLegend(long Address, OLE_COLOR FAR* pColor)
    有什么区别吗?
    我还是想问VB调用起来方便吗?
    另外,我还希望我的控件能被脚本语言,比如javascript调用,就算VB能调用
    BOOL CST_CurveCtrl::QueryLegend(long Address, OLE_COLOR FAR* pColor)
    这样的函数,那么javascript能吗?
      

  3.   

    如果是ActiveX控件的话,本身就是COM的应用,没有什么倒退之说,你只要在接口函数中不使用VB不支持的类型即可。因此,你这种写法是可以的。而在网页脚本中,这也是可以调用的。
      

  4.   

    to  supergreenbean 
    请帮我写几句程序,我想知道VB和javascript如何调用我这个函数:BOOL QueryLegend(long Address, OLE_COLOR FAR* pColor)  另外我还有一个特殊要求,就是pColor可以为0,也就是要说,要有两种方法来调用这个接口,比如在VC中:
    方法一:
    if (QueryLegend(100, 0))
        AfxMessaageBox("ok");方法二:
    COLORREF Color;
    if (QueryLegend(100, &Color))
        AfxMessaageBox("ok");谢谢。
      

  5.   

    至于说,我为什么必须要空指针这种情况,是因为我有下面这样的函数:
    short PrintCurve(long Address, double FAR* pBTime, double FAR* pETime);
    打印一段时间内的数据,如果pBTime为0(空指针),则从最小的开始打印,否则从*pBTime开始打印,pETime也一样处理。
    所以我必须要要求,指针必须要能够取到空值,不知道在VB 和javascript里面怎么实现,如何实现。
      

  6.   

    根据你的函数,要传空值的话,只能声明为Long,或者Any,即类型库中的 long,int,或void *
    对vb来说,最安全的方法是定义为按值传递的长整型, 即QueryLegend(long Address, long pColor)。只是调用时需要用VarPtr取得变量地址。Dim lColor As Long
    CST_CurveCtrl.QueryLegend(100, VarPtr(lColor))
    但是,在javascript中,貌似没有取变量地址的操作符,所以采取上面这种方法似乎也是不行的
    除此之外,我觉得还有种方法是将第二个参数设置为可选参数,QueryLegend(long Address, [optional] long pColor)
    用判断第二个参数是否传入的方法来替代空值
      

  7.   

    我用MFC做ActiveX,没有可选参数吧?
    而且,在MFC中,如何才能判断参数有没有传入呢?我搞这么久的VC,还没听说过。只听说过C语言的默认参数,可是在调用的时候,虽然少写了参数,实际上还是每个参数都传入了的。
      

  8.   

    我现在打算要求用户,调用带指针的函数,必须传入合法的指针,比如对于函数:
    BOOL QueryLegend(long Address, OLE_COLOR FAR* pColor)
    方法一: 
    if (QueryLegend(100, 0)) 
        AfxMessaageBox("ok"); 方法二: 
    COLORREF Color; 
    if (QueryLegend(100, &Color)) 
        AfxMessaageBox("ok"); 方法一现在是错误的了,不允许了。那么在javascript里面或者vbscript里面,如果调用QueryLegend函数呢?能否举个例子?
      

  9.   

    COM中的可选参数就是把参数声明为VARIANT,然后在类型库中将其描述为[optional],并通过以下的代码来判断其是否为空参数:
    if (varColor.vt==VT_ERROR && varColor.scode==DISP_E_PARAMNOTFOUND)
      ...parameter is missing;
    网页上使用OBJECT标签将你的控件插入页面
    <OBJECT classid="clsid:你控件的GUID" id="CST_CurveCtrl">
    <PARAM Name="属性1" Value="xxxx">
    ...
    </OBJECT>
    然后
    <script language="vbscript">
    b = CST_CurveCtrl.QueryLegend(100, 129312391)
    </script>
      

  10.   

    你在脚本语言里无法显式地指定null,所以直接传入变量或常量咯<script language="vbscript"> 
    Dim b,myColor
    b = CST_CurveCtrl.QueryLegend(100, myColor) 
    </script>
      

  11.   

    <script language="vbscript">  
    Dim b,myColor 
    b = CST_CurveCtrl.QueryLegend(100, myColor)  
    </script>这么简单就能调用了?
    比VB调用起来还方便?
    能不能给我写一个完整的html文件,我想亲自试试,我除了C之外什么也不懂,不好意思。
    要求如下(VC的,请改成脚本的):
    <script language="vbscript">  
    Dim b,myColor 
    b = CST_CurveCtrl.QueryLegend(100, myColor)  
    if (b)
    {
    CString str;
    str.Format("%X", myColor);
    AfxMessageBox(str);
    }
    </script>
      

  12.   

    以byref 的方式传递Color结构,vb会自动传递结构的首地址,当然结构要声明,参考windows 的api声明写
      

  13.   

    <html>
    <body>
    <OBJECT classid="clsid:你控件的GUID" id="CST_CurveCtrl"> 
    </OBJECT> <script language="vbscript">   
    Dim b,myColor  
    b = CST_CurveCtrl.QueryLegend(100, myColor)   if b<>0 then
     
    dim str
    str=hex(myColor)
    msgbox strend if 
    </script> </body>
    </html>