Страница: 1 | 2 |
Вопрос: Вопросы по написанию DLL
Добавлено: 06.08.05 22:33
Автор вопроса: HACKER
Всем хело!
вопросы...
1) Вот создал я в классмодуле функцию, у ней есть входные параметры, скомпилировал dll, как мне приципить свою dll к другой проге, как запустить нужную мне функцию и передать её параметры.
2) Нужно ли регестрировать в реестре DLL ? Или достаточно её выбрать/прописать ?
3) Могут ли потом мою DLL использовать в других языках программрования?
Заранее спасибо.
Ответы
Всего ответов: 19
Номер ответа: 1
Автор ответа:
DaSharm
ICQ: 780477
Вопросов: 72
Ответов: 1297
Web-сайт:
Профиль | | #1
Добавлено: 06.08.05 23:49
3 вопроса - 3 на уровне едтского сада. Не обижайся, но они ведь глупые...
Стоп, куда прицепить? Внедрить или использовать в своём ВБ прилоджении?
Регистрировать? Конечно нужно, это ведь ActiveX компонент. Прописать? Хм, а ты знаешь что такое регистрация? Это и есть прописывание в реестр ГУИДА, модели сервера и пути к DLL/OCX, т. е. прописать можно, но толку то.....
Без коментариев....
Что такое DLL на ВБ?Это COM сервер в исполнении DLL. А COM он был, есть и будет. И все языки, что поддерживают COM, способны работать с твоей ДЛЛ.
П. С. Подучись теоретически. В жизни любого программиста настает период, когда нужно закинуть практику и открыть книгу.
Номер ответа: 2
Автор ответа:
CyRax
Разработчик Offline Client
ICQ: 204447456
Вопросов: 180
Ответов: 4229
Web-сайт:
Профиль | | #2
Добавлено: 07.08.05 08:48
1. Скорее всего так:
Inst1=CreateObject("PrjName.ClassName"
Вызов: Inst1.Method1([param]), Result=Inst1.Propery1
2. regsvr32 mydll.dll
3. см. 1
Номер ответа: 3
Автор ответа:
DaSharm
ICQ: 780477
Вопросов: 72
Ответов: 1297
Web-сайт:
Профиль | | #3
Добавлено: 07.08.05 12:16
1.
2CyRax: CreateObject не очень хороший вид связывания. Лучше в Project->References выбери нужную DLL и Создавай класс :
2. Я бы предпочел регистрировать самостоятельно, без третьих лиц . Просто вызви функцию саморегистрации, которая есть во всех ActiveX'ах:
hInst = LoadLibrary("C:\yourdll.dll"
hFunc = GetProcAddress(hInst, "llRegisterServer"
CallWindowProc hFunc, 0, 0, 0, 0
FreeLibrary hInst
Номер ответа: 4
Автор ответа:
DaSharm
ICQ: 780477
Вопросов: 72
Ответов: 1297
Web-сайт:
Профиль | | #4
Добавлено: 07.08.05 12:22
А сам CreateObject больше подходит для скриптовых языков потому, что используя этот вид связывания (позднего связывания) невозможно реализовать IDispatch интерфейс и, следственно у тебя не будет событий. Ты сможешь вызывать функции из DLL, но сама DLL не сможет передавать проге евенты типа Command1_Click(). Да и ещё против позднего вида связывания выступает то, что он самый медленный. Но достоинство этого вида лежит в том, что твоя прога не вылетит с ошибкой, если данная ДЛЛ не найдена, ты всегда сможешь контролировать загрузки ДЛЛ.Не удалась CreateObject - забили и поехали дальше без длл, типа того
Номер ответа: 5
Автор ответа:
HACKER
Разработчик Offline Client
Вопросов: 236
Ответов: 8362
Профиль | | #5
Добавлено: 07.08.05 15:34
Глупых вопросов небывает. Я не имел ввиду внедрить, просто использовать мою длл в других (моих же)программах. Прописать я имел ввиду в программе, а не в реестре, с реестром я и сам разберусь. Я добавляю к своей проге DLL через Project->References, но далле тёмный лес... Помойму исходя из других примеров нужно в декларациях её объявить, что-то типа
Private Declare Sub SaveToJpg1 Lib "c:\savtojpg.dll" (ByVal hgd As Long, ByVal FileName As String, _
ByVal Height As Long, ByVal Width As Long)
Есть так, то с параметрами всё ясно, но здесь указан конкретный путь к этой DLL, поэтому я и спрашивал, обязательно ли её нужно через Project->References выбирать. С реестром вопрос снять, будем регестрировать
2 CyRax Мало чё понял, может есть какая нибуть статья, ли др. инфа, или может на примере покажешь?
Номер ответа: 6
Автор ответа:
GSerg
Вопросов: 0
Ответов: 1876
Профиль | | #6
Добавлено: 07.08.05 15:35
DaSharm, ты не поверишь, но позднее связывание целиком основано на IDispatch и невозможно без него.
Кроме того, иногда это единственный выход. Например, если хочешь, чтобы прога работала с любой версией Office, придётся использовать позднее.
Номер ответа: 7
Автор ответа:
GSerg
Вопросов: 0
Ответов: 1876
Профиль | | #7
Добавлено: 07.08.05 15:38
Подключить через references.
Не использовать declare.
Забыть про фактическое местоположение ввиду его неважности.
Потом создавать экземпляры классов библиотеки и вызывать их методы.
Номер ответа: 8
Автор ответа:
DaSharm
ICQ: 780477
Вопросов: 72
Ответов: 1297
Web-сайт:
Профиль | | #8
Добавлено: 07.08.05 17:12
2GSerg: да, я ошибся, просто не то ,Что надо в голову влезло. В действительности динамическое связывание использует IDispatch, и очень активно, от этого и тормоза.
ошибся я в том, что при использовании позднего (динамического) или раннего связывания невозможно реализовать события (или, скажем, невозможно назначить обложки для евентов). Только "очень раннее" связывание даёт нам такую возможность.
Номер ответа: 9
Автор ответа:
Barsik
Разработчик Offline Client
ICQ: 343368641
Вопросов: 17
Ответов: 686
Web-сайт:
Профиль | | #9
Добавлено: 07.08.05 17:44
а не проще ли писать библиотеки на PB?
Номер ответа: 10
Автор ответа:
HACKER
Разработчик Offline Client
Вопросов: 236
Ответов: 8362
Профиль | | #10
Добавлено: 07.08.05 23:19
2 Barsik
В моём случае не проше
2 ALL
Чуваки, мне конечно очень интерестно читать про всякие IDispatch в ваших постах итп итд... Если не сложно, привидите пример какой нибуть dll из одной функции/подпрограммы, и из другого примера вызовите ту подпрограмму передав ей параметры, всё! это всё что мне нужно. Это я конечно наглею, но тогда дайте чё нибуть почитать на русском по этому поводу, разобраться то надо.
Номер ответа: 11
Автор ответа:
GSerg
Вопросов: 0
Ответов: 1876
Профиль | | #11
Добавлено: 08.08.05 04:14
После MSDN читать про то же на русском не хочется.
Библиотека содержит класс, допустим, Global.
В дизайнере этому классу присвоить Instancing: Global multi use.
Воткнуть в класс
add=i1+i2
end function
Скомпилировать.
Подключить к новому проекту.
В новом проекте набрать
Чё не понятно-то?
Номер ответа: 12
Автор ответа:
LamerOnLine
ICQ: 334781088
Вопросов: 108
Ответов: 2822
Профиль | | #12
Добавлено: 08.08.05 10:36
А сам CreateObject больше подходит для скриптовых языков потому, что используя этот вид связывания (позднего связывания) невозможно реализовать IDispatch интерфейс и, следственно у тебя не будет событий.
Отчасти согласен, это по большей части для скриптов, но в тех же скриптах скриптовая машина позволяет отслеживать для таких объектов события.
DaSharm, ты не поверишь, но позднее связывание целиком основано на IDispatch и невозможно без него.
Подозреваю что он имел ввиду IUnknown
Это я конечно наглею, но тогда дайте чё нибуть почитать на русском
Достоевский подойдет? Могу намылить
Если серьезно - открой любой пример и посмотри, их и на этом сайте полно. Естественно, параллельно с теорией.
Кстати, насколько я знаю, Global Multi Use - фича конкретно для VB, в других языках аналога нету.
Освой для начала MultiUse и New. Примеров уйма.
Номер ответа: 13
Автор ответа:
CyRax
Разработчик Offline Client
ICQ: 204447456
Вопросов: 180
Ответов: 4229
Web-сайт:
Профиль | | #13
Добавлено: 08.08.05 12:35
HACKER,
Вообще то это для 1С-ки. Мож в VB и по другому
Номер ответа: 14
Автор ответа:
GSerg
Вопросов: 0
Ответов: 1876
Профиль | | #14
Добавлено: 08.08.05 12:51
Гы, тогда ещё страннее - потому что IUnknown точно есть везде в COM
Скорее всего, он имел в виду IConnectionPoint, через который реализуется механизм событий. Впрочем, события можно заиметь и тут, просто всё то, что VB делает сам, придётся делать руками.
Номер ответа: 15
Автор ответа:
HACKER
Разработчик Offline Client
Вопросов: 236
Ответов: 8362
Профиль | | #15
Добавлено: 08.08.05 12:56
2 GSerg
А когда класс уже скомпилирован в DLL подключаю её через Project->References и??? и чё больше ничё ? тупо вызывать же функцию с dll неполучится, чё то объявить, прописать от это я и спрашиваю