Еще раз про OCX - ActiveX Control.

Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут закрыты.
Читайте требования к создаваемым темам.
Mikle
Изобретатель велосипедов
Изобретатель велосипедов
Аватара пользователя
 
Сообщения: 4159
Зарегистрирован: 25.03.2003 (Вт) 14:02
Откуда: Туапсе

Еще раз про OCX - ActiveX Control.

Сообщение Mikle » 30.11.2003 (Вс) 19:18

Скомпилировал свой ActiveXControl. Написал программу с его использованием - все нормально. Переношу программу с OCX на другой компьютер или в другую папку - все работает... если там не WinXP. Перекомпилировал программу в WinXP - заработало, но не работает при переносе в другую папку. OCX в папку Sistem32 не кидал - хочу, чтобы работал из текущей папки. Но в WinXP это не проходит - приложение каким-то образом запоминает абсолютный путь к OCX (или запоминает система, ведь то же приложение, перенесенное в Win98 работает в любой папке, лишь бы OCX был в ней же).
Подскажите, как побороть - ведь существуют программы, хранящие все только в своей папке и работающие без всяких Setup-ов и Install-ов.

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

Сообщение alibek » 01.12.2003 (Пн) 9:51

Попробуй выполнить регистрацию компонента (regsvr32 file.ocx). Если после этого твоя прога будет работать в любой системе, значит причина в этом. Чтобы регистрировать компонент с помощью самой программы, используй API DllRegisterServer
Вот код из API-Guide
Код: Выделить всё
' Add 2 Commandbuttons and a textbox to the form, and paste this code into the form
Option Explicit

Private Declare Function FreeLibrary Lib "kernel32" (ByVal hLibModule As Long) As Long
Private Declare Function LoadLibrary Lib "kernel32" Alias "LoadLibraryA" (ByVal lpLibFileName As String) As Long
Private Declare Function GetProcAddress Lib "kernel32" (ByVal hModule As Long, ByVal lpProcName As String) As Long
Private Declare Function CallWindowProc Lib "user32" Alias "CallWindowProcA" (ByVal lpPrevWndFunc As Long, ByVal hWnd As Long, ByVal Msg As Any, ByVal wParam As Any, ByVal lParam As Any) As Long
Private Const ERROR_SUCCESS = &H0

Private Sub Form_Load()
    Text1.Text = "C:\WINDOWS\SYSTEM\COMCTL32.OCX"
    Command1.Caption = "Register server"
    Command2.Caption = "Unregister server"
End Sub

Private Sub Command1_Click()
    Call RegisterServer(Me.hWnd, Text1.Text, True)
End Sub

Private Sub Command2_Click()
    Call RegisterServer(Me.hWnd, Text1.Text, False)
End Sub

Public Function RegisterServer(hWnd As Long, DllServerPath As String, bRegister As Boolean)
    On Error Resume Next

    'KPD-Team 2000
    'URL: http://www.allapi.net/
    'E-Mail: KPDTeam@Allapi.net
    'We're going to call an API-function, without declaring it!

    ' Modified by G. Kleijer
    ' gkleijer@casema.net
    ' going to call the DllRegisterServer/DllUnRegisterServer API of the specified library.
    ' there's no need to use the Regsvr32.exe anymore.

    ' Make sure the path is correct and that the file exists, otherwise VB will crash.

    Dim lb As Long, pa As Long
    lb = LoadLibrary(DllServerPath)

    If bRegister Then
        pa = GetProcAddress(lb, "DllRegisterServer")
    Else
        pa = GetProcAddress(lb, "DllUnregisterServer")
    End If

    If CallWindowProc(pa, hWnd, ByVal 0&, ByVal 0&, ByVal 0&) = ERROR_SUCCESS Then
        MsgBox IIf(bRegister = True, "Registration", "Unregistration") + " Successful"
   Else
        MsgBox IIf(bRegister = True, "Registration", "Unregistration") + " Unsuccessful"
    End If
    'unmap the library's address
    FreeLibrary lb
End Function
Lasciate ogni speranza, voi ch'entrate.

Mikle
Изобретатель велосипедов
Изобретатель велосипедов
Аватара пользователя
 
Сообщения: 4159
Зарегистрирован: 25.03.2003 (Вт) 14:02
Откуда: Туапсе

Сообщение Mikle » 02.12.2003 (Вт) 11:26

Вставил код в форму, но результата нет - до выполнения кода не доходит, даже если его вставить в Form_Initialise. Тогда добавил модуль, сунул код туда, сделал его стартовым, а после регистрации OCX - запускаю форму - РАБОТАЕТ! Будь это моя прога - меня бы устроило, но я хочу OCX давать людям для использования. Придется прилагать "Инструкцию по эксплуатации".
Неужели со всеми OCX под XP такая проблема?

