Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > .NET Frameworks (точка нет фреймворки) > Общие вопросы .NET
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 16.10.2012, 18:32   #1
Filosov
 
Регистрация: 16.10.2012
Сообщений: 8
По умолчанию Создать dll для использования в Excel на другом компьютере

Появилась необходимость, свои наработки для excel (vba) запихать в dll.
Windows XP
Office 2010
.NET Framework v4
Visual Studio 2010

В Visual Studio 2010 VB создаю проект:
Проект1
Галочку на : Приложение -> Сведения о сборке -> Сделать сборку видимой для COM
Галочку на : Компиляция -> Регистрация для СОМ-взаимодействия

Создаю пробную dll. В нем пишу:
Код:
Public Class Connect_B52
    Public Function myPlus(ByVal x As Integer, ByVal y As Integer) As Integer
        Return (x + y)
    End Function
End Class
Жму построить проект.
Проект2
Создаю новый проект, чтоб протестировать. В нем, подключаю в источниках данных свою dll_ку и пишу:

Код:
Module Module1
    Sub Main()
        Dim qqq As New Connect_B52
        MsgBox(qqq.myPlus(15, 46))
    End Sub
End Module
Запускаю, все ок, работает.

Проект3
Создаю файл excel, в Tools->References подключаю из проекта_dll файл .tlb
В файле пишу макрос:
Код:
Sub Pr()
Dim qqq As New Connect_B52.Connect_B52
MsgBox (qqq.myPlus(2, 3))
End Sub
Запускаю, все ок, работает.

Теперь переношу на другой комп
Windows XP
Office 2010
.NET Framework v4

файл exe из проекта 2. Вместе с файлом dll из первого проекта. Запускаю, все ок, работает.

Запускаю файл из проекта 3 – на строке MsgBox (qqq.myPlus(2, 3)) выдает: «ActiveX component can't create object»
Пробую regsvr32 test.dll выдает: «dll была загружена,но найти точку входа для DLL Register Server не удалось.Зарегистрировать этот файл невозможно.»

Как заставить работать эту dll в excel другого компьютера?
Filosov вне форума Ответить с цитированием
Старый 17.10.2012, 10:22   #2
eval
Подтвердите свой е-майл
 
Регистрация: 29.08.2012
Сообщений: 4,011
По умолчанию

Так вы СОМ делаете? А где интерфейсы?
И регистрировать его надо regasm-ом.
eval вне форума Ответить с цитированием
Старый 17.10.2012, 14:04   #3
Filosov
 
Регистрация: 16.10.2012
Сообщений: 8
По умолчанию

Спасибо eval.
Regasm – помогло.
Создал батник
Код:
copy Connect_B52.dll C:\WINDOWS\system32
C:\WINDOWS\Microsoft.NET\Framework\v4.0.30319\regasm C:\WINDOWS\system32\Connect_B52.dll /tlb:Connect_B52.tlb
PAUSE
Код:
C:\1>copy Connect_B52.dll C:\WINDOWS\system32
Скопировано файлов:         1.
C:\1>C:\WINDOWS\Microsoft.NET\Framework\v4.0.30319\regasm C:\WINDOWS\system32\Connect_B52.dll /tlb:Connect_B52.tlb
Microsoft (R) .NET Framework Assembly Registration Utility, версия 4.0.30319.1
(C) Корпорация Майкрософт, 1998-2004. Все права защищены.
Типы зарегистрированы успешно
Сборка экспортирована в "C:\WINDOWS\system32\Connect_B52.tlb"; библиотека типов зарегистрирована успешно
C:\1>PAUSE
Для продолжения нажмите любую клавишу . . .
Теперь выполняю exsel макрос
Код:
Sub Pr()
Dim qqq As New Connect_B52.Connect_B52
MsgBox (qqq.myPlus(2, 3))
End Sub
– на строке MsgBox (qqq.myPlus(2, 3)) выдает:
Код:
run-time error '-2147024894 (80070002)'
Это, что за ошибка? Отсутствие файла? Но файл Connect_B52.tlb и Connect_B52.dll имеются в наличии в C:\WINDOWS\system32.
Или это не находит другое? В этом тестовом проекте, смотрю в «обозреватель решений -> Ссылки» Есть только ссылка на System.dll который находится в «C:\Program Files\Reference Assemblies\Microsoft\Framework\.NET Framework\v4.0\System.dll»
Он имеется и на втором компе.
P.S. А что Вы писали про интерфейсы?
Filosov вне форума Ответить с цитированием
Старый 17.10.2012, 14:26   #4
eval
Подтвердите свой е-майл
 
Регистрация: 29.08.2012
Сообщений: 4,011
По умолчанию

