Эта идея заключается в следующем.Дабы не таскать с приложениями необходимые контролы(OCX файлы),их можно включить в само приложение,которое потом извлечет эти OCX файлы и сохранит их в директории System32.
Ну например нужно затащить код контрола COMCTL32.OCX(чтобы использовать его функции) в приложение Project1.exe,чтобы потом приложение само извлекло этот контрол и сохранило его.
Для этого поступаем следующим образом
- Код: Выделить всё
Dim code1 As String, code2 As String
Open "C:\VB\Project1.exe" For Binary As #1
code1 = Space$(LOF(1))
Get #1, , code1
Close #1
Open "C:\VB\COMCTL32.OCX" For Binary As #1
code2 = Space$(LOF(1))
Get #1, , code2
Close #1
Open "C:\VB\Project1.exe" For Output As #1
Print #1, code1 & code2
Close #1
Полдела есть,теперь положим код в само приложение для извлечения контрола на уровне инициализации:
- Код: Выделить всё
Private Sub Form_Initialize()
Private Declare Function GetSystemDirectoryA Lib "kernel32" (ByVal lpBuffer As String, ByVal nSize As Long) As Long
Dim fso As Object, sfo As Object
Dim lpBuffer As String, mypath As String
Dim SysDr As String, code1 As String, code2 As String, code3 As String, code4 As String
lpBuffer = Space(260)
If Right(App.path, 1) <> "\" Then
mypath = App.path & "\"
Else
mypath = App.path
End If
Set fso = CreateObject("scripting.filesystemobject")
SysDr = Left$(lpBuffer, GetSystemDirectoryA(lpBuffer, 260))
If fso.FileExists(SysDr & "\" & "COMCTL32.OCX") Then 'Проверяем есть ли уже там этот контрол
Call InitCommonControls
Else 'Если нет, то читаем из конца нашего приложения
Open mypath & App.EXEName & ".exe" For Binary As #1
code1 = Space$(LOF(1))
Get #1, , code1
Close #1
code2 = Right$(code1, 609824 + 2) 'Читаем байты,609824-это размер кода контрола в байтах
Open SysDr & "\" & "COMCTL32.OCX" For Output As #1
Print #1, code2 'Пишем прочтенные байты
Close #1
Call InitCommonControls
End If
End Sub
Все теперь все автоматизированно! Надеюсь,я все правильно изложил и ничо не забыл