CreateObject

CreateObject

CreateObject是指創建並返回一個對ActiveX對象的引用的函數

基本介紹


語法
CreateObject(class[,servername])
CreateObject函數的語法有如下部分:
部分描述
class必需的;Variant(String).要創建的應用程序名稱和類。
servername可選的;Variant(String).要在其上創建對象的網路伺服器名稱。
class參數使用appname.objecttype這種語法,包括以下部分:
部分描述
appname必需的;Variant(字元串)。提供該對象的應用程序名。
objecttype必需的;Variant(字元串)。待創建對象的類型或類。

說明


每個支持自動化的應用程序都至少提供一種對象類型。例如,一個字處理應用程序可能會提供Application對象,Document對象,以及Toolbar對象。
要創建ActiveX對象,只需將CreateObject返回的對象賦給一個對象變數:
'聲明一個對象變數來存放該對象的引用。
'Dim as Object 採用後期綁定方式。
Dim ExcelSheet As Object
Set ExcelSheet = CreateObject("Excel.Sheet")
上述代碼將啟動該應用程序創建該對象,在本例中就是創建一個Microsoft Excel電子數據表。對象創建后,就可以在代碼中使用自定義的對象變數來引用該對象。在下面的示例中,可以使用對象變數ExcelSheet來訪問新建對象的屬性和方法,以及訪問Microsoft Excel的其它對象,包括應用程序對象和單元格集合。
'設置Application對象使Excel可見
ExcelSheet.Application.Visible = True
'在表格的第一個單元中寫些文本
ExcelSheet.Cells(1,1).Value = "This is column A, row 1"
'將該表格保存到C:\test.doc目錄
ExcelSheet.SaveAs"C:\TEST.DOC"
'使用應用程序對象的Quit方法關閉Excel。
ExcelSheet.Application.Quit
'釋放該對象變數
Set ExcelSheet = Nothing
使用As Object子句聲明對象變數,可以創建一個能包含任何類型對象引用的變數。不過,該變數訪問對象是後期綁定的,也就是說,綁定在程序運行時才進行。要創建一個使用前期綁定方式的對象變數,也就是說,在程序編譯時就完成綁定,則對象變數在聲明時應指定類ID。例如,可以聲明並創建下列Microsoft Excel引用:
Dim xlApp As Excel.Application
Dim xlBook As Excel.Workbook
Dim xlSheet As Excel.WorkSheet
Set xlApp = CreateObject("Excel.Application")
Set xlBook = xlApp.Workbooks.Add
Set xlSheet = xlBook.Worksheets(1)
前期綁定的變數引用可以提供更好的性能,但該變數只能存放聲明中所指定的類的引用。
可以將CreateObject函數返回的對象傳給一個參數為對象的函數。例如,下面的代碼創建並傳遞了一個 Excel.Application對象的引用:
Call MySub (CreateObject("Excel.Application"))
可以在一個遠端連網的計算機上創建一個對象,方法是把計算機的名稱傳遞給CreateObject 的 servername參數。這個名稱與共享名稱的機器名部份相同:對於一個共享名稱為"\\\\MyServer\\Public,"的servername參數是 "MyServer"。
下面的代碼返回在一個名為MyServer的遠端計算機上運行的Excel實例的版本號:
Dim xlApp As Object
Set xlApp = CreateObject("Excel.Application","MyServer")
Debug.Print xlApp.Version
如果遠端伺服器不存在或者不可用,則會發生一個運行時錯誤。
注意當該對象當前沒有實例時,應使用CreateObject。如果該對象已有實例在運行,就會啟動一個新的實例,並創建一個指定類型的對象。要使用當前實例,或要啟動該應用程序並載入一個文件,可以使用GetObject函數。
如果對象已登記為單個實例對象,則不管執行多少次CreateObject,都只能創建該對象的一個實例。

C#調用方式


C#中類似CreateObject的方法就是System.Activator.CreateInstance.後續的對象函數的調用可以通過InvokeMember方法來實現。
如在VB中的源代碼如下:
Public Sub TestLateBind()
Dim o As Object = CreateObject("SomeClass")
o.SomeMethod(arg1, arg2)
w = o.SomeFunction(arg1, arg2)
w = o.SomeGet
o.SomeSet = w
End Sub
轉換成C#的代碼如下所示:
public void TestLateBind()
{
System.Type oType = System.Type.GetTypeFromProgID("SomeClass");
object o = System.Activator.CreateInstance(oType);
oType.InvokeMember("SomeMethod", System.Reflection.BindingFlags.InvokeMethod, null, o, new object[] {arg1, arg2});
w = oType.InvokeMember("SomeFunction", System.Reflection.BindingFlags.InvokeMethod, null, o, new object[] {arg1, arg2});
w = oType.InvokeMember("SomeGet", System.Reflection.BindingFlags.GetProperty, null, o, null);
oType.InvokeMember("SomeSet", System.Reflection.BindingFlags.SetProperty, null, o, new object[] {w});
}
裡面有方法,屬性的調用設定,很簡單。
實際例子如下,調用Office功能的:
public void TestLateBind()
{
System.Type wordType = System.Type.GetTypeFromProgID( "Word.Application" );
Object word = System.Activator.CreateInstance( wordType );
wordType.InvokeMember( "Visible", BindingFlags.SetProperty, null, word, new Object[] { true } );
Object documents = wordType.InvokeMember( "Documents", BindingFlags.GetProperty, null, word, null );
Object document = documents.GetType().InvokeMember( "Add", BindingFlags.InvokeMethod, null, documents, null );
}
這種Activator.CreateInstance方法還可以用來創建實例,並調用某些介面方法。畢竟介面必須要實例才能調用。