пробуйте анрегестрировать и потом опять но добавить в конец - /codebase
т.е.
C:\1>C:\WINDOWS\Microsoft.NET\Frame work\v4.0.30319\regasm C:\WINDOWS\system32\Connect_B52.dll /tlb:Connect_B52.tlb /codebase
eval вне форума Ответить с цитированием
Старый 19.10.2012, 11:53   #5
Filosov
 
Регистрация: 16.10.2012
Сообщений: 8
По умолчанию

Цитата:
Сообщение от eval Посмотреть сообщение
А где интерфейсы?
Спасибо, что отправили в нужном направлении
Все заработало, и на первом и на втором компе, когда сделал вот так:
Код:
ublic Interface ompzb52
    Function myPlus(ByVal x As Integer, ByVal y As Integer) As Integer
    Function myMinus(ByVal x As Integer, ByVal y As Integer) As Integer
End Interface
Public Class Connect_B52
    Implements ompzb52

    Public Function myPlus(ByVal x As Integer, ByVal y As Integer) As Integer Implements ompzb52.myPlus
        Return (x + y)
    End Function

    Public Function myMinus(ByVal x As Integer, ByVal y As Integer) As Integer Implements ompzb52.myMinus
        Return (x - y)
    End Function
End Class
Filosov вне форума Ответить с цитированием
Старый 22.10.2012, 17:08   #6
Filosov
 
Регистрация: 16.10.2012
Сообщений: 8
По умолчанию

С Вашего позволения, прошу еще раз отправить в нужном направлении.
Значит, получилось у меня с 1компа (где есть VS2010) переносить и регистрировать dll файлы.
Теперь возникла еще проблема.
В dll создал процедуру
Код:
 Sub PoluchDostup(ByVal Kuda)
        Dim Dan As New ADODB.Recordset
        Dim Konekt As ADODB.Connection
        ds(0) = "false"
        Set Konekt = CreateObject("ADODB.Connection")
        Konekt.Provider = "Microsoft.Jet.OLEDB.4.0"
        Konekt.ConnectionString = "Jet OLEDB:Database Password=111111;Data Source =\\192.168.0.120\dost$\Ds.mdb"

        On Error GoTo ErrorHandler
        Konekt.Open
        Dan.Open "select * from ddd WHERE Код = " & Kuda & " ;", Konekt
        If Not Dan.EOF Then
            ds(0) = "true"
            ds(1) = Dan.Fields("Server").Value
            ds(2) = Dan.Fields("Adress").Value
            ds(3) = Dan.Fields("Pa").Value
            Dan.MoveNext
        End If
        Dan.Close
        'Dan = Nothing
        Konekt.Close
        'Konekt = Nothing
        Exit Sub
ErrorHandler:  '------------------------ Ошибка Базы данных
        Ohibka = "Ошибка в PoluchDostup. "
        For Each ADOErr In Konekt.Errors
            Ohibka = Ohibka & ADOErr.Number & Chr(13) & ADOErr.Description
        Next
        MsgBox (Ohibka)
        'Dan = Nothing
        'Konekt = Nothing
    End Sub
