CB6写的COM组件,以C#等语言下能正常调用,JavsScript中不能调用

jhliusoft 2011-08-27 10:51:37
CB6写的COM组件,以C#等语言下能正常调用,JavsScript中不能调用函数。

我用CB6写了一个COM组件,里面只有一个接口,接口下有两个函数,在C#中能正常使用,在IE 采用 JaveScrpt不能正常调用,
class ATL_NO_VTABLE TPACSViewImpl :
public CComObjectRootEx<CComSingleThreadModel>,
public CComCoClass<TPACSViewImpl, &CLSID_PACSView>,
public IDispatchImpl<IPACSView, &IID_IPACSView, &LIBID_iHYPACSView>,
public IObjectSafetyImpl<TPACSViewImpl, INTERFACESAFE_FOR_UNTRUSTED_CALLER | INTERFACESAFE_FOR_UNTRUSTED_DATA>
{
private:
AnsiString m_sPipeName;
private:
void __fastcall WriteServerAddress(BSTR ServerIP, unsigned_short ServerPort);
AnsiString __fastcall encrypt(AnsiString Source, int PinKey);
bool __fastcall OpenPACSImageViewWindow(AnsiString sUserName, AnsiString sUserPw, unsigned_short uRouteID);
bool __fastcall SendImageCommand(AnsiString sCommand);
bool __fastcall CheckPACSImageView();
public:
TPACSViewImpl()
{
//创建命名管道
m_sPipeName = "\\\\.\\Pipe\\ClinicalView";
}

// Data used when registering Object
//
DECLARE_THREADING_MODEL(otApartment);
DECLARE_PROGID("iHYPACSView.PACSView");
DECLARE_DESCRIPTION("GreatPACS ImageView");

// Function invoked to (un)register object
//
static HRESULT WINAPI UpdateRegistry(BOOL bRegister)
{
TTypedComServerRegistrarT<TPACSViewImpl>
regObj(GetObjectCLSID(), GetProgID(), GetDescription());
return regObj.UpdateRegistry(bRegister);
}

BEGIN_CATEGORY_MAP(TPACSViewImpl)
IMPLEMENTED_CATEGORY(CATID_SafeForScripting)
IMPLEMENTED_CATEGORY(CATID_SafeForInitializing)
END_CATEGORY_MAP()

BEGIN_COM_MAP(TPACSViewImpl)
COM_INTERFACE_ENTRY(IPACSView)
COM_INTERFACE_ENTRY2(IDispatch, IPACSView)
COM_INTERFACE_ENTRY(IObjectSafety)
END_COM_MAP()

// IPACSView
public:

STDMETHOD(CloseImageView());
STDMETHOD(OpenImageView(BSTR ServerIP, short ServerPort, BSTR PACSUserName,
BSTR PACSUserPW, short RouteID, long ImageID,
VARIANT_BOOL AddedView));
};

请高手指点一下,我直接在本机注册COM,使用如下代码在IE中运行,对象能创建,调用函数失败。
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"> <html xmlns="http://www.w3.org/1999/xhtml">
<head>
<title>无标题页</title>

<script language="JavaScript" type="text/javascript">

function look()
{
var pacs = null;
pacs = new ActiveXObject("iHYPACSView.PACSView"); //请确保浏览器允许加载该控件。
try {
//pacs.CloseImageView();
pacs.OpenImageView("125.91.214.2", 8701, "9000", "9000", 2, 100, true);
}
catch (e) {
alert("调用函数失败," + e.name + ": " + e.message);
}
}

</script>

</head>
<body>
<a> 查看图像请点击
<input type="button" value="查看图像" onclick="look();" /></a>
</body>
</html>
...全文
195 20 打赏 收藏 转发到动态 举报
写回复
用AI写文章
20 条回复
切换为时间正序
请发表友善的回复…
发表回复
fxworld 2011-09-01
  • 打赏
  • 举报
