Как выставить переменные из msscriptcontrol?
Я пытаюсь это некоторое время сейчас... можно ли выставить переменные и другие вещи для основного сценария с msscriptcontrol?
Пример этого элемента управления:
set a = createobject("msscriptcontrol.scriptcontrol")
a.language = "vbscript"
a.executestatement "ab = 12"
msgbox a.eval("ab")
что я хотел бы сделать, это сделать ActiveX ComDLL в VB6 для включения других сценариев в моем VBScript. старый способ, которым я это сделал: читать файл с объектом fso и выполнять глобальное содержимое файла сценария. Теперь я хочу, чтобы обернуть это в ActiveX DLL. Вот некоторый псевдо-VBScript-код, чтобы показать вам, что я пытаюсь выполнить, когда DLL завершена:
set include = createObject("scripting.includeFile")
include.file "c:\test.vbs"
call sub_in_test_vbs()
какие-нибудь идеи? Я пытался сделать это с помощью функции include внутри класса vb6 с помощью msscriptcontrol, но он не может выполнить "executeGlobal" и предоставить сценарий основному vbscript...
[РЕДАКТИРОВАТЬ для: Ekkehard.Horner]
Sub Include(File)
ExecuteGlobal(CreateObject("SCRIPTING.FILESYSTEMOBJECT").OPENTEXTFILE("FILENAME & ".VBS", 1).READALL & vbNewLine)
End Sub
3 ответа
Если вы хотите написать COM-компоненты на любом языке COM(ic) и использовать их на любом языке COM(ic) - даже без регистрации - используйте компоненты сценариев Windows.
Обновить:
Из вашего комментария
поэтому иногда я делю большой скрипт на меньшие vbscript, помещаю их в папку и делаю основной скрипт, который читает все в этой папке и выполняет то, что в скриптах. в главном файле есть подпрограмма "include" (см. пример в моем вопросе), чтобы я мог включать файлы, например, в C++ или что-то. проблема заключается в том, что каждый раз, когда я делаю это, мне приходится писать ту же самую подпрограмму "include" в основной vbscript, поэтому я задавался вопросом, могу ли я сделать ActiveX DLL в vb6, чтобы я мог просто сделать это: createobject("blah.include").include "filepath"...
Я предполагаю, что вашей реальной проблемой является повторное использование кода через модули / библиотеки в VBScript. Это может быть достигнуто без накладных расходов MS ScriptControl, vb6 и DLL.
(1) Используйте что-то вроде
Dim gsLibDir : gsLibDir = "M:\lib\kurs0705\"
Dim goFS : Set goFS = CreateObject( "Scripting.FileSystemObject" )
ExecuteGlobal goFS.OpenTextFile( gsLibDir & "BaseLib.vbs" ).ReadAll()
Если весь ваш повторно используемый код находится в BaseLib.vbs (и это было бы, если бы вы не распределяли код по множеству небольших файлов в этой папке только для привилегии "читать все" оттуда), все готово.
(2) Если у вас есть несколько специализированных библиотек (База данных, XML, автоматизация MS Office, автоматизация Libre Office, ...) и вы хотите выбрать из этого набора в соответствии с задачей вашего main.vbs, либо (a) добавьте несколько строк, как
ExecuteGlobal goFS.OpenTextFile( gsLibDir & "XmlLib.vbs" ).ReadAll()
или (б) поставить саб include(suitableparms)
в BaseLib.vbs и назвать его как
includeLibs Array( _
"§LibDir§ReLib.vbs" _
, "§LibDir§TxtManLib.vbs" _
, "§LibDir§ADOConst.vbs" _
, "§LibDir§ADOLib.vbs" _
, "§LibDir§WMILib.vbs" _
, "§LibDir§DNLib.vbs" _
, "§LibDir§XPLLib.vbs" _
)
Конечно, такой Sub должен обеспечивать больше функциональности, чем
Sub Include(File)
ExecuteGlobal(CreateObject("SCRIPTING.FILESYSTEMOBJECT").OPENTEXTFILE("FILENAME & ".VBS", 1).READALL & vbNewLine)
End Sub
Который - за исключением ошибок в кавычках и именах - эквивалентен (а) дополнительным расходам на вызов. Так же, как бесполезный / раздутый
sub includeFile (fSpec)
dim fileSys, file, fileData
set fileSys = createObject ("Scripting.FileSystemObject")
set file = fileSys.openTextFile (fSpec)
fileData = file.readAll ()
file.close
executeGlobal fileData
set file = nothing
set fileSys = nothing
end sub
(ср. здесь, дальнейшая пища для размышлений)
Поэтому приложите некоторые усилия в разработке Sub include()
которая имеет дело с возможными синтаксическими ошибками во включенных файлах, избегает загрузки одного и того же модуля более одного раза и обеспечивает дополнительную полезную нагрузку (поиск в списке папок lib, обеспечение упорядоченной последовательности выгрузки, выполнение инициализации / очистки, ...) - или придерживаться (а).
(3) Если вы хотите смешивать языки и использовать функции COM, забудьте ExecuteGlobal и используйте файлы.wsf и.wsc. Если вы "ничего не знаете о XML и... не имеете опыта работы с файлами wsc и их правильной регистрации", вам придется узнать об этих странных животных, предпочтительно, изучая документы.
Элемент управления сценария может получить доступ к материалам вашей программы, в частности к объектам.
Этот файл справки должен находиться в папке system32 со справочной информацией, некоторой базовой концептуальной информацией и некоторыми небольшими примерами.
Делает функциональность во время выполнения доступной для скриптового движка.
Синтаксис
ScriptControl.AddObject(name, object[, addMembers])
Метод AddObject состоит из следующих частей:
Описание части
имя (обязательно. Имя, под которым добавленный объект должен быть известен в коде ScriptControl.
Обязательный объект. Имя объекта, выставленного во время выполнения.
addMembers Необязательно. Логическое значение True, если члены объекта глобально доступны; Ложь, если нет.
замечания
Используйте метод AddObject, чтобы сделать функциональность во время выполнения доступной для механизма сценариев. Метод AddObject позволяет пользователю ScriptControl предоставлять набор пар имя / объект для кода сценария. Скриптовые движки могут раскрывать имя любым способом. И в VBScript, и в JScript каждое имя отображается как глобально доступное имя.
Это работает, как ожидалось, и показывает "12"
Option Explicit
Private m_ab As Variant
Property Let ab(Value As Variant)
m_ab = Value
End Property
Property Set ab(Value As Variant)
Set m_ab = Value
End Property
Private Sub Form_Load()
With CreateObject("MSScriptControl.ScriptControl")
.Language = "VBScript"
.AddObject "__global__", Me, True
.ExecuteStatement "ab = 12"
End With
MsgBox m_ab
End Sub
Обратите внимание, что это фактический код из IDE VB6, а не что-то написанное в текстовой области stackru.