2016-09-22 49 views
4

我有一個在Visual Studio中創建的窗體應用程序。使用Visual Studio 2015創建一個VB6 dll?

我已經引用的COM API,我試圖運行此

L_RESULT = Visualfiles.SystemScript("HIST-TEL", sampleVisualBasicColl, "") 

第二個參數需要蜜蜂的集合,所以我創造了這個

Dim sampleVisualBasicColl As New Microsoft.VisualBasic.Collection() 

    Dim item1, item2, item3, item4 As String 
    item1 = "Items" 
    item2 = "In" 
    item3 = "A" 
    item4 = "Collection" 
    sampleVisualBasicColl.Add(item1, "firstkey") 
    sampleVisualBasicColl.Add(item2, "secondkey") 
    sampleVisualBasicColl.Add(item3, "thirdkey") 
    sampleVisualBasicColl.Add(item4, "fourthkey") 

但我得到的錯誤是這個

無法轉換類型「Microsoft.VisualBasic.Collection」的目的爲類型「VBA.Collection」。

我發現這篇文章,我認爲這將有助於 - https://support.microsoft.com/en-gb/kb/323737

但是我怎麼完成1-4步?

我的Visual Studio 2015年的社區,我不知道如何創建這個dll?

感謝您的任何建議!

+1

我們不應該離開這個網站去弄清楚你在問什麼。請在您的問題本身中包含**相關信息**。如果內容不在現場,並且該非現場位置不可用(脫機,移動(是的,也發生在MS上)或刪除),那麼您的問題對於未來的讀者來說沒有任何價值。 (如果你閱讀錯誤信息,你會發現它正在尋找一個VBA.Collection,它不是VB6--它是用於Excel,Word和其他Office應用程序的Visual Basic for Applications。VB6是一箇舊的,不再支持單獨的IDE和語言。) –

+0

好的抱歉肯!我想要做的是創建一個MS文章建議我創建一個Visual Basic 6.0 Microsoft ActiveX DLL項目。但我不明白如何做到這一點?我有Visual Studio 2015.感謝您的任何建議。 – danieldunn10

+0

請注意,該文章談論的是11歲的產品和18歲的產品。它甚至沒有說你可以使用VS2005來創建VB6 DLL – Plutonix

回答

9

收集組件類是一種慢性的麻煩製造者,微軟創建了它太多的實現。而且,相當不明智的是,給了那些實現相同的CLSID。不清楚這是如何嚴重錯誤的,可能是一組程序員不與另一個組織談話。他們提出的糟糕的解決方案是強制每個人應用[noncreatable]屬性。

這阻止你添加一個參考,比如,vba7.dll這樣你就可以創建自己的收藏對象。這就是爲什麼KB文章告訴你使用VB6來創建對象的一個​​實例。那麼,呃,18歲是很多狗的生命,今天已經安裝了VB6。您需要MSDN許可證或在Ebay拍賣會上祝好運。

時間得到這個固定的方式,而不是那種糟糕的KB方式。您只需創建Collection對象的默認界面的具體實例即可。按照COM規則,接口的實現永遠不重要。

添加一個新類到您的項目並粘貼此代碼:

Imports System.Runtime.InteropServices 

Namespace VBA  
    <ComVisible(True), Guid("A4C46780-499F-101B-BB78-00AA00383CBB")> 
    Public Interface _Collection 
     <DispId(0)> Function Item(<[In]> ByRef Index As Object) As Object 
     <DispId(1)> Sub Add(<[In]> ByRef Item As Object, ByRef Optional Key As Object = Nothing, 
         ByRef Optional Before As Object = Nothing, 
         ByRef Optional After As Object = Nothing) 
     <DispId(2)> Function Count() As Integer 
     <DispId(3)> Sub Remove(<[In]> ByRef Index As Object) 
     <DispId(-4)> Function _NewEnum() As IEnumerator 
    End Interface 

    '' <ComVisible(True)> 
    <ClassInterface(ClassInterfaceType.None), Guid("A4C4671C-499F-101B-BB78-00AA00383CBB")> 
    Public Class Collection 
     Implements _Collection 
     Private impl As New Microsoft.VisualBasic.Collection 

     Public Sub Add(ByRef Item As Object, ByRef Optional Key As Object = Nothing, ByRef Optional Before As Object = Nothing, ByRef Optional After As Object = Nothing) Implements _Collection.Add 
      impl.Add(Item, CStr(Key), Before, After) 
     End Sub 

     Public Sub Remove(ByRef Index As Object) Implements _Collection.Remove 
      If TypeOf Index Is String Then impl.Remove(CStr(Index)) Else impl.Remove(CInt(Index)) 
     End Sub 

     Public Function Count() As Integer Implements _Collection.Count 
      Return impl.Count 
     End Function 

     Public Function _NewEnum() As IEnumerator Implements _Collection._NewEnum 
      Return impl.GetEnumerator() 
     End Function 

     Public Function Item(ByRef Index As Object) As Object Implements _Collection.Item 
      Return impl(Index) 
     End Function 
    End Class 
End Namespace 

因此,而不是創建一個新的集合對象,現在創建一個新的VBA.Collection對象,以保持該組件高興。我沒有一個很好的方法來測試它,希望它能起作用。

+0

感謝Hans對於這個偉大的建議,我找到了一些類似的東西,然後嘗試一下,它沒有奏效。我已經修好了你的建議,但我得到了這個錯誤 - 附加信息:無法轉換'ClassLibrary2.VBACollection'類型的對象來鍵入'VBA.Collection'。感謝您的任何建議! – danieldunn10

+0

Bummer,篡改互操作庫以將參數類型更改爲接口類型將是必要的。與您的主管交談,您需要訂閱MSDN。很好有。 –

+0

我知道它非常令人沮喪!這只是我正在嘗試完成的一件小事,它將完成我的項目,並將成爲每個人使用的理想應用程序,因爲它將我們的兩個系統連接在一起,並節省大量時間。我已經跟我的主管說過話,但買不起MSDN訂閱。無論如何,你可以幫助我在MS文章中創建小型dll嗎?我會很感激!謝謝 – danieldunn10

相關問題