回复
[Quote=引用 19 楼 borlandsun 的回复:]

哎,我都说了不行了。封成ActiveX就是了~
[/Quote]

没错,肯定需要封成ActiveX。
  • 打赏
  • 举报
回复
[Quote=引用 15 楼 jhliusoft 的回复:]

继承 IDispatch 接口

[
uuid(BB333168-C373-465D-9E64-9FCB35E32F26),
version(3.2),
helpstring("iHYPACSView Library"),
control

]
library iHYPACSView
{

importlib("stdole2.tlb")……
[/Quote]
看这个声明也没啥问题。那就不清楚为啥了
  • 打赏
  • 举报
回复
[Quote=引用 16 楼 borlandsun 的回复:]

呵呵,试过你就知道了。JS支持IDispatch,但是用COM就是会出错。
[/Quote]
我差不多有2年的时间断断续续的写COM,都是js用的,从来没出现你说的问题。
BORLANDSUN 2011-08-30
  • 打赏
  • 举报
回复
哎,我都说了不行了。封成ActiveX就是了~
laowang2 2011-08-29
  • 打赏
  • 举报
回复
[Quote=引用 12 楼 akirya 的回复:]
引用 9 楼 borlandsun 的回复:

这么说吧,JS不支持COM,我在08年和同事做一个模块时亲自试过。你需要把COM包装成ActiveX,然后JS就可以调用了。
所以说我看不起JS,就那么一点点功能,除了能实现几个网页的特效。

只要支持IDispatch就没问题,没必要包装成ActiveX。
[/Quote]
高手。
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 borlandsun 的回复:]

这么说吧,JS不支持COM,我在08年和同事做一个模块时亲自试过。你需要把COM包装成ActiveX,然后JS就可以调用了。
所以说我看不起JS,就那么一点点功能,除了能实现几个网页的特效。
[/Quote]
只要支持IDispatch就没问题,没必要包装成ActiveX。
  • 打赏
  • 举报
回复
贴出你的idl文件
应该是接口声明的不规范。
BORLANDSUN 2011-08-29
  • 打赏
  • 举报
回复
[Quote=引用 12 楼 akirya 的回复:]
引用 9 楼 borlandsun 的回复:

这么说吧,JS不支持COM,我在08年和同事做一个模块时亲自试过。你需要把COM包装成ActiveX,然后JS就可以调用了。
所以说我看不起JS,就那么一点点功能,除了能实现几个网页的特效。

只要支持IDispatch就没问题,没必要包装成ActiveX。
[/Quote]
呵呵,试过你就知道了。JS支持IDispatch,但是用COM就是会出错。
jhliusoft 2011-08-29
  • 打赏
  • 举报
回复
继承 IDispatch 接口

[
uuid(BB333168-C373-465D-9E64-9FCB35E32F26),
version(3.2),
helpstring("iHYPACSView Library"),
control

]
library iHYPACSView
{

importlib("stdole2.tlb");

[
uuid(3B1FCC59-E8DD-4B52-83CB-F10C243BC6DC),
version(3.2),
helpstring("GreatPACS ImageView COM Interface"),
dual,
oleautomation,
replaceable
]
interface IPACSView: IDispatch
{
[
id(0x00000001),
helpstring("Open GreatPACS Image View Window")
]
HRESULT _stdcall OpenImageView([in] BSTR ServerIP, [in] short ServerPort, [in] BSTR PACSUserName, [in] BSTR PACSUserPW, [in] short RouteID, [in] long ImageID, [in] VARIANT_BOOL AddedView );
[
id(0x00000002),
helpstring("Close GreatPACS Image View")
]
HRESULT _stdcall CloseImageView( void );
};

[
uuid(F89BD7B6-50D6-4A22-8AA1-BF7B1110BC2F),
version(3.2),
helpstring("PACSView Object")
]
coclass PACSView
{
[default] interface IPACSView;
};

};
jhliusoft 2011-08-29
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 akirya 的回复:]

