Как превратить dll в ocx в VB 6.0?

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

Как превратить dll в ocx в VB 6.0?

Сообщение Moggucci » 11.02.2005 (Пт) 15:57

Среда разработки, в которой я работаю (не VB 6.0) не понимает dll, но понимает ocx.
Как превратить dll в ocx в VB 6.0?

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Сообщение alibek » 11.02.2005 (Пт) 15:58

А чья dll?
Если своя, то легко.
Если не своя, то нужно писать враппер.
Lasciate ogni speranza, voi ch'entrate.

Moggucci
Начинающий
Начинающий
 
Сообщения: 6
Зарегистрирован: 11.02.2005 (Пт) 15:55

Сообщение Moggucci » 11.02.2005 (Пт) 16:06

Есть dll (стороннего производителя) от терминала сбора данных ("штрихера"). У нас ребята легко прицепили ее к 1С. Есть документация с описанием функций. Нам нужно писать враппер? И что это такое (враппер)? Извините, если вопрос глупый, в vb 6.0 мы не сильны.

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Сообщение alibek » 11.02.2005 (Пт) 16:13

Создаешь в VB6 компонент ActiveX.
Компонент ничего своего делать не будет, он просто будет иметь те же методы и свойства, что и требуемая библиотека. И при обращении к этим свойствам он их будет передавать в библиотеку и возвращать ответы.

Например, минимальный враппер для API GetComputerName
Код: Выделить всё
Option Explicit

Private Const MAX_COMPUTERNAME_LENGTH As Long = 31
Private Declare Function apiGetComputerName Lib "kernel32" Alias "GetComputerNameA" (ByVal lpBuffer As String, nSize As Long) As Long

Public Function GetComputerName() As String
Dim buff As String, L As Long
L = MAX_COMPUTERNAME_LENGTH + 1
buff = String$(L, 0)
Call apiGetComputerName(buff, L)
buff = Left$(buff, L)
GetComputerName = buff
End Function


Создаешь ActiveX Control, вставляешь в него этот код, компилируешь и получаешь полученный ocx.

Там вызываешь:
MsgBox UserControl1.GetComputerName
Lasciate ogni speranza, voi ch'entrate.

Moggucci
Начинающий
Начинающий
 
Сообщения: 6
Зарегистрирован: 11.02.2005 (Пт) 15:55

Сообщение Moggucci » 11.02.2005 (Пт) 16:17

Огромное спасибо, сейчас будем пытаться "заворачивать"!

Moggucci
Начинающий
Начинающий
 
Сообщения: 6
Зарегистрирован: 11.02.2005 (Пт) 15:55

Сообщение Moggucci » 11.02.2005 (Пт) 16:34

А как обработать результат, возвращаемый фунцией из dll-ки (а не только параметров), например:

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

Private Declare Function AddDevice Lib "d:\temp\terminals.dll" Alias "AddDeviceA" () As Integer

Public Function MyAddDevice() As Integer
Dim ReturnVal As Integer
Call AddDevice
ReturnVal = ?
MyAddDevice = ReturnVal
End Function

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Сообщение alibek » 11.02.2005 (Пт) 16:48

ReturnVal = AddDevice()

или

Код: Выделить всё
Function MyAddDevice() As Integer
MyAddDevice = AddDevice()
End Function
Lasciate ogni speranza, voi ch'entrate.

Moggucci
Начинающий
Начинающий
 
Сообщения: 6
Зарегистрирован: 11.02.2005 (Пт) 15:55

Сообщение Moggucci » 11.02.2005 (Пт) 17:00

Спасибо, все завернули, ocx зарегистрировали, наша среда видит ocx и ее метод MyAddDevice. Но при вызове функции выдает следующую ошибку:
"Вызов функции MyAddDevice неудачен. Project1 вернул следуещее сообщение: File not found: d:\Temp\terminals.dll".
Но dll'ка в этом каталоге лежит. В чем затык? Можно обращаться таким способом, через путь или надо регистрировать и dll'ку?

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Сообщение alibek » 11.02.2005 (Пт) 17:06

Библиотеку надо ложить в каталог <WINDOWS>\system32, а в декларации не указывать путь.
Lasciate ogni speranza, voi ch'entrate.

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Сообщение alibek » 11.02.2005 (Пт) 17:08

P.S. При перекомпиляции ActiveX будет сгенерирован новый GUID и компонент надо будет перерегистрировать. Или в свойствах проекта указать бинарную совместимость с предыдущей версией.
Lasciate ogni speranza, voi ch'entrate.

Moggucci
Начинающий
Начинающий
 
Сообщения: 6
Зарегистрирован: 11.02.2005 (Пт) 15:55

Сообщение Moggucci » 11.02.2005 (Пт) 17:13

Мы зарегистрировали dll в системе, перекомпилировали ocx. Теперь при вызове метода MyAddDevice выдается ошибка:
Can't find DLL entry point AddDevice in c:\Program Files\Штрих-М\ТСД3.0\Bin\Terminals
В чем затык?

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Сообщение alibek » 11.02.2005 (Пт) 19:27

Для начала, эта функция вызывается из самой обертки?
Затем, скомпилированный ActiveX был зарегистрирован заново?
Lasciate ogni speranza, voi ch'entrate.

Arcanoid
Продвинутый пользователь
Продвинутый пользователь
Аватара пользователя
 
Сообщения: 162
Зарегистрирован: 01.01.2005 (Сб) 15:44

Сообщение Arcanoid » 11.02.2005 (Пт) 22:00

Прога не может найти точку входа в процедуру... я так понимаю?

Можно попробовать следующее: порыться в DLL найти там строку AddDevice и в код ActiveX-компонента в инструкцию Declare после Alias записать полное DLL'евское имя функции (например "?AddDevice@@YGPAUH")


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

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

Сейчас этот форум просматривают: AhrefsBot и гости: 154

    TopList