如何验证一个被脚本可调用的有效的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);
};
};
用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);
};
};
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
要是有两个返回值的话,就必须再返回一个对象,这个对象包含了两个返回值.
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)">
我也碰到过类似的问题,我就是用该方法解决的
用你的Javascript我得到如下报错。
Error:'null' is null or not an object看样子,你JS脚本的测试结果和我VBS测试结果(错误 Error: Object Required)是一样的。
创建对象失败!!!
不能通过函数的参数向JS or VBS传递内容.