贴出你的idl文件
应该是接口声明的不规范。
[/Quote]
IDL 文件如下:
[
uuid(BB333168-C373-465D-9E64-9FCB35E32F26),
version(3.1),
helpstring("iHYPACSView Library"),
control

]
library iHYPACSView
{

importlib("stdole2.tlb");

[
uuid(3B1FCC59-E8DD-4B52-83CB-F10C243BC6DC),
version(1.0),
helpstring("GreatPACS ImageView COM Interface"),
dual,
oleautomation,
replaceable
]
interface IPACSView: IUnknown
{
[
id(0x00000001),
helpstring("Open GreatPACS Image View Window"),
replaceable
]
HRESULT _stdcall OpenImageView([in] BSTR ServerIP, [in] unsigned short ServerPort, [in] BSTR PACSUserName, [in] BSTR PACSUserPW, [in] unsigned short RouteID, [in] long ImageID, [in] VARIANT_BOOL AddedView );
[
id(0x00000002),
helpstring("Close GreatPACS Image View"),
replaceable
]
HRESULT _stdcall CloseImageView( void );
};

[
uuid(F89BD7B6-50D6-4A22-8AA1-BF7B1110BC2F),
version(1.0),
helpstring("PACSView"),
control
]
coclass PACSView
{
[default] interface IPACSView;
};

};
jhliusoft 2011-08-28
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 borlandsun 的回复:]

java script也能称为语言?小孩的玩具也能上大雅之堂?
[/Quote]
任何一种语言都有其优缺点,在不同的应用场合发挥的作用都不一样,一个复杂的系统不可能完全由一种语言开发,综合利用各种语言的优点,才是做系统开发的方向。
BORLANDSUN 2011-08-28
  • 打赏
  • 举报
回复
再补充一点,貌似CB写的ActiveX在JS下有时还是会有点问题,而Delphi写的就可以。
我们当时用的是2007环境。
BORLANDSUN 2011-08-28
  • 打赏
  • 举报
回复
这么说吧,JS不支持COM,我在08年和同事做一个模块时亲自试过。你需要把COM包装成ActiveX,然后JS就可以调用了。
所以说我看不起JS,就那么一点点功能,除了能实现几个网页的特效。
ccrun.com 2011-08-28
  • 打赏
  • 举报
回复
COM组件和文件具体的存放路径没有关系。
这个问题比较专业,最好能找jiangsheng问一下。
zzbinfo 2011-08-28
  • 打赏
  • 举报
回复
不懂js和C#得飘过,楼主可以看看是不是这个com组件得位置在哪,放到windows/system32下试试
BORLANDSUN 2011-08-28
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 jhliusoft 的回复:]
引用 2 楼 borlandsun 的回复:

java script也能称为语言?小孩的玩具也能上大雅之堂?

任何一种语言都有其优缺点,在不同的应用场合发挥的作用都不一样,一个复杂的系统不可能完全由一种语言开发,综合利用各种语言的优点,才是做系统开发的方向。
[/Quote]
有些语言我能看得起,有些语言我看不起。
JAVA我能看得起,VB和JS就是玩具。
BORLANDSUN 2011-08-28
  • 打赏
  • 举报
回复
看不起JS不是十年八年了。
kwer 2011-08-28
  • 打赏
  • 举报
回复
环境的问题吧,换一台干净一点的电脑看看。
BORLANDSUN 2011-08-27
  • 打赏
  • 举报
回复
java script也能称为语言?小孩的玩具也能上大雅之堂?
缘中人 2011-08-27
  • 打赏
  • 举报
回复
不太清楚,c#能调用,说明com没有问题
ie能创建也说明com么有问题,函数调用失败会不会与路径或环境有关系

703

社区成员

发帖
与我相关
我的任务
社区描述
C++ Builder ActiveX/COM/DCOM
社区管理员
  • ActiveX/COM/DCOM社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