Visual Basic, .NET, ASP, VBScript
 

   
   
     

Форум - Общий форум

Страница: 1 |

 

  Вопрос: OCX без регистрации. Добавлено: 20.05.07 19:05  

Автор вопроса:  Wolf4D | Web-сайт: www.madnesstudio.ru
Может, кто нибудь знает, как пользоваться OCX без их регистрации в системе? Подозреваю, что это невозможно, но продолжаю надеяться на чудо.

Ответить

  Ответы Всего ответов: 15  

Номер ответа: 1
Автор ответа:
 Arvitaly



ICQ: 301746136 

Вопросов: 28
Ответов: 549
 Web-сайт: okazani.ru
 Профиль | | #1
Добавлено: 20.05.07 19:07
А зачем?

Ответить

Номер ответа: 2
Автор ответа:
 Wolf4D



Вопросов: 20
Ответов: 131
 Web-сайт: www.madnesstudio.ru
 Профиль | | #2
Добавлено: 20.05.07 19:09
Админские права мне всё-таки не дали, а в проге используется mswinsck.ocx

Ответить

Номер ответа: 3
Автор ответа:
 Arseny



ICQ: 298826769 

Вопросов: 53
Ответов: 1732
 Профиль | | #3 Добавлено: 20.05.07 19:54
Попробуй использовать Fusion, хотя и не уверен, что он поможет. Лучше всего договориться с админом. Ты же не ломать его вздумал? ;)

Ответить

Номер ответа: 4
Автор ответа:
 Wolf4D



Вопросов: 20
Ответов: 131
 Web-сайт: www.madnesstudio.ru
 Профиль | | #4
Добавлено: 20.05.07 20:22
Попробуй использовать Fusion, хотя и не уверен, что он поможет

Можно поподробнее?
Ты же не ломать его вздумал? ;)

Ни в коем разе) Хотя иногда возникают поразительные эффекты - моя прога для зависания системы СОВЕРШЕННО СЛУЧАЙНО снесла эту самую систему. Два раза... А деструктивного кода она не содержала...

Ответить

Номер ответа: 5
Автор ответа:
 Artyom



Разработчик

Вопросов: 130
Ответов: 6602
 Профиль | | #5 Добавлено: 20.05.07 21:28
бывает

Ответить

Номер ответа: 6
Автор ответа:
 art



Вопросов: 45
Ответов: 119
 Профиль | | #6 Добавлено: 20.05.07 21:29
Fusion или VB PowerRack. Если надо могу скинуть - попробуешь (пиши мыло).
Сам тоже пробывал но пришёл к тому, что проект написанный на vb6 требует инсталяции совсеми примочками для корректной работы приложения.
В общём решай сам.

Ответить

Номер ответа: 7
Автор ответа:
 Wolf4D



Вопросов: 20
Ответов: 131
 Web-сайт: www.madnesstudio.ru
 Профиль | | #7
Добавлено: 20.05.07 21:33
Если надо могу скинуть - попробуешь (пиши мыло).

Wolf4D @ List.ru
Буду признателен!

Ответить

Номер ответа: 8
Автор ответа:
 Arseny



ICQ: 298826769 

Вопросов: 53
Ответов: 1732
 Профиль | | #8 Добавлено: 20.05.07 22:16
Ну вообще, насколько я присмотрелся к Fusion, он делает обычный екзешник, из которого вытягивает нужные ресурсы. Причем при повторном запуске проги они уже не требуются, так как распаковываются и остаются. Проследил за своей прогой, она активикс вытащила в System, и он там остался....

Ответить

Номер ответа: 9
Автор ответа:
 Wolf4D



Вопросов: 20
Ответов: 131
 Web-сайт: www.madnesstudio.ru
 Профиль | | #9
Добавлено: 20.05.07 22:43
Всё, благодаря Arseny проблема отпала. Огромное ему спасибо за PowerWrap 4!

Ответить

Номер ответа: 10
Автор ответа:
 Arseny



ICQ: 298826769 

Вопросов: 53
Ответов: 1732
 Профиль | | #10 Добавлено: 20.05.07 22:45
Это не я врап предложил! :) Я к чужой славе примазываться не буду... :)

Ответить

Номер ответа: 11
Автор ответа:
 Wolf4D



