JS调用COM组件是什么意思

JavaScript011

JS调用COM组件是什么意思,第1张

在js下面直接将function传给这个属性,com组件里面调用这个IDispatch的函数即可。

idl文件,注意onevent1这里。

[plain] view plain copy

import "oaidl.idl"

import "ocidl.idl"

[

object,

uuid(6A6140E8-9356-4FBD-B0FD-04508D336B17),

dual,

nonextensible,

pointer_default(unique)

]

interface IComClassTest : IDispatch{

[id(1)] HRESULT Method1(BSTR arg1)

[propget, id(2), bindable, displaybind] HRESULT onevent1([out, retval] VARIANT* pVal)

[propput, id(2), bindable, displaybind] HRESULT onevent1([in] VARIANT newVal)

}

[

uuid(97157E1C-637C-4962-B069-96E70F572A99),

version(1.0),

]

library ATLProject3Lib

//初始化创建线程 STDMETHODIMP CJSCallBack::Initialize(void) { // TODO: 在此添加实现代码 DWORD dThreadIdm_hThreadHandle = CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)CallJspFunctionThread, this, 0, &dThreadId)return S_OK} //线程函数 UINT CJSCallBack::CallJspFunctionThread(LPVOID param) { CJSCallBack* pCallBack = (CJSCallBack*)paramwhile(m_bRunThread) { while(m_bCallJspFunc) { pCallBack->CallJsFunction()m_bCallJspFunc = FALSE} Sleep(1)} return 0} //设置回调函数 STDMETHODIMP CJSCallBack::SetJsCallbackFunc(VARIANT scriptCallback) { // TODO: 在此添加实现代码 if (scriptCallback.vt == VT_DISPATCH) { m_spCallback = scriptCallback.pdispVal} return S_OK} //调用回调函数 void CJSCallBack::CallJsFunction() { CComVariant avarParams[1]avarParams[0] = m_szDisplay//指定回调函数的参数 DISPPARAMS params = { avarParams, NULL, 1, 0 }if(m_spCallback) { HRESULT hr = m_spCallback->Invoke(0, IID_NULL, LOCALE_USER_DEFAULT, DISPATCH_METHOD, &params, NULL, NULL, NULL)} } //触发调用回调函数 STDMETHODIMP CJSCallBack::Print(BSTR bstrToPrint, LONG lWait) { // TODO: 在此添加实现代码 _bstr_t bsPrint = bstrToPrintchar* szPrint = bsPrintSleep(500)m_szDisplay = "Succeed to Print"HRESULT hr = CallPrintFunction(szPrint)if ( FAILED(hr) ) { m_szDisplay = "Failed to Print"} switch (lWait) { case 0: CallJsFunction()breakcase 1: { m_bCallJspFunc = TRUESleep(30)} breakdefault: break} return S_OK}function TestCallBack() { var obj = new ActiveXObject("CallBackForJs.JSCallBack.1")var result = obj.Initialize()result = obj.SetJsCallbackFunc(printMsg)obj.Print("abc",1)obj.UnInitialize()} function printMsg(msg) { alert(msg)}

js只支持Activex Dll(所谓的com组件).在C#里如下面的方法写.

然后js里注册该控件并调用.

里面有两个方法

Encrypt(string pToEncrypt,string sKey) //加密

Decrypt(string pToDecrypt,string sKey) //解密

然后你这样写代码:

using System

using System.Runtime.InteropServices

namespace 名称空间

{

// 首先建立接口,这个是Com必须使用的

[Guid("61BB24CB-4C2C-40f8-9E13-1AC5E558D56A")]

public interface IEncrypt

{

string Encrypt(string pToEncrypt,string sKey)

string Decrypt(string pToDecrypt,string sKey)

}

// 写接口的实现

[Guid("CB52E990-185E-4448-A7E8-C88ECAD563AB")]

public class 类名称 : IEncrypt

{

public string Encrypt(string pToEncrypt,string sKey)

{

// 复制FAQ加密代码

}

public string Decrypt(string pToDecrypt,string sKey)

{

// 复制FAQ解密代码

}

}

}

然后用vs.net打包成.dll类库文件,假设名称为MyEncrypt.dll

然后用如下工具

regasm MyEnCrypt.dll /tlb:MyEncrypt.tlb

这个.tlb文件就是类型库,可以由vb6和vc++6引用。

注意上面的guid是使用vs.net工具菜单里面的创建guid工具生成的。

还要注意,vs.net自动生成的assemblyinfo.cs文件中必须添加强名称和版本号,因为Com组件需要版本号,不要改动版本号,也不要用vs.net自动的1.*这样的版本号,最好使用

1.1.1.1这样的固定版本,而且必须一次添加,不能多次添加。

regasm后怎样在js里调用?

用你的例子是这样?

var ss = new ActiveXObject("MyEncrypt.类名称")

JS不可以调用普通的Dll动态链接库,但你可以使用new ActiveXObject调用ActiveX DLL,如:

<script>

set z_shell= CreateObject( "WScript.Shell" )

z_shell.Run( "command.com /c mkdir " + "c:\NewDir")

</script>