VBS + DLL???

Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут закрыты.
Читайте требования к создаваемым темам.
Nash
Начинающий
Начинающий
 
Сообщения: 21
Зарегистрирован: 18.07.2002 (Чт) 16:43

VBS + DLL???

Сообщение Nash » 04.06.2005 (Сб) 20:55

Возникла задача средствами VBS подключить DLL и вызывать экспортируемые ею функции, но к сожалению не представляю как это сделать, и инфы. по этому поводу тоже не нашел...
Если у кого-нибудь есть подобный опыт или соображения помогите плиизз!

GM
programador
programador
 
Сообщения: 1427
Зарегистрирован: 24.06.2003 (Вт) 15:56
Откуда: 194.67.52.100

Сообщение GM » 04.06.2005 (Сб) 21:06

Первое что лезит в голову это создать ActiveX оболочку DLL'ки, и потом CreateObject и т.д.
Или этот способ не подходит :?:
الفيجوال بيسك الرابح

Nash
Начинающий
Начинающий
 
Сообщения: 21
Зарегистрирован: 18.07.2002 (Чт) 16:43

Сообщение Nash » 04.06.2005 (Сб) 21:16

Хотелось бы узнать можно ли работать напрямую с DLL без всяких "оберток"???
Но все равно спасибо за совет, надо обдумать насчет ActiveX...

GM
programador
programador
 
Сообщения: 1427
Зарегистрирован: 24.06.2003 (Вт) 15:56
Откуда: 194.67.52.100

Сообщение GM » 04.06.2005 (Сб) 22:13

Хотелось бы узнать можно ли работать напрямую с DLL без всяких "оберток"???

Насколько я знаю в VBS не предосмотрена возможность работы с ДЛЛ, так что напрямую не получиться, прийдется юзать обертку, либо тот же ActiveX который дает возможность вызывать API ф-ции, типа
Код: Выделить всё
Dim API
...
API.CallFunction("user32.dll","BlockInput",true)
الفيجوال بيسك الرابح

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

Сообщение tyomitch » 05.06.2005 (Вс) 22:22

GM писал(а):
Хотелось бы узнать можно ли работать напрямую с DLL без всяких "оберток"???

Насколько я знаю в VBS не предосмотрена возможность работы с ДЛЛ, так что напрямую не получиться, прийдется юзать обертку, либо тот же ActiveX который дает возможность вызывать API ф-ции, типа
Код: Выделить всё
Dim API
...
API.CallFunction("user32.dll","BlockInput",true)

Да-да, у меня такая "универсальная обёртка" даже есть :-)
Сделать её из кода GSerg-а либо Оловянникова (я делал из Оловянникова) - дело пяти минут.
Изображение

Nash
Начинающий
Начинающий
 
Сообщения: 21
Зарегистрирован: 18.07.2002 (Чт) 16:43

Сообщение Nash » 06.06.2005 (Пн) 12:48

Да-да, у меня такая "универсальная обёртка" даже есть
Сделать её из кода GSerg-а либо Оловянникова (я делал из Оловянникова) - дело пяти минут.

А где если не секрет код приведенных тобой людей посмотреть или если не жалко можешь свой кинуть???

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

Сообщение tyomitch » 06.06.2005 (Пн) 15:17

Nash писал(а):
Да-да, у меня такая "универсальная обёртка" даже есть
Сделать её из кода GSerg-а либо Оловянникова (я делал из Оловянникова) - дело пяти минут.

А где если не секрет код приведенных тобой людей посмотреть или если не жалко можешь свой кинуть???

Оловянников: http://vbrussian.com/Examples.asp?ID=46 и http://www.freevbcode.com/ShowCode.Asp?ID=1863
GSerg: http://vbstreets.ru/VB/Articles/66035.aspx
Изображение

Nash
Начинающий
Начинающий
 
Сообщения: 21
Зарегистрирован: 18.07.2002 (Чт) 16:43

Сообщение Nash » 11.06.2005 (Сб) 15:28

Да-да, у меня такая "универсальная обёртка" даже есть
Сделать её из кода GSerg-а либо Оловянникова (я делал из Оловянникова) - дело пяти минут.


А как же насчет минимального набора:
LoadLibrary
GetProcAddress
CallWindowProc

Как тогда из вызывать? Без этих функций же обертка не заработает.
Или я чего-то недопонял?

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

