CreateObject函數
CreateObject函數
CreateObject函數是創建和返回對 COM 對象的引用。CreateObject 不能用於在 Visual Basic 中創建類的實例,除非那些類顯示公開為 COM 組件。
Visual Basic 語言參考
CreateObject 函數 (Visual Basic)
Public Shared Function CreateObject( _
ByVal ProgId As String, _
Optional ByVal ServerName As String = "" _
) As Object
CreateObject函數 返回
創建並返回一個對 ActiveX 對象的引用。
語法
CreateObject(class,[servername])
CreateObject 函數的語法有如下部分:
部分 描述
class 必需的; Variant (String). 要創建的應用程序名稱和類。
servername 可選的; Variant (String). 要在其上創建對象的網路伺服器名稱。
class 參數使用 appname.objecttype 這種語法,包括以下部分:
部分 描述
appname 必需的;Variant(字元串)。提供該對象的應用程序名。
objecttype 必需的;Variant(字元串)。待創建對象的類型或類。
示例:
Set connDB = CreateObject("ADODB.Connection")
ProgId
必選。String。要創建的對象的程序 ID。
ServerName
可選。String。將要在其上創建對象的網路伺服器的名稱。如果 ServerName 為空字元串 (""),則使用本地計算機。
異常
異常類型 錯誤號 條件
429
找不到或未提供 ProgId。
- 或 -
ServerName 導致 DnsValidateName 函數失敗,很可能是因為它的長度超過 63 個字元或包含無效字元。
Exception
462
伺服器不可用。
FileNotFoundException
53
不存在指定類型的對象。
如果正在升級使用無結構錯誤處理的 Visual Basic 6.0 應用程序,請參見“錯誤號”一列。(您可以根據 Number 屬性(Err 對象)比較錯誤號。)然而,如果可能,應當考慮用 Visual Basic 的結構化異常處理概述替換這種錯誤控制。
若要創建 COM 組件的實例,請將由 CreateObject 返回的對象賦給一個對象變數:
複製代碼
Sub CreateADODB()
Dim adoApp As Object
adoApp = CreateObject("ADODB.Connection")
End Sub
用於存儲返回對象的對象變數的類型可影響應用程序的性能。通過用 As Object 子句聲明對象變數所創建的變數可以包含對任何對象類型的引用。然而,通過該變數訪問對象是“後期綁定”,即綁定在程序運行時發生。由於包括應用程序性能降低在內的多種原因,應該避免後期綁定。
可以創建一個導致早期綁定的對象變數,即綁定在編譯程序時發生。若要執行此操作,從“項目”菜單上“添加引用”對話框的“COM”選項卡中,為您的對象添加對類型庫的引用。然後聲明對象的特定類型的對象變數。大多數情況下,使用 Dim 語句和主 Interop 程序集來創建對象比使用 CreateObject 函數更為有效。
與非託管代碼交互
另一個問題是 COM 對象使用非託管代碼,即沒有公共語言運行庫優點的代碼。在將 Visual Basic 的託管代碼與來自 COM 的非託管代碼混合時,將涉及到相當程度的複雜性。添加對 COM 對象的引用時,Visual Basic 會搜索該庫的主互操作程序集 (PIA);如果找到一個程序集,就會使用它。如果未找到 PIA,它會創建包含 COM 庫中每個類的本地互操作類的互操作程序集。有關更多信息,請參見 .NET Framework 應用程序中的 COM 互操作性。
通常,您應該儘可能使用強綁定對象和主互操作程序集。下面的示例僅出於演示的目的將 CreateObject 函數用於 Microsoft Office 對象。但是,當與適當的主 Interop 程序集一起使用時,這些對象將更易於使用,並且更加可靠。
在遠程計算機上創建對象
您可以通過將計算機的名稱傳遞到 CreateObject 函數的 ServerName 參數,在遠程網路計算機上創建對象。該名稱與共享名的“計算機名”部分相同。例如,如果共享名是“\\MyServer\Public”,則 ServerName 是“MyServer”。
下面的代碼返回在名為 MyServer 的遠程計算機上運行的 Excel 實例的版本號:
複製代碼
Sub CreateRemoteExcelObj()
Dim xlApp As Object
' Replace string "\\MyServer" with name of the remote computer.
xlApp = CreateObject("Excel.Application", "\\MyServer")
MsgBox(xlApp.Version)
End Sub
如果遠程伺服器名不正確或者不可用,將發生運行時錯誤。
注意
當不存在對象的當前實例時使用 CreateObject。如果對象的實例已經正在運行,則將啟動新的實例並創建指定類型的對象。若要使用當前實例或者啟動應用程序並讓它載入文件,請使用 GetObject 函數。如果對象本身已經註冊為單實例對象,則無論執行多少次 CreateObject,也只創建一個對象實例。
創建 Framework 對象
CreateObject 函數只能用於創建 COM 對象。儘管沒有用於創建 .NET Framework 對象的完全等效機制,但 System 命名空間中的 Activator 包含有一些方法來創建本地或遠程對象。具體而言,CreateInstance 方法或 CreateInstanceFrom 方法很有用。
安全注意
CreateObject 函數需要非託管代碼許可權,這可能會對它在部分信任情況下的執行產生影響。有關更多信息,請參見 SecurityPermission 和代碼訪問許可權。
示例
下面的示例使用 CreateObject 函數來創建 Microsoft Excel 工作表,並將該工作表保存到文件中。若要使用此示例,必須在運行此程序的計算機上安裝 Excel。而且,您必須從“項目”菜單上“添加引用”對話框的“COM”選項卡中添加對類型庫的引用。根據計算機上安裝的 Excel 版本,類型庫的名稱將有所不同。例如,對於 Microsoft Excel 2002,類型庫的名稱為 Microsoft Excel 10.0 Object Library。
Visual Basic 複製代碼
Sub TestExcel()
Dim xlApp As Microsoft.Office.Interop.Excel.Application
Dim xlBook As Microsoft.Office.Interop.Excel.Workbook
Dim xlSheet As Microsoft.Office.Interop.Excel.Worksheet
xlApp = CType(CreateObject("Excel.Application"), _
Microsoft.Office.Interop.Excel.Application)
xlBook = CType(xlApp.Workbooks.Add, _
Microsoft.Office.Interop.Excel.Workbook)
xlSheet = CType(xlBook.Worksheets(1), _
Microsoft.Office.Interop.Excel.Worksheet)
xlSheet.Cells(2, 2) = "This is column B row 2"
' The following statement shows the sheet.
xlSheet.Application.Visible = True
' The following statement saves the sheet to the C:\Test.xls directory.
xlSheet.SaveAs("C:\Test.xls")
' Optionally, you can call xlApp.Quit to close the workbook.
End Sub