1 (изменено: Poltergeyst, 2019-04-13 00:08:18)

Тема: Объект 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 требует для своей работы.