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
関数を初期化する関数が必要です(他のクラスは読み込み専用の結果として初期化関数を表示したくありません)。
ありがとうございます。私はテストスクリプトをsyswow64バージョンのwscriptを使って走らせました。オブジェクトを完全に作成しました(他の場所ではまだバグがありましたが、それを十分簡単に追跡できます)。インターフェースのキーワードをもう少し調べてみましょう(ネストされたTripクラスにもこれが必要でしょう)。 – akc42