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>