Вопросов: 20
Ответов: 131
 Web-сайт: www.madnesstudio.ru
 Профиль | | #11
Добавлено: 20.05.07 22:49
Сорри, имел в виду Артура, конечно...

Ответить

Номер ответа: 12
Автор ответа:
 HACKER


 

Разработчик Offline Client

Вопросов: 236
Ответов: 8362
 Профиль | | #12 Добавлено: 20.05.07 23:37
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 Enum TYPEKIND
    TKIND_ENUM
    TKIND_RECORD
    TKIND_MODULE
    TKIND_INTERFACE
    TKIND_DISPATCH
    TKIND_COCLASS
    TKIND_ALIAS
    TKIND_UNION
    TKIND_MAX
End Enum

Private Enum HRESULT
    S_OK = 0
End Enum

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, ";DllGetClassObject";)
    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

        Exit Function
    End If

    ' IClassFactory VTable
    CpyMem vtbl, ByVal obj, 4
    CpyMem udtCF, ByVal vtbl, Len(udtCF)

    ' create an instance of the object
    If 0 <> CallPointer(udtCF.CreateInstance, _
                        obj, _
                        0, _
                        VarPtr(IID_IUnknown), _
                        VarPtr(newobj)) Then

        ' Set IClassFactory = Nothing
        CallPointer udtCF.IUnk.Release, obj
        Exit Function
    End If

    ' Set IClassFactory = Nothing
    CallPointer udtCF.IUnk.Release, obj

    Set CreateObjectFromFile = newobj
End Function

Private Function GetCoClasses( _
    ByVal strFile As String, _
    udtCoClasses() As CoClass _
) As Boolean

    Dim hRes            As HRESULT

    Dim udtITypeLib     As ITypeLib
    Dim udtITypeInfo    As ITypeInfo
    Dim udtTypeAttr     As TYPEATTR

    Dim oTypeLib        As Long
    Dim oTypeInfo       As Long
    Dim pVTbl           As Long
    Dim pAttr           As Long

    Dim lngTypeInfos    As Long
    Dim lngCoCls        As Long
    Dim strTypeName     As String

    Dim i               As Long

    ' load the type lib of the file
    hRes = LoadTypeLibEx(StrPtr(strFile), REGKIND_NONE, oTypeLib)
    If hRes <> S_OK Then Exit Function

    ' ITypeLib's VTable
    CpyMem pVTbl, ByVal oTypeLib, 4
    CpyMem udtITypeLib, ByVal pVTbl, Len(udtITypeLib)

    lngTypeInfos = CallPointer(udtITypeLib.GetTypeInfoCount, oTypeLib)

    For i = 0 To lngTypeInfos - 1

        hRes = CallPointer(udtITypeLib.GetTypeInfo, _
                           oTypeLib, i, _
                           VarPtr(oTypeInfo))

        If hRes <> S_OK Then GoTo NextItem

        ' ITypeInfo's VTable
        CpyMem pVTbl, ByVal oTypeInfo, 4
        CpyMem udtITypeInfo, ByVal pVTbl, Len(udtITypeInfo)

        ' TYPEATTR struct, which describes the type
        CallPointer udtITypeInfo.GetTypeAttr, oTypeInfo, VarPtr(pAttr)
        CpyMem udtTypeAttr, ByVal pAttr, Len(udtTypeAttr)
        CallPointer udtITypeInfo.ReleaseTypeAttr, oTypeInfo, pAttr

        ' name of the type
        CallPointer udtITypeLib.GetDocumentation, _
                    oTypeLib, i, _
                    VarPtr(strTypeName), _
                    0, 0, 0

        If udtTypeAttr.TYPEKIND = TKIND_COCLASS Then
            ReDim Preserve udtCoClasses(lngCoCls) As CoClass

            With udtCoClasses(lngCoCls)
                .guid = udtTypeAttr.guid
                .Name = strTypeName
            End With

            lngCoCls = lngCoCls + 1
        End If

        ' Set ITypeInfo = Nothing
        CallPointer udtITypeInfo.IUnk.Release, oTypeInfo
        oTypeInfo = 0

NextItem:
    Next

    ' Set ITypeLib = Nothing
    CallPointer udtITypeLib.IUnk.Release, oTypeLib
    '
    GetCoClasses = True