Сообщение GSerg » 11.06.2005 (Сб) 15:38

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

Nash
Начинающий
Начинающий
 
Сообщения: 21
Зарегистрирован: 18.07.2002 (Чт) 16:43

Сообщение Nash » 11.06.2005 (Сб) 15:45

Ну а тогда зачем извращаться с указателями, через ActiveX я любую API смогу вызвать напрямую, я то думал, что этот метод мне поможет прямо из VBS вызвать любую API
Видимо придется делать переходник через ActiveX...

Nash
Начинающий
Начинающий
 
Сообщения: 21
Зарегистрирован: 18.07.2002 (Чт) 16:43

Сообщение Nash » 11.06.2005 (Сб) 17:47

Вообщем сделал я простейшую ActiveX dll :

Код: Выделить всё
Option Explicit

Private Declare Function MessageBox Lib "user32.dll" Alias "MessageBoxW" (ByVal hwnd As Long, ByRef lpText As Byte, ByRef lpCaption As Byte, ByVal wType As Long) As Long

Public Sub MyMsgBox()
    Dim MyText() As Byte
    Dim MyCaption() As Byte
   
    MyCaption = "Hi!" & vbNullChar
    MyText = "Hello World" & vbNullChar
               
    MessageBox 0, MyText(0), MyCaption(0), &H0&
End Sub


Скомпилил ее, получил MyMsg.dll

Сделал скрпт типа:

Код: Выделить всё
Option Explicit

Dim Msg

Set Msg=CreateObject("MyMsg.dll")
Msg.MyMsgBox

WScript.Quit


И нифига - вылетает ошибка при запуске скрипта:
"Невозможно создание объекта контейнером ActiveX: MyMsg.dll"

Может кто знает в чем моя ошибка???

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

Сообщение tyomitch » 11.06.2005 (Сб) 17:56

Nash писал(а):Ну а тогда зачем извращаться с указателями, через ActiveX я любую API смогу вызвать напрямую, я то думал, что этот метод мне поможет прямо из VBS вызвать любую API
Видимо придется делать переходник через ActiveX...

Именно затем и нужны указатели, чтобы вызывать любую API. Если ты будешь вызывать "напрямую", то для каждой новой API придётся писать новую обёртку (или дописывать старую).
Изображение

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

Сообщение tyomitch » 11.06.2005 (Сб) 17:58

Nash писал(а):
Код: Выделить всё
...
Set Msg=CreateObject("MyMsg.dll")
...


И нифига - вылетает ошибка при запуске скрипта:
"Невозможно создание объекта контейнером ActiveX: MyMsg.dll"

Может кто знает в чем моя ошибка???

В ДНК :twisted:

Параметр CreateObject - не имя скомпилированного файла, а ProgID.
Изображение

Nash
Начинающий
Начинающий
 
Сообщения: 21
Зарегистрирован: 18.07.2002 (Чт) 16:43

Сообщение Nash » 11.06.2005 (Сб) 20:05

Параметр CreateObject - не имя скомпилированного файла, а ProgID


Спасиб, не досмотрел....

Nash
Начинающий
Начинающий
 
Сообщения: 21
Зарегистрирован: 18.07.2002 (Чт) 16:43

Сообщение Nash » 11.06.2005 (Сб) 20:17

Именно затем и нужны указатели, чтобы вызывать любую API. Если ты будешь вызывать "напрямую", то для каждой новой API придётся писать новую обёртку (или дописывать старую).


Да оно то понятно, но все равно особых преимуществ не вижу, разве что таблица импорта не будет заполнена вызываемыми API, ну и позновательно для тех, кто не знал про принципы вызова API на низком уровне...

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

Сообщение tyomitch » 11.06.2005 (Сб) 20:24

Nash писал(а):
Именно затем и нужны указатели, чтобы вызывать любую API. Если ты будешь вызывать "напрямую", то для каждой новой API придётся писать новую обёртку (или дописывать старую).


Да оно то понятно, но все равно особых преимуществ не вижу, разве что таблица импорта не будет заполнена вызываемыми API, ну и позновательно для тех, кто не знал про принципы вызова API на низком уровне...

Преимущество - один раз написанная универсальная длл-ка, а не новая для каждой задачи.
Не хочешь - твоё дело.
Изображение


Вернуться в Visual Basic 1–6

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

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

    TopList