Попробуй использовать Fusion, хотя и не уверен, что он поможет
Можно поподробнее?
Ты же не ломать его вздумал?
Ни в коем разе) Хотя иногда возникают поразительные эффекты - моя прога для зависания системы СОВЕРШЕННО СЛУЧАЙНО снесла эту самую систему. Два раза... А деструктивного кода она не содержала...
Fusion или VB PowerRack. Если надо могу скинуть - попробуешь (пиши мыло).
Сам тоже пробывал но пришёл к тому, что проект написанный на vb6 требует инсталяции совсеми примочками для корректной работы приложения.
В общём решай сам.
Ну вообще, насколько я присмотрелся к Fusion, он делает обычный екзешник, из которого вытягивает нужные ресурсы. Причем при повторном запуске проги они уже не требуются, так как распаковываются и остаются. Проследил за своей прогой, она активикс вытащила в System, и он там остался....
OCX можно юзать прямо подгружая его в память, наподобие как длл. Регистрация при этом ненужна. Такой способ достаточно сложный, врядли топстартер захочет его заюзать, но всё же выложу для полноты обсасывания вопроса
модуль
Option Explicit
Private Declare Function CallWindowProc Lib "user32" _
Alias "CallWindowProcA" ( _
ByVal adr As Long, _
ByVal p1 As Long, _
ByVal p2 As Long, _
ByVal p3 As Long, _
ByVal p4 As Long _
) As Long
Private Declare Function LoadLibrary Lib "kernel32" _
Alias "LoadLibraryA" ( _
ByVal szLib As String _
) As Long
Private Declare Function GetProcAddress Lib "kernel32" ( _
ByVal hModule As Long, _
ByVal szFnc As String _
) As Long
Private Declare Function GetModuleHandle Lib "kernel32" _
Alias "GetModuleHandleA" ( _
ByVal szModule As String _
) As Long
Private Declare Function LoadTypeLibEx Lib "oleaut32" ( _
ByVal szFile As Long, _
ByVal REGKIND As Long, _
pptlib As Any _
) As Long
Private Declare Function StringFromGUID2 Lib "ole32" ( _
tGuid As Any, _
ByVal lpszString As String, _
ByVal lMax As Long _
) As Long
Private Declare Sub CpyMem Lib "kernel32" _
Alias "RtlMoveMemory" ( _
pDst As Any, _
pSrc As Any, _
ByVal dlen As Long _
)
Private Type IUnknown
QueryInterface As Long
AddRef As Long
Release As Long
End Type
Private Type IClassFactory
IUnk As IUnknown
CreateInstance As Long
Lock As Long
End Type
Private Type ITypeInfo
IUnk As IUnknown
GetTypeAttr As Long
GetTypeComp As Long
GetFuncDesc As Long
GetVarDesc As Long
GetNames As Long
GetRefTypeOfImplType As Long
GetImplTypeFlags As Long
GetIDsOfNames As Long
Invoke As Long
GetDocumentation As Long
GetDllEntry As Long
GetRefTypeInfo As Long
AddressOfMember As Long
CreateInstance As Long
GetMops As Long
GetContainingTypeLib As Long
ReleaseTypeAttr As Long
ReleaseFuncDesc As Long
ReleaseVarDesc As Long
End Type
Private Type ITypeLib
IUnk As IUnknown
GetTypeInfoCount As Long
GetTypeInfo As Long
GetTypeInfoType As Long
GetTypeInfoOfGuid As Long
GetLibAttr As Long
GetTypeComp As Long
GetDocumentation As Long
IsName As Long
FindName As Long
ReleaseTLibAttr As Long
End Type
Private Type TYPEATTR
guid(15) As Byte
lcid As Long
dwReserved As Long
memidConstructor As Long
memidDestructor As Long
pstrSchema As Long
cbSizeInstance As Long
TYPEKIND As Long
cFuncs As Integer
cVars As Integer
cImplTypes As Integer
cbSizeVft As Integer
cbAlignment As Integer
wTypeFlags As Integer
wMajorVerNum As Integer
wMinorVerNum As Integer
tdescAlias As Long
idldescType As Long
End Type
Private Type CoClass
Name As String
guid() As Byte
End Type
Private Type guid
data1 As Long
data2 As Integer
data3 As Integer
data4(7) As Byte
End Type
Private Enum REGKIND
REGKIND_DEFAULT
REGKIND_REGISTER
REGKIND_NONE
End Enum
Public Function CreateObjectFromFile( _
ByVal strLibrary As String, _
ByVal strClassName As String _
) As stdole.IUnknown
Dim newobj As stdole.IUnknown
Dim udtCF As IClassFactory
Dim classid As guid
Dim IID_ClassFactory As guid
Dim IID_IUnknown As guid
Dim lib As String
Dim obj As Long
Dim vtbl As Long
Dim hModule As Long
Dim pFunc As Long
Dim udtCoCls() As CoClass
Dim i As Long
With IID_ClassFactory
.data1 = &H1
.data4(0) = &HC0
.data4(7) = &H46
End With
With IID_IUnknown
.data4(0) = &HC0
.data4(7) = &H46
End With
' get all CoClasses from the type lib of
' the file, and find the GUID of the Prog ID
If Not GetCoClasses(strLibrary, udtCoCls) Then
Exit Function
End If
For i = 0 To UBound(udtCoCls)
If StrComp(udtCoCls(i).Name, strClassName, vbTextCompare) = 0 Then
CpyMem classid, udtCoCls(i).guid(0), Len(classid)
Exit For
End If
Next
If i = UBound(udtCoCls) + 1 Then
Exit Function
End If
' load the file, if it isn't yet
hModule = GetModuleHandle(strLibrary)
If hModule = 0 Then
hModule = LoadLibrary(strLibrary)
If hModule = 0 Then Exit Function
End If
pFunc = GetProcAddress(hModule, "llGetClassObject"
If pFunc = 0 Then Exit Function
' call DllGetClassObject to get a
' class factory for the class ID
If 0 <> CallPointer(pFunc, _
VarPtr(classid), _
VarPtr(IID_ClassFactory), _
VarPtr(obj)) Then
Да уж, до завтра (я должен сдать эту вещь завтра хоть на чём нибудь, хотя надо было позавчера и на delphi) я этот код в программу встроить не успею.
Поэтому Артур меня буквально спас. А Arseny развеял последние сомнения насчёт использования Fusion (он и так после первого запуска вылетал, думал бежать по соседям с дистрибутивом) - злобные админы ЕМНИП закрыли для простого User'а запись в некоторые системные директории (дело под 2K и NTFS), потому в System32 может ничего и не закинуться.
Всё равно PowerWrap пытается прописать OCX в соответствующее место.
В общем, либо буду пробовать тот код для подгрузки в память, либо договорюсь с админом (выяснилось, что сдать можно будет позднее).