Тема: Объект Atomix.LangMF в среде JScript
Удалось выяснить некоторые интересные особенности объекта Atomix.LangMF созданного в среде JScript.
Потребуется установленный LangMF 9.0
ОС WinXP/7
Lang. Jscript
Пользуясь тем, что функции JScript имеют свойства объекта, можно вызывать код JScript из области LangMF, путем непосредственной передачи функции:
sLMFCode=
'<#Module=JScriptfromMF>\n\
Public strStr\n\
Sub Load(cmdstr)\n\
sampleCall_imp("hello script!")\n\
End Sub\n\
<#Module>'
var oLMF = new ActiveXObject("Atomix.LangMF")
oLMF.Script.AddObject("sampleCall_imp", sampleCall)
oLMF.Command(sLMFCode)
oLMF.Reset()
//------------------------------------------------------------------
function sampleCall(text)
{
return WScript.Echo(text)
}
JScript позволяет передавать данные в область LangMF непосредственно, пользуясь объектами Number и String, вместо использования специфических объектов носителей данных, или обходного использования метода FuncRun, для вызова функций с параметрами.
тип String:
var obj = new String
obj.value = 'hello langMf'
sLMFCode=
'<#Module=JScriptfromMF>\n\
Public strStr\n\
Sub Load(cmdstr)\n\
MsgBox sampleObj_imp.value,vbExclamation + vbSystemModal,"oLMF"\n\
End Sub\n\
<#Module>'
var oLMF = new ActiveXObject("Atomix.LangMF")
oLMF.Script.AddObject("sampleObj_imp", obj)
oLMF.Command(sLMFCode)
oLMF.Reset()
тип Number:
var obj = new Number
obj.value = 1234
sLMFCode=
'<#Module=JScriptfromMF>\n\
Public strStr\n\
Sub Load(cmdstr)\n\
End Sub\n\
Function ShowMeNumber()\n\
MsgBox sampleObj_imp.value,vbExclamation + vbSystemModal,"oLMF"\n\
End Function\n\
<#Module>'
var oLMF = new ActiveXObject("Atomix.LangMF")
oLMF.Command(sLMFCode)
oLMF.Script.AddObject("sampleObj_imp", obj)
oLMF.FuncRun("ShowMeNumber",1)
oLMF.Reset()
Также возможна передача объекта-конструктора, содержащего в себе как данные, так и методы, в.т.ч использующие ActiveXCom объекты:
//[Конструирование объекта]
//------------------------------------------------------------------
var obj = new sampleObj
function sampleObj()
{
}
sampleObj.property = 'hello script'
sampleObj.method = function mtd()
{
var wShell=new ActiveXObject('Shell.Application')
wShell.MinimizeAll()
}
//[Внедрение объекта в область LangMf и его активация]
//------------------------------------------------------------------
sLMFCode=
'<#Module=JScriptfromMF>\n\
Public strStr\n\
Sub Load(cmdstr)\n\
MsgBox sampleObj_imp.property,vbExclamation + vbSystemModal,"oLMF"\n\
sampleObj_imp.method\n\
End Sub\n\
<#Module>'
var oLMF = new ActiveXObject("Atomix.LangMF")
oLMF.Script.AddObject("sampleObj_imp", sampleObj)
oLMF.Command(sLMFCode)
oLMF.Reset()
======================================================
Необязательно включать код LangMF в область WSH скрипта, т.к многие функционалы LangMF доступны через метод Command, а обмен данными между JScript и LangMF можно осуществлять с помощью экспорта функций и объектов JScript в область LangMF.
Диалог выбора каталога dlg.js:
var BUFER
var sFolder = new String
var LMF = new ActiveXObject("Atomix.LangMF")
LMF.Command('Sub Load(cmd) \ End Sub')
LMF.Script.AddObject('RCV', Reseiver)
LMF.Script.AddObject('sFolderRef', sFolder)
LMF.Command('RCV(Sys.CDlg.ShowFolder("Выбор каталога", 0, &H10)) /run')
sFolder.Value = BUFER
//Сообщение
LMF.Command( 'Sys.DynApi.CallFunction \
"USER32.DLL", \
"MessageBoxA", \
0, \
"Выбранный каталог:" & vbCRLF & \
sFolderRef.Value, \
"Reply", \
64+4096 /run')
LMF.Reset()
WScript.Quit()
//--------------------------------
function Reseiver(DATA)
{
BUFER = DATA
}
Подобное можно отнести и к VBScript. Диалог выбора каталога dlg.vbs:
Dim FolderPath
Set LMF = CreateObject("Atomix.LangMF")
LMF.Command "Sub Load(cmd) \ End Sub"
LMF.Script.AddObject "MyContext", Me
LMF.Command "MyContext.FolderPath = Sys.CDlg.ShowFolder(""Выбор каталога"", 0, &H10) /run"
LMF.Command( "Sys.DynApi.CallFunction" & _
"""USER32.DLL"", " & _
"""MessageBoxA""," & _
"0," & _
"""Выбранный каталог:"" & vbCRLF & " & _
"MyContext.FolderPath," & _
"""Reply""," & _
"64+4096 /run")
LMF.Reset()
WScript.Quit()
Интересно, что способность [Atomix.LangMF] выполнять код LangMF в другой среде, наследуется от объекта [MSScriptControl] из модуля msscript.ocx, который библиотека LangMF.dll требует для своей работы.