2011-10-19 13 views
0

VBScriptプログラムから呼び出すことができるVB.NETのVisual Studio(2010)でCOMオブジェクトを作成しようとしています。コマンドライン。Visual Studio 2010でVBScriptから表示されるCOMオブジェクトをコマンドラインから実行すると表示される

ActiveXコンポーネントはオブジェクトを作成できません: 'Hartley.Trips

私は

Option Explicit 
Dim trips 
Dim results 

Set trips = CreateObject("Hartley.Trips") 
Set results = trips.selecttrips(57,now()) 
wscript.echo results.count 

しかし私は何でも、このスクリプトはで失敗...スクリプトのような何かをできるようにしたいですビジュアルスタッドで

COMオブジェクト定義のコアがある...

<ComClass(Trips.ClassId, Trips.InterfaceId, Trips.EventsId)> _ 
Public Class Trips 

#Region "COM GUIDs" 
    ' These GUIDs provide the COM identity for this class 
    ' and its COM interfaces. If you change them, existing 
    ' clients will no longer be able to access the class. 
    Public Const ClassId As String = "75184b72-31e3-4d62-add6-438230d17bc3" 
    Public Const InterfaceId As String = "c020fef9-0425-4200-a2b4-77931c0a6011" 
    Public Const EventsId As String = "4cf93b6e-f554-491b-94bd-5b02c3c6c586" 
#End Region 
    Private Const connStr As String = "redacted" 
    Private dbConnection As SqlClient.SqlConnection 
    Private connectionInitialised As Boolean = False 

    ' A creatable COM class must have a Public Sub New() 
    ' with no parameters, otherwise, the class will not be 
    ' registered in the COM registry and cannot be created 
    ' via CreateObject. 

    Public Sub New() 
     MyBase.New() 
    End Sub 

    Public Class Trip 
     Private myTripID As Integer 
     Private myIsComplete As Boolean 
     Private myStart As DateTime 
     Private myEnd As DateTime 
     Private myHasStarted As Boolean 
     Public Sub New(ByVal iTripID As Integer, ByVal bIsComplete As Boolean, _ 
         ByVal dStart As DateTime, ByVal dEnd As DateTime, _ 
         ByVal bHasStarted As Boolean) 
      myTripID = iTripID 
      myIsComplete = bIsComplete 
      myStart = dStart 
      myEnd = dEnd 
      myHasStarted = bHasStarted 
     End Sub 

     Public ReadOnly Property TripID() As Integer 
      Get 
       Return myTripID 
      End Get 
     End Property 

     Public ReadOnly Property Iscomplete() As Boolean 
      Get 
       Return myIsComplete 
      End Get 
     End Property 

     Public ReadOnly Property StartDate() As DateTime 
      Get 
       Return myStart 
      End Get 
     End Property 

     Public ReadOnly Property EndDate() As DateTime 
      Get 
       Return myEnd 
      End Get 

     End Property 

     Public ReadOnly Property hasStarted() As Boolean 
      Get 
       Return myHasStarted 
      End Get 
     End Property 

    End Class 

    Public Class Results 
     Private mySelectID As Integer 
     Private myTripDay As Date 
     Private myIsDriver As Boolean 
     Private myTripArray As List(Of Trip) 
     Public Sub New(ByVal iSelectID As Integer, dTripDay As Date, _ 
         bIsDriver As Boolean, iCount As Integer) 
      myTripArray = New List(Of Trip) 
      mySelectID = iSelectID 
      myTripDay = dTripDay 
      myIsDriver = bIsDriver 
     End Sub 

     Public ReadOnly Property numTrip() As Integer 
      Get 
       Return myTripArray.Count 
      End Get 
     End Property 

     Public ReadOnly Property SelectID() As Integer 
      Get 
       Return mySelectID 
      End Get 
     End Property 

     Public ReadOnly Property ReportDate() As Date 
      Get 
       Return myTripDay 
      End Get 
     End Property 

     Public ReadOnly Property isDriver() As Boolean 
      Get 
       Return myIsDriver 
      End Get 
     End Property 

     Public ReadOnly Property TripArray() As Array 
      Get 
       Return myTripArray.ToArray 
      End Get 

     End Property 

     Public Sub Add(aTrip As Trip) 
      myTripArray.Add(aTrip) 
     End Sub 
    End Class 

    Public Function SelectTrips(SelectID As Integer, TripDay As Date, _ 
           Optional isDriver As Boolean = False) As Results 
     Dim myTrip As Trip 
     Dim myEndDate As DateTime 
     Dim cmd As SqlClient.SqlCommand 
     Dim rs As SqlClient.SqlDataReader 

     If Not connectionInitialised Then 'If this is first attempt 
      dbConnection = New SqlClient.SqlConnection(connStr) 
      dbConnection.Open() 
      connectionInitialised = True 
     End If 

     'Test Only 
     cmd = New SqlClient.SqlCommand("SELECT * FROM xxx", dbConnection) 
     rs = cmd.ExecuteReader 
     Dim myTrips As New Results(SelectID, TripDay, isDriver, rs.FieldCount - 1) 
     While rs.Read 
      If IsDBNull(rs("Completed")) Then 
       myEndDate = Now() 
      Else 
       myEndDate = rs("completed") 
      End If 
      myTrip = New Trip(rs("runID"), _ 
           IsDBNull(rs("completed")), _ 
           rs("runDate"), _ 
           myEndDate, _ 
           rs("started")) 
      myTrips.Add(myTrip) 
     End While 
     Return (MyTrips) 
    End Function 

