VBA (access) и самописная dll

Программирование на Visual Basic for Applications
Kuzmit4
Начинающий
Начинающий
 
Сообщения: 12
Зарегистрирован: 29.05.2007 (Вт) 17:05

VBA (access) и самописная dll

Сообщение Kuzmit4 » 29.05.2007 (Вт) 17:26

Как вызвать в ВБА функции из длл?
Длл писал на VS Basik 2005. Создал проект ClassLibrary следующего содержания:
Код: Выделить всё
Public Class Class1
    Private Function abc(ByVal a As String) As String
        Return (a)
    End Function
End Class


В ВБА пишу вот так:
Код: Выделить всё
Private Declare Function Class1 Lib "c:/ClassLibrary2.dll" Alias "abc" (ByRef a As String) As String


вызов вот так:
Код: Выделить всё
MsgBox (Class1("aaa"))


во время выполнения получаю ошибку:
Run-time error "453"
Can't find DLL entry point abc in c:/ClassLibrary2.dll

Если попытаться прицепить эту длл через Tools - Reference... выскакивает сообщение "Can't add reference to the specifid file"

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 29.05.2007 (Вт) 17:30

VBA не позволяет импортировать .нет-сборки.
Нужно создать COM-библиотеку.
Изображение

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 29.05.2007 (Вт) 17:41

Сначала я просто пробежал глазами пост (как, видимо, и tyomitch).
А потом я его подробно прочитал и пришёл в ужас...

Я не знаю формул синтетических веществ, которые способны заставить написать то, что написано в первом посте. Это уму не постижимо. Его можно рабирать практически посимвольно, наслаждаясь каждой секундой...

Нет, это либо стёб, или я не знаю, как это назвать...
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

anvg
Обычный пользователь
Обычный пользователь
 
Сообщения: 66
Зарегистрирован: 20.05.2007 (Вс) 18:04

Сообщение anvg » 29.05.2007 (Вт) 17:43

Kuzmit4

"c:/ClassLibrary2.dll"
по мимо всего прочего, путь указан неверно, нужно
"c:/ClassLibrary2.dll"
А так, с учётом, что у тебя библиотека классов, то Tools/Reference "Browse" и указываешь свою библиотеку, содаёшь находящиеся там классы и т. д. Только вот объявление класса у тебя не соответствующее. Используй заготовку COM-класса в VS. Останется только прописать GUID

Kuzmit4
Начинающий
Начинающий
 
Сообщения: 12
Зарегистрирован: 29.05.2007 (Вт) 17:05

Сообщение Kuzmit4 » 29.05.2007 (Вт) 18:00

а что в пути указано не верно, я что-то не вижу отличий моего и вашего

Через тулс - референс брауз не хочет присоединять выдает сообщение "Can't add reference to the specifid file"

Можно поподробней что за заготовка COM-класса? и как создать ее?

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 29.05.2007 (Вт) 18:00

anvg писал(а):Kuzmit4

"c:/ClassLibrary2.dll"
по мимо всего прочего, путь указан неверно, нужно
"c:/ClassLibrary2.dll"

Шикарно :roll:
Изображение

anvg
Обычный пользователь
Обычный пользователь
 
Сообщения: 66
Зарегистрирован: 20.05.2007 (Вс) 18:04

Сообщение anvg » 29.05.2007 (Вт) 18:57

Да с путём по запарке вышло не очень :(
"c:\ClassLibrary.dll"
Стандартная заготовка COM-класса вызывается в Project/Add New Item - COM-Class
Код: Выделить всё

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

#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 = "13d98e59-9427-4ea2-ab8a-47da1fb18333"
    Public Const InterfaceId As String = "356aa17f-580d-476f-91c9-ab426a567dd9"
    Public Const EventsId As String = "fb980ee9-4ea0-4f7c-92d8-af7472ea6f4a"
#End Region

    ' 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

End Class

tyomitch
Чем хихикать - так помог бы человеку. Нечего сказать так...

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 29.05.2007 (Вт) 19:18

anvg писал(а):Чем хихикать - так помог бы человеку. Нечего сказать так...

(Оффтоп) в меру своих сил помог, указав, что нужно делать COM-библиотеку, а не обычную ClassLibrary.
VS.net у меня не стоит, так что показать, в какие места тыкать мышой, я не могу.

И вообще не вижу, где бы я в этом топике хихикал. Хоть раз.
Изображение

Kuzmit4
Начинающий
Начинающий
 
Сообщения: 12
Зарегистрирован: 29.05.2007 (Вт) 17:05

Сообщение Kuzmit4 » 30.05.2007 (Ср) 11:00

anvg
tyomitch
Большое спасибо :)
на простенькой функции все получилось.

еще такой вопрос могу ли я в этой библиотеке использовать все доступные функции из VB 2005? Если нет, то как поределить что можно, что нет
к примеру, сейчас хочу попробовать сделать отправку почты.
буду использовать System.Net.Mail.SmtpClient

p.s. не судите строго я тока учусь :roll:


Вернуться в VBA

Кто сейчас на конференции

Сейчас этот форум просматривают: Google-бот и гости: 9

    TopList