Amed
Алфизик
Алфизик
 
Сообщения: 5346
Зарегистрирован: 09.03.2003 (Вс) 9:26

Сообщение Amed » 02.12.2003 (Вт) 22:53

По-моему, программа, когда видит ссылку на необходимый ocx, сначала ищет его в своей папке (с exe-файлом), потом в Windows/System32...

У меня, по-моему, этот "алгоритм" работал вполне нормально...

Один раз я впарил свою программу одному человеку и потом полчаса мы с ним вместе её пытались запустить (мы в разных городах, по icq общались) - она писала что-то вроде "Missing mstrayctl.ocx" и не запускалась даже после написания батника вроде
@copy "C:\mstrayctl.ocx" "C:\Windows\system32\mstrayctl.ocx"
regsvr32 mstrayctl.ocx

Windows просто отказывал в регистрации ocx :(
Наконец я предположил, что он сидит под guest'ом, и всё разрешилось - когда он вошёл с админскими правами, всё заработало...

Может, и здесь такая же ботва? :roll:

Mikle
Изобретатель велосипедов
Изобретатель велосипедов
Аватара пользователя
 
Сообщения: 4159
Зарегистрирован: 25.03.2003 (Вт) 14:02
Откуда: Туапсе

Сообщение Mikle » 04.12.2003 (Чт) 10:57

Тут другое. На машине с XP программа запускается, если создать папку и поместить туда OCX в соответствии с путемЮ который был при компиляции. А в 98-Me работает из текущей папки. Может у меня XP глючит?, хотя другие программы работают.
PS. XP-home edition.

serix
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 177
Зарегистрирован: 09.11.2002 (Сб) 17:54
Откуда: Russia

Сообщение serix » 04.12.2003 (Чт) 13:02

Надеюсь я правильно понял проблему. Здесь можно попробовать пользоваться упаковщиками( ну или как там они называются?), типа PEBundle или Fusion, который встраивает ocx или dll в сам exe'шник, а при запуске проги сам копирует запечатанный файл в системную папку и регистрирует.
З.Ы. В дополнение к PEBundle рекомендую юзать PECompact, который все это сжимает...
ZU

Mikle
Изобретатель велосипедов
Изобретатель велосипедов
Аватара пользователя
 
Сообщения: 4159
Зарегистрирован: 25.03.2003 (Вт) 14:02
Откуда: Туапсе

Сообщение Mikle » 04.12.2003 (Чт) 15:08

Не совсем. Я уже писал, что проблема решается регистрацией из отдельного модуля. Но контрол не для моей программы, а для других людей, для многократного использования. Несколько странно снабжать иго инструкцией с требованием регистрировать из модуля либо обязательно пользоваться упаковщиками.
Я провел эксперимент: создал простейший контрол с одним текстбоксом, скомпилировал в OCX, с его использованием сделал простейшую тестовую программу - и выявились все те же проблемы. Может быть при компиляции КОНТРОЛА нужно делать какие-то особые настройки? Попробую провести такой же эксперимент со сторонним OCX.

serix
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 177
Зарегистрирован: 09.11.2002 (Сб) 17:54
Откуда: Russia

Сообщение serix » 04.12.2003 (Чт) 15:51

А что ты имеешь в виду под
...контрол не для моей программы, а для других людей, для многократного использования...
. т.е. контрол, наверное, для программистов, ну тогда что за сложность оставить грязную работу им. По-моему не так трудно написать пару строчек кода для регистрации ocx при запуске программы...
Или я опять не совсем так понял проблеммму :roll: ...
ZU

Mikle
Изобретатель велосипедов
Изобретатель велосипедов
Аватара пользователя
 
Сообщения: 4159
Зарегистрирован: 25.03.2003 (Вт) 14:02
Откуда: Туапсе

Сообщение Mikle » 04.12.2003 (Чт) 15:57

Понял верно. Но у меня подход - лучше работу сделает один человек один раз (я), чем ее будет делать каждый раз каждый программер. Это рационально. Кроме того, если контрол понравится - закажут еще... может быть.

serix
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 177
Зарегистрирован: 09.11.2002 (Сб) 17:54
Откуда: Russia

Сообщение serix » 04.12.2003 (Чт) 17:00

Хм, незнаю, помоему вполне естественно добавлять в программу код для регистрации ocx.
А можно ли добавить такой код в сам ocx, чтоб он сам себя регил?
Это был бы самый реальный вариант. Если конечно он заработает...
ZU


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

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

Сейчас этот форум просматривают: AhrefsBot, Yandex-бот и гости: 6

    TopList