2014-11-15 64 views
1

我正在嘗試這一段時間.. 是否有可能暴露變量和其他事情與主腳本與msscriptcontrol?這種控制的如何從msscriptcontrol中暴露變量?

例如:

set a = createobject("msscriptcontrol.scriptcontrol") 
a.language = "vbscript" 
a.executestatement "ab = 12" 
msgbox a.eval("ab") 

我喜歡做的是使VB6一個ActiveX COM DLL對包括我的VBScript其他腳本。 我以前的做法是:用fso對象讀取文件並執行全局腳本文件的內容。 現在我想把它包裝成一個activeX dll。 這裏的一些僞的VBScript代碼告訴你什麼是我想要當DLL完成來完成:

set include = createObject("scripting.includeFile") 
include.file "c:\test.vbs" 
call sub_in_test_vbs() 

ANNY想法? 我試圖用msscriptcontrol VB6的類內的包括函數來做到這一點,但它不能做「executeGlobal」 和揭露腳本主要的VBScript ...

[編輯:Ekkehard.Horner]

Sub Include(File) 
ExecuteGlobal(CreateObject("SCRIPTING.FILESYSTEMOBJECT").OPENTEXTFILE("FILENAME & ".VBS", 1).READALL & vbNewLine) 
End Sub 

回答

2

如果您想以任何COM(ic)語言編寫組件,並以任何COM(ic)語言使用它們 - 即使沒有註冊 - 然後使用Windows Script Components

更新:

從您的評論

所以有時我分裂大腳本成更小的VBScript的,把 它們放入一個文件夾,並主腳本讀取一切 該文件夾並執行腳本中的內容。在主文件中有 是一個被稱爲「包含」的子文件(請參閱我的問題中的示例),以便我可以在 包含像C++的東西。問題是, 每次我這樣做,我必須寫在 主vbscript相同的「包括」子,所以我想知道如果我可以做一個activeX dll在VB6所以 ,我只能做到這一點:createobject(「等等.INCLUDE「)。包括 ‘文件路徑’...

我假設你的現實世界中的問題是通過在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() 

或(b)把一個Sub 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 Include(File) 
    ExecuteGlobal(CreateObject("SCRIPTING.FILESYSTEMOBJECT").OPENTEXTFILE("FILENAME & ".VBS", 1).READALL & vbNewLine) 
End Sub 

哪一個 - 引用&不考慮名稱錯誤 - 相當於(a)帶有額外的通話開銷。正如無用/臃腫是

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 

(參見here,爲thought進一步食物)

所以把一些努力的一個子include(),在包含的文件有可能的語法錯誤交易的設計,可避免加載相同的模塊不止一次,並提供額外的有效載荷(搜索lib文件夾列表,保證卸載順序,執行初始化/清理等) - 或堅持(a)。 (3)如果要混合使用語言並使用COM的功能,請忘記ExecuteGlobal並使用.wsf和.wsc文件。如果你不知道關於XML的事情,並且......沒有關於wsc文件的經驗以及如何正確註冊它們,那麼你必須學習關於這些奇怪的野獸,最好是通過研究文檔。

+0

Ekkehard.Horner,我不知道關於XML的一件事,我沒有經驗的wsc文件,以及如何正確註冊他們在一個64位筆記本電腦。你可以幫我嗎?我只想爲vbscript做一個小的「include(filepath)」函數,這樣我就可以包含其他腳本。提前致謝!我將用我想放入組件的腳本編輯我的問題。 – Tom

1

腳本控件可以訪問你的程序的東西,特別是對象。

它的幫助文件應該在System32文件夾中帶有Reference,一些基本概念信息和一些小樣本。


使運行時功能可用於腳本引擎。

語法

ScriptControl.AddObject(name, object[, addMembers]) 

AddObject方法具有以下幾個部分:

部分描述

名稱必需。 ScriptControl代碼中已知添加對象的名稱。

object必需。運行時暴露的對象的名稱。

addMembers可選。布爾值。如果對象的成員全局可訪問,則爲true;如果不是,則爲假。

備註

使用AddObject方法,使運行時的功能提供給腳本引擎。 AddObject方法使ScriptControl用戶能夠向腳本代碼提供一組名稱/對象。腳本引擎可以以任何方式公開名稱。在VBScript和JScript中,每個名稱都顯示爲全局可訪問的名稱。

+0

感謝您的快速回復:)但我想將代碼暴露給腳本本身,而不是ScriptControl。我想在腳本控制裏面編寫一個腳本來執行全局代碼從文件到主腳本......它很難解釋我的意思,對不起這個^^ – Tom

+0

主要的vbscript:新的ScriptControl對象 - >讀取文件並執行的代碼該文件中的內容添加到主要的vbscript中。 – Tom

+0

回答於:@noodlesstillalive – Tom

0

可正常工作,並顯示「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 

注意,這是從VB6 IDE,不是寫在計算器的文本區域實際的代碼。