2016-09-22 3 views
4

У меня есть приложение для создания окон, созданное в Visual Studio.Создайте dll VB6 с помощью Visual Studio 2015?

Я сослался на 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 community 2015, и я не уверен, как создать эту DLL?

Спасибо за любой совет!

+1

Нам не нужно оставлять этот сайт, чтобы выяснить, что вы спрашиваете. Пожалуйста, включите ** соответствующую информацию ** здесь, в свой вопрос. Если контент находится вне сайта и что местоположение вне сайта недоступно (off-line, перемещено (что да, происходит и при MS) или удалено), ваш вопрос не имеет значения для будущих читателей здесь. (И если вы прочитаете сообщение об ошибке, вы увидите, что он ищет VBA.Collection, который не является VB6 - это Visual Basic для приложений, который используется в приложениях Excel, Word и других приложений. VB6 - больше не поддерживаются отдельные IDE и язык.) –

+0

ОК извините Кен! То, что я пытаюсь сделать, - создать проект Visual Basic 6.0 Microsoft ActiveX DLL, который рекомендует статья MS. Но я не понимаю, как это сделать? У меня есть Visual Studio 2015. Спасибо за любой совет. – danieldunn10

+0

Обратите внимание, что в статье говорится о 11-летнем продукте и 18-летнем. Он также даже не говорит, что вы можете использовать VS2005 для создания VB6 DLL – Plutonix

ответ

9

Коллекция coclass - хроническая проблема, Microsoft создала слишком много ее реализаций. И, совершенно неразумно, дал этим реализациям тот же CLSID. Не так ясно, как это пошло так плохо, возможно, одна группа программистов не разговаривает с другой группой. Паршивое решение, с которым они столкнулись, заключалось в том, чтобы заставить всех применять атрибут [noncreatable].

Что мешает вам добавить ссылку на, скажем, vba7.dll, чтобы создать свой собственный объект Collection. Именно поэтому в статье 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

Спасибо Хансу за это замечательное предложение, я нашел что-то подобное и попробовал его, что не сработало. Я пробовал ваше предложение, но получаю эту ошибку - Дополнительная информация: Невозможно наложить объект типа «ClassLibrary2.VBACollection» на тип «VBA.Collection». Спасибо за любой совет! – danieldunn10

+0

Bummer, вращая библиотеку interop, чтобы изменить тип аргумента на тип интерфейса, необходимо. Поговорите со своим руководителем, вам нужна подписка на MSDN. Хорошо иметь. –

+0

Я знаю, что это так расстраивает! это всего лишь небольшая вещь, которую я пытаюсь сделать, которая завершит мой проект и станет отличным приложением для всех, поскольку оно связывает две наши системы вместе и экономит много времени. Я говорил с моим руководителем, но не могу позволить себе подписку на MSDN. Есть ли способ помочь мне создать небольшую dll в статье MS? Я был бы так благодарен! Спасибо – danieldunn10