import win.ui; /*DSG{{*/ var winform = win.form(text="aardio + bat";right=759;bottom=469;parent=...) winform.add() /*}}*/ import web.form; var wb = web.form( winform,5/*_UIFLAG_DIALOG*/|4/*_UIFLAG_NO3DBORDER*/ | 8/*_UIFLAG_SCROLL_NO*/); wb.noScriptErr = true; wb.html = /** ActiveX EXE ActiveX EXE 用于创建进程外 COM 控件。 可在其他支持 COM 控件的编程环境嵌入、调用 aardio 编写的 ActiveX 控件。 请在下面输入 COM 控件类名(ProgID): COM 控件类库: /lib/aardioTestControl/Sample.aardio 只要在 aardio 用户类库 aardioTestControl.Sample 中 简单地添加接口函数就可以,没有任何复杂步骤。 使用向导生成的默认 COM 类型库(typelib)就可以。 不需要学习复杂的 ODL 语法。 双击运行发布后的 EXE 可自动注册、卸载 COM 控件。 **/ winform.getTemplatePath = function(){ return io.fullpath("/template/plus/ActiveX/") } import win.guid; winform.onProjectCreated = function(projectDir,pathMain){ var progId = wb.getEle("progId").value; var libName,className = string.match(progId,"(\w+)\.(\w+)"); if(!libName) libName = "aardioTestControl"; if(!className) className = "aardioTestControl"; var idl = /****************************** ?>import "aardio.idl"; [ uuid(), version(1.0) ] library { importlib("stdole32.tlb"); [ uuid() ] dispinterface IDispatchExecutableWithEvent { properties: methods: /* VB 不支持后期绑定事件接口, 可将下面的 IDispatchExecutableEvent 换为 IDispatchExecutableWithEvent 。 并在下面明确添加接口函数。 如果不会写,可以在 AI 助手中右键发送 ActiveX 开发文档,让 AI 写。 详细说明要添加的函数参数类型就可以。 注意下面的 id(DISPID) 不要小于等于 0 也不要大于 10000。 */ [ id(10) ] void onHello( [in] BSTR str ); }; [ uuid() ] dispinterface IDispatchSample { properties: methods: /* 输出参数必须是声明为 [in,out] VARIANT * paramName, 并在实现接口的 aardio 函数的返回值列表中增加对应的输出参数。 */ [ id(10) ] void TestOutParams( [in] BSTR str,[in,out] VARIANT *out1,[in,out] VARIANT *out2); //dispinterface 接口不能继承,有需要可以到 /.build/aardio.idl 中复制 IDispatchExecutable 的定义。 }; [ uuid(),control ] coclass { //默认接口 [default] dispinterface IDispatchExecutable; //默认事件源接口 [default,source] dispinterface IDispatchExecutableEvent; }; }; ******************************/ var idl = string.loadcode(idl,{ libName = libName; className = className }) string.save(io.joinpath(projectDir,"/typelib/typelib.odl"),..string.crlf(idl) ); var path = io.joinpath(projectDir,"\lib\aardioTestControl\Sample.aardio"); fsys.replace(path,"@${COLIBRARY_PATH}",libName); fsys.replace(path,"@${COCLASS_NAME}",className); fsys.rename(path,fsys.path.replaceFile(path,className + ".aardio")); var path = io.joinpath(projectDir,"\lib\aardioTestControl\SampleForm.aardio"); fsys.replace(path,"@${COLIBRARY_PATH}",libName); fsys.replace(path,"@${COCLASS_NAME}",className); fsys.rename(path,fsys.path.replaceFile(path,className + "Form.aardio")); var path = io.joinpath(projectDir,"\lib\aardioTestControl"); fsys.rename(path,fsys.path.replaceFile(path,libName)); var path = io.joinpath(projectDir,"\test\test.aardio"); fsys.replace(path,"@${COLIBRARY_PATH}",libName); fsys.replace(path,"@${COCLASS_NAME}",className); var path = io.joinpath(projectDir,"\test\test.vbs"); fsys.replace(path,"@${COLIBRARY_PATH}",libName); fsys.replace(path,"@${COCLASS_NAME}",className); var path = io.joinpath(projectDir,"\test\test.ps1"); fsys.replace(path,"@${COLIBRARY_PATH}",libName); fsys.replace(path,"@${COCLASS_NAME}",className); var path = io.joinpath(projectDir,"\test\test.lsp"); fsys.replace(path,"@${COLIBRARY_PATH}",libName); fsys.replace(path,"@${COCLASS_NAME}",className); var path = io.joinpath(projectDir,"\test\net.aardio"); fsys.replace(path,"@${COLIBRARY_PATH}",libName); fsys.replace(path,"@${COCLASS_NAME}",className); var path = io.joinpath(projectDir,"\test\vba.swb"); fsys.replace(path,"@${COLIBRARY_PATH}",libName); fsys.replace(path,"@${COCLASS_NAME}",className); var path = io.joinpath(projectDir,"\test\matlab.m"); fsys.replace(path,"@${COLIBRARY_PATH}",libName); fsys.replace(path,"@${COCLASS_NAME}",className); fsys.replace(pathMain,"@${COLIBRARY_PATH}",libName); fsys.replace(pathMain,"@${COCLASS_NAME}",className); } winform.show(true); win.loopMessage(); return winform;