End Function

Private Function CallPointer( _
    ByVal fnc As Long, _
    ParamArray params() _
) As Long

    Dim btASM(&HEC00& - 1)  As Byte
    Dim pASM                As Long
    Dim i                   As Integer

    pASM = VarPtr(btASM(0))

    AddByte pASM, &H58                  ' POP EAX
    AddByte pASM, &H59                  ' POP ECX
    AddByte pASM, &H59                  ' POP ECX
    AddByte pASM, &H59                  ' POP ECX
    AddByte pASM, &H59                  ' POP ECX
    AddByte pASM, &H50                  ' PUSH EAX

    For i = UBound(params) To 0 Step -1
        AddPush pASM, CLng(params(i))   ' PUSH dword
    Next

    AddCall pASM, fnc                   ' CALL rel addr
    AddByte pASM, &HC3                  ' RET

    CallPointer = CallWindowProc(VarPtr(btASM(0)), _
                                 0, 0, 0, 0)
End Function

Private Sub AddPush(pASM As Long, lng As Long)
    AddByte pASM, &H68
    AddLong pASM, lng
End Sub

Private Sub AddCall(pASM As Long, addr As Long)
    AddByte pASM, &HE8
    AddLong pASM, addr - pASM - 4
End Sub

Private Sub AddLong(pASM As Long, lng As Long)
    CpyMem ByVal pASM, lng, 4
    pASM = pASM + 4
End Sub

Private Sub AddByte(pASM As Long, bt As Byte)
    CpyMem ByVal pASM, bt, 1
    pASM = pASM + 1
End Sub

' http://www.aboutvb.de/khw/artikel/khwcreateguid.htm
Private Function GUID2Str( _
    GUIDBytes() As Byte _
) As String

    Dim nTemp       As String
    Dim nGUID(15)   As Byte
    Dim nLength     As Long

    nTemp = Space$(78)
    CpyMem nGUID(0), GUIDBytes(0), 16
    nLength = StringFromGUID2(nGUID(0), nTemp, Len(nTemp))
    GUID2Str = Left$(StrConv(nTemp, vbFromUnicode), nLength - 1)
End Function


пример использования, форма:
Option Explicit

Private Sub Form_Load()
    Dim objCtrl As Object

    Set objCtrl = CreateObjectFromFile( _
                        "mscomctl.ocx", _
                        "ImageCombo";)

    If objCtrl Is Nothing Then
        MsgBox "couldn't create the obj"
    Else
        MsgBox "could create the obj"
        Set objCtrl = Nothing
    End If
End Sub

Ответить

Номер ответа: 13
Автор ответа:
 Wolf4D



Вопросов: 20
Ответов: 131
 Web-сайт: www.madnesstudio.ru
 Профиль | | #13
Добавлено: 21.05.07 00:00
Да уж, до завтра (я должен сдать эту вещь завтра хоть на чём нибудь, хотя надо было позавчера и на delphi) я этот код в программу встроить не успею.
Поэтому Артур меня буквально спас. А Arseny развеял последние сомнения насчёт использования Fusion (он и так после первого запуска вылетал, думал бежать по соседям с дистрибутивом) - злобные админы ЕМНИП закрыли для простого User'а запись в некоторые системные директории (дело под 2K и NTFS), потому в System32 может ничего и не закинуться.

Ответить

Номер ответа: 14
Автор ответа:
 Wolf4D



Вопросов: 20
Ответов: 131
 Web-сайт: www.madnesstudio.ru
 Профиль | | #14
Добавлено: 21.05.07 23:25
Всё равно PowerWrap пытается прописать OCX в соответствующее место.
В общем, либо буду пробовать тот код для подгрузки в память, либо договорюсь с админом (выяснилось, что сдать можно будет позднее).

Ответить

Номер ответа: 15
Автор ответа:
 Champion



ICQ: 461506481 

Вопросов: 38
Ответов: 88
 Web-сайт: afhelp.in.ua
 Профиль | | #15
Добавлено: 23.05.07 08:32
если используется, под Win XP SP2, то я вообще не регистрирую OCX, просто ложу их в папку с екзе файлом

Ответить

Страница: 1 |

Поиск по форуму



© Copyright 2002-2011 VBNet.RU | Пишите нам