Для того чтоб это работало, подключаю «Microsoft ActiveX Data Objects 2.8 Library»
Массив и переменную ds обявляю в класе
[code Public Class Connect_B52
Implements ompzb52

Dim ds(0 To 3) As String
Dim Ohibka As String

[/code]
Еще в dll есть функция:
Код:
    Public Function discover(ByVal nn As Integer) As String Implements ompzb52.discover
        Return ds(nn)
    End Function

Теперь тестирую dll
Код:
   Sub Main()

        Dim qqq As New Connect_B52

        qqq.PoluchDostup(1)
        For i = 0 To 3
            MsgBox(qqq. discover (i))
        Next
        Exit Sub
    End Sub
Все хорошо, работает. То есть, четыре сообщения. Которые процедура «PoluchDostup» записала в массив ds.
Но вот при переносе на 2 комп. в функции «PoluchDostup» происходит ошибка. То есть тест выдает четыре сообщения. Первое «true» (ds(0) = "true"), и три пустые. Если же на втором компе в Exsel-е в макросе вставить процедуру «PoluchDostup» и выполнить ее, подключив «Microsoft ActiveX Data Objects 2.8 Library» все проходит хорошо, выдаются нужные данные. Выудил, что на 2 компе ошибка происходит в строке «Dan.Fields("Server").Value»
Из за чего, может, один и тот же код работает в екселевском макросе, а dll нет?

P.S. На обоих компах установлен «IBProvider_free_32_3.0.0.8906_RC4. 2»

Последний раз редактировалось Filosov; 22.10.2012 в 17:11.
Filosov вне форума Ответить с цитированием
Старый 22.10.2012, 17:17   #7
eval
Подтвердите свой е-майл
 
Регистрация: 29.08.2012
Сообщений: 4,011
По умолчанию

Ниче не понятно.
PoluchDostup какая-то странная... точно она в сом-е ?
Все методы которыми хотите пользоваться с наружи должны быть выставлены через интерфейс.
eval вне форума Ответить с цитированием
Старый 23.10.2012, 13:38   #8
Filosov
 
Регистрация: 16.10.2012
Сообщений: 8
По умолчанию

Извиняюсь за путаные объяснения. Попробую снова, кое-чего переделав.
Это код dll:
Код:
 Imports Microsoft.VisualBasic

Public Interface ompzb52
    Function discover(ByVal nn As Integer) As String
    Function discoverErr() As String
    Sub PoluchDostup(ByVal Kuda As Integer, ByVal Otkuda As String)
End Interface

Public Class Connect_B52
    Implements ompzb52

    Dim ds(0 To 3) As String
    Dim Ohibka As String

    Public Function discover(ByVal nn As Integer) As String Implements ompzb52.discover
        Return ds(nn)
    End Function

    Public Function discoverErr() As String Implements ompzb52.discoverErr
        Return Ohibka
    End Function

    Public Sub PoluchDostup(ByVal Kuda As Integer, ByVal Otkuda As String) Implements ompzb52.PoluchDostup
        Dim Dan As New ADODB.Recordset
        Dim Konekt As New ADODB.Connection
        Konekt.Provider = "Microsoft.Jet.OLEDB.4.0"
        Konekt.ConnectionString = "Jet OLEDB:Database Password=111;Data Source =" & Otkuda
        On Error GoTo ErrorHandler
        Konekt.Open()
        Dan.Open("select * from ddd WHERE Код = " & Kuda & " ;", Konekt)
        If Not Dan.EOF Then
            ds(0) = "true"
            ds(1) = Dan.Fields("Server").Value
            ds(2) = Dan.Fields("Adress").Value
            ds(3) = Dan.Fields("Pa").Value
        End If
        Dan.Close()
        Dan = Nothing
        Konekt.Close()
        Konekt = Nothing
        Exit Sub
ErrorHandler:  '------------------------ Ошибка Базы данных
        Ohibka = "Ошибка в PoluchDostup. "
        For Each ADOErr In Konekt.Errors
            Ohibka = Ohibka & ADOErr.Number & Chr(13) & ADOErr.Description
        Next
        MsgBox(Ohibka)
        Dan = Nothing
        Konekt = Nothing
    End Sub
End Class
Для того, чтоб ADODB была доступна я сделал так : Данные –> Добавить новый источник данных –> Объект –> Добавить ссылку –> Вкладка COM –> Microsoft ActiveX Data Objects 2.8 Library. Теперь в dll доступны методы ADODB. Может их как-то по другому нужно подключать???. Построить dll


Теперь код в эксельевском файле такой:
Код:
 Dim ds(0 To 3) As String

Sub Primer()
    Dim qqq As New Connect_B52.Connect_B52
    qqq.PoluchDostup 1, "\\192.168.0.120\dost$\Ds.mdb"
    For i = 0 To 3
        MsgBox (qqq.discover(i))
    Next
End Sub

Sub PrimerExsel()
    For i = 0 To 3
        ds(i) = ""
    Next
    PoluchDostupExsele 1, "\\192.168.0.120\dost$\Ds.mdb"
    For i = 0 To 3
        MsgBox (ds(i))
    Next
End Sub

Sub PoluchDostupExsele(ByVal Kuda As Integer, ByVal Otkuda As String)
    Dim Dan As New ADODB.Recordset
    Dim Konekt As New ADODB.Connection
    ds(0) = "false"
    Konekt.Provider = "Microsoft.Jet.OLEDB.4.0"
    Konekt.ConnectionString = "Jet OLEDB:Database Password=111;Data Source =" & Otkuda

    On Error GoTo ErrorHandler
    Konekt.Open
    Dan.Open "select * from ddd WHERE Код = " & Kuda & " ;", Konekt
    If Not Dan.EOF Then
        ds(0) = "true"
        ds(1) = Dan.Fields("Server").Value
        ds(2) = Dan.Fields("Adress").Value
        ds(3) = Dan.Fields("Pa").Value
    End If
    Dan.Close
    Set Dan = Nothing
    Konekt.Close
    Set Konekt = Nothing
    
    
    Exit Sub
ErrorHandler:  '------------------------ Ошибка Базы данных
    Ohibka = "Ошибка в PoluchDostupExsele. "
    For Each ADOErr In Konekt.Errors
        Ohibka = Ohibka & ADOErr.Number & Chr(13) & ADOErr.Description
    Next
    MsgBox (Ohibka)
    Set Dan = Nothing
    Set Konekt = Nothing
End Sub
Процедура PoluchDostupExsele = PoluchDostup.
Теперь если в ехселе на первом компе запустить процедуры PrimerExsel и Primer выдает одинаковый результат.
Когда же я переношу dll и этот самый excel на 2 комп то: процедура PrimerExsel выдает верный результат. А вот процедура Primer нет, то есть в dll не происходит заполнение массива ds(). Получается внутри модуля ексельфайла тот же код работает а dll нет.
Выдается ошибка: run-time error '-2146233054(80131522)' Не удалось загрузить тип «ADOBB.ErrorsToIntemalErrorsMarshal er»
Если в dll закомментировать
Код:
        'For Each ADOErr In Konekt.Errors
        '    Ohibka = Ohibka & ADOErr.Number & Chr(13) & ADOErr.Description
        'Next
то ошибка происходит в строке ds(1) = Dan.Fields("Server").Value
Узнал я это так: в dll файле вместо:
Код:
            ds(0) = "true"
            ds(1) = Dan.Fields("Server").Value
ds(2) = Dan.Fields("Adress").Value
Сделал:
Код:
            ds(0) = "true"
            Ohibka = "строка 33"
            ds(1) = Dan.Fields("Server").Value
            Ohibka = "строка 35"
ds(2) = Dan.Fields("Adress").Value
перестроить dll -> переношу на другой комп. В Exsel файле запускаю процедуру PrimerExsel. Она выдает : «строка 33Ошибка в PoluchDostup.»
Filosov вне форума Ответить с цитированием
Старый 23.10.2012, 13:40   #9
Filosov
 
Регистрация: 16.10.2012
Сообщений: 8
По умолчанию

Так-как в dll проходят эти строки
Код:
Dim Dan As New ADODB.Recordset
        Dim Konekt As New ADODB.Connection
        Konekt.Provider = "Microsoft.Jet.OLEDB.4.0"
        Konekt.ConnectionString = "Jet OLEDB:Database Password=171819;Data Source =" & Otkuda
        On Error GoTo ErrorHandler
        Konekt.Open()
        Dan.Open("select * from ddd WHERE Код = " & Kuda & " ;", Konekt)
        If Not Dan.EOF Then
И даже строка «If Not Dan.EOF Then» Значит даже «select» прошел. И так как Ohibka =«строка 33Ошибка в PoluchDostup.» значить строка «Ohibka = "строка 33"» выполнялась, а строка «Ohibka = "строка 35"» нет. Значит ошибка в строке «ds(1) = Dan.Fields("Server").Value».

Проблема именно на втором компе. Я посмотрел в References «Microsoft ActiveX Data Objects 2.8 Library» ссылается на файл «msado15.dll» на обоих компьютерах они одинаковые версия файла 2.81.3014.0

На первом компе (где VS2010). Работают даже строки
Код:
        For Each ADOErr In Konekt.Errors
            Ohibka = Ohibka & ADOErr.Number & Chr(13) & ADOErr.Description
        Next
То есть если намерено допустить ошибку Например неправильный путь к файлу.
Код:
    Dim qqq As New Connect_B52.Connect_B52
    qqq.PoluchDostup 1, "\\192.168.0.120\dost$\НеправильныйПуть.mdb"
То Ohibka = "Ошибка в PoluchDostup. -2147467259 Не удается найти файл такой то"
Повторюсь это на первом компе где VS2010

Надеюсь, этот раз понятней получилось )
Filosov вне форума Ответить с цитированием
Старый 23.10.2012, 14:18   #10
eval
Подтвердите свой е-майл
 
Регистрация: 29.08.2012
Сообщений: 4,011
По умолчанию

Цитата:
For Each ADOErr In Konekt.Errors
вот тут можно получить локальную ошибку?
ну т.е. не лезть в Konekt, а просто закэтчить и вывести.
eval вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Не работает программа на другом компьютере MooNDeaR Помощь студентам 6 04.08.2011 19:23
запуск на другом компьютере kaljan775 Общие вопросы C/C++ 3 07.12.2010 15:40
Как создать в Delphi mp3 плеер? Без использования bass.dll. megatronx Помощь студентам 2 10.03.2010 17:15
Что необходимо для выполнения на другом компьютере Sweta Помощь студентам 6 17.11.2009 10:17
Как создать в Дeлфи класс в DLL для использования его в VC++ Dmitriy.Ch Общие вопросы Delphi 0 25.07.2009 08:40