End Class 

ioの場合、プロジェクトパラメータはこれを「Hartley」のルート名前空間内にあるものとして指定し、アセンブリ情報には「アセンブリCOMを表示可能にする」がチェックされています。また、キーを生成してプロジェクトに追加しました。

私が "ソリューションをビルド"するとき、Visual Studioをレジストリに書きたいので管理者として実行する必要があります。レジストリを見ると、「Hartley.Trips」のレジストリエントリがあることがわかります。

インターネットを検索するには、これを行う方法がたくさんあります。コマンドラインツールを使用している場合を除いて、すべてを実行しているようです。ここで混乱しているのは、Visual Studio 2010がそれらを実行しているように見えることです。以前のバージョンのVisual Studioに当てはまるすべての指示が与えられていれば、表示されません。私はVisual Studioのコマンドラインからこれらのプログラムを手動で実行しようとしましたが、変更するようには見えませんでした。

だから私は立ち往生しています。それはうまくいきません。なぜなら、スクリプトはオブジェクトを作成することができない理由を非常に誇りに思っています。だから、私は何が間違っているのか、何がうまくいかないのかなどについてもっと知ることができるかについて助言を求めています。

私は、クラス内の組み込みクラスが問題の一部であるのか疑問に思っています。それぞれのクラスを独自のCOMオブジェクトとして別々のトップレベルクラス定義に分けるアセンブリを作成しようとしています。現在パラメータがあるNewのクラスは、New関数を持たなければなりません。Friend関数を初期化する関数が必要です(他のクラスは読み込み専用の結果として初期化関数を表示したくありません)。

答えて

2

COMコンポーネントをテストするいくつかのVB.NETコードを記述します。 CLRははるかに優れたエラーメッセージを生成します。

64ビットオペレーティングシステムでこのような問題が発生します。 IDEは32ビットアプリケーションのCOMコンポーネントのみを登録します。 32ビットスクリプトインタープリタ(c:\ windows \ syswow64 \ wscript.exe)を使用するか、64ビットバージョンのRegasm.exeを実行して、/ codebaseオプションを使用して64ビットアプリケーションのコンポーネントを登録する必要があります。

ネストされたクラスを避けるため、COMには同等のものはありません。 COM可視宣言を宣言する最も自然な方法は、インターフェイスキーワードです。 Resultsクラスのために必要なもの

+0

ありがとうございます。私はテストスクリプトをsyswow64バージョンのwscriptを使って走らせました。オブジェクトを完全に作成しました(他の場所ではまだバグがありましたが、それを十分簡単に​​追跡できます)。インターフェースのキーワードをもう少し調べてみましょう(ネストされたTripクラスにもこれが必要でしょう)。 – akc42