vb做的activex控件如何指定classid?或者能保持第一次的classid不变呢?

解决方案 »

  1.   

    activex控件注册后,HKEY_CLASSES_ROOT\CLSID\下就自动生成相应的classid,在我的印象中这个classid是不变的,也不可随意改动.
      

  2.   


    为了获得原来的CLSID,你需要引用 "TypeLib Information",位于 C:\Windows\System32\TLBINF32.DLL 
    Option ExplicitPublic Function ReplaceGUIDInFile(ByVal sFileName As String, _
       ByVal sGUIDOld As String, _
       ByVal sGUIDNew As String, _
       ByVal bReplace As Boolean) As Boolean   Dim sText            As String 'File string
       Dim sOld             As String 'Search string
       Dim sNew             As String
       Dim pos              As Long   sOld = strGUIDtoMemory(sGUIDOld)
       sNew = strGUIDtoMemory(sGUIDNew)
       sText = BinaryFile_Read_VB(sFileName)
       'Note: Hex(pos) returned by InstrB agrees with location when opening OCX with UltraEdit in Hex mode.
       pos = InStrB(1, sText, sOld, vbBinaryCompare)
       Do While pos > 0
          Debug.Print "Match at Hex", Hex(pos)
          If bReplace Then
             sText = Replace(sText, sOld, sNew) 'Note: This replaces both occurences in OCX/DLL
             BinaryFile_Write_VB sFileName, sText
          End If
          pos = InStrB(pos + 1, sText, sOld, vbBinaryCompare)
       LoopEnd Function'Note: Rearrange bytes for memory search/replace.
    'Long/Integer byte values are reversed.
    Private Function strGUIDtoMemory(ByVal sGUID As String) As String
       Dim b(15)            As Byte
       Dim i                As Long
       Dim lChar            As Long   'Strip curly brackets and separator
       sGUID = Replace(sGUID, "{", "")
       sGUID = Replace(sGUID, "}", "")
       sGUID = Replace(sGUID, "-", "")   'Original     File         Type     Comments
       '--------     --------     -------  --------
       '2AEF8139     3981EF2A     Long     Reversed
       'B732         32B7         Integer  Reversed
       '4B9E         9E4B         Integer  Reversed
       'AFB2         AFB2         Byte     Normal
       '7A94F1E616F5 7A94F1E616F5 Byte     Normal   'Rearrange bytes for memory search/replace
       'From 2AEF8139B7324B9EAFB27A94F1E616F5
       'To   3981EF2A32B79E4B + AFB27A94F1E616F5
       sGUID = Mid(sGUID, 7, 2) & _
          Mid(sGUID, 5, 2) & _
          Mid(sGUID, 3, 2) & _
          Mid(sGUID, 1, 2) & _
          Mid(sGUID, 11, 2) & _
          Mid(sGUID, 9, 2) & _
          Mid(sGUID, 15, 2) & _
          Mid(sGUID, 13, 2) & _
          Mid(sGUID, 17)   'Populate 16 byte array with sGUID values
       For i = 1 To Len(sGUID) - 1 Step 2
          lChar = "&H" & Mid(sGUID, i, 2)
          'Debug.Print i \ 2, Hex(lChar)
          b(i \ 2) = lChar
       Next   'Convert byte array to string.
       strGUIDtoMemory = bEnd FunctionPublic Function BinaryFile_Read_VB(ByVal sFileName As String) As String   Dim FF               As Long
       Dim b()              As Byte   On Error Resume Next   FF = FreeFile
       Open sFileName For Binary Access Read As FF
       ReDim b(LOF(FF) - 1)
       Get FF, , b
       Close FF
       BinaryFile_Read_VB = bEnd FunctionPublic Sub BinaryFile_Write_VB(ByVal sFileName As String, ByVal sText As String)   Dim FF               As Long
       Dim b()              As Byte   On Error Resume Next
       Kill sFileName
       On Error GoTo 0
       FF = FreeFile
       Open sFileName For Binary Access Write As #FF
       b = sText
       Put #FF, , b
       Close #FF
       
    End Sub
    Public Function GetLCIDFromFile(ByVal sPath As String) As String
       Dim m_cTLI           As TypeLibInfo
       Set m_cTLI = TLI.TypeLibInfoFromFile(sPath)
       GetLCIDFromFile = m_cTLI.LCID
    End Function
    '应用:
    Dim sFileName As String
    sFileName = "C:\MyControls\Release\vbalIml6_EDA1811C.ocx"ReplaceGUIDInFile sFileName, _
      GetLCIDFromFile(sFileName), _
      "{DFF6AA8E-1EC0-4026-B7F5-61555D9DDB8B}", _
      True)[/code]