Как выставить переменные из 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.

Другие вопросы по тегам