如何验证一个被脚本可调用的有效的COM。用VC++2005创建了一个简单的COM. 
用regsvr32注册成功后,用OLE/COM Object viewer 也能看到,也可正确的显示, PROGID = AIOAPI.AIOAPIPACK' one vbs script to check the COM vaild or not
Dim comp
Set comp = CreateObject("AIOAPI.AIOAPIPACK")
Dim t 
t= comp.MyAdd(1,2)
msgbox (t)
' 在第四行,t= comp.MyAdd(1,2), 总是提示错误 Error: Object Required
' 在.NET C#环境下,也能成功引用这个COM的
' 故本人,非常疑惑,怎么才能创建一个被脚本可调用的有效的COM
为提供更多有效信息。 把OLE/COM Object Viewer显示的该COM的相关信息提供如下:
// Generated .IDL file (by the OLE/COM Object Viewer)
// 
// typelib filename: AIOAPI.dll[
  uuid(7C84864E-323A-4B69-9678-2D3E08F056EA),
  version(1.0),
  helpstring("AIOAPI 1.0 Type Library")
]
library AIOAPILib
{
    // TLib :     // TLib : OLE Automation : {00020430-0000-0000-C000-000000000046}
    importlib("stdole2.tlb");    // Forward declare all types defined in this typelib
    interface IAIOAPIPACK;    [
      uuid(B14547DB-2036-4E0D-8DD5-57889008E42F),
      helpstring("AIOAPIPACK Class")
    ]
    coclass AIOAPIPACK {
        [default] interface IAIOAPIPACK;
    };    [
      odl,
      uuid(D6C63600-B675-4742-A6A8-EEA134EC5BB6),
      helpstring("IAIOAPIPACK Interface")
    ]
    interface IAIOAPIPACK : IUnknown {
        [helpstring("method MyAdd")]
        HRESULT _stdcall MyAdd(
                        unsigned short n1, 
                        unsigned short n2, 
                        [out, retval] unsigned short* n3);
        [helpstring("method TA_Init")]
        HRESULT _stdcall TA_Init(
                        char* IP, 
                        short port, 
                        unsigned short SysCode, 
                        unsigned short TerminalNo, 
                        VARIANT_BOOL* ProxyOffline, 
                        unsigned long* MaxJnl);
    };
};

解决方案 »

  1.   

    由于脚本语言支持的参数类型比较少.所以参数类型有很大限制,
    out属性必须和retval一起出现.MyAdd参数应该为
    应该改为
    [in]long n1,
    [in]long n2
    [out,retval]long* n3TA_Init参数应该为
    [in]BSTR IP,  
    [in]long port,  
    [in]long SysCode,  
    [in]long TerminalNo,  
    [in]VARIANT_BOOL ProxyOffline,  
    [out,retval]long* MaxJnl
    要是有两个返回值的话,就必须再返回一个对象,这个对象包含了两个返回值.
      

  2.   

    用记下方法试试   
      1.将调用控件方法的SCRIPT写在一个函数中如:   
      <SCRIPT   LANGUAGE="JAVASCRIPT">   
      function   init()   
      {   
              var   ctrl   =   document.all("你COM的ID");   
              ctrl.方法();   
      }   
      </SCRIPT>   
        
      2.在<body>标签中加入OnLoad="setTimeout('init()',10"   
      如<body   OnLoad="setTimeout('init()',10)">   
        
      我也碰到过类似的问题,我就是用该方法解决的
      

  3.   

    to:楼上
    用你的Javascript我得到如下报错。
    Error:'null' is null or not an object看样子,你JS脚本的测试结果和我VBS测试结果(错误 Error: Object Required)是一样的。
    创建对象失败!!!
      

  4.   

    漏了一点
    不能通过函数的参数向JS or VBS传递内容.
      

  5.   

    你接口继承自IUnknown,而VBScript支持的对象必须继承自IDispatch
      

  6.   

    脚本可调用的接口必须从IDispatch继承,你的接口是从IUnknown继承的,所以CreateObject就已经出错了,返回的对象会是空。