Results 1 to 10 of 570

Thread: Tests Copying, Pasting, API Cliipboard issues. and Rough notes on Advanced API stuff

Hybrid View

Previous Post Previous Post   Next Post Next Post
  1. #1
    Fuhrer, Vierte Reich DocAElstein's Avatar
    Join Date
    Aug 2014
    Posts
    10,457
    Rep Power
    10

    Clsid Clipboard

    This is post #544
    https://www.excelfox.com/forum/showt...ll=1#post24117
    https://www.excelfox.com/forum/showthread.php/2824-Tests-Copying-pasting-Cliipboard-issues?p=24117&viewfull=1#post24117
    https://www.excelfox.com/forum/showt...ge55#post24117
    https://www.excelfox.com/forum/showthread.php/2824-Tests-Copying-pasting-Cliipboard-issues/page55#post24117




    Some notes to bring together some "Clsid Clipboard" discussions from approximately here https://eileenslounge.com/viewtopic....288963#p288963 and here, https://eileenslounge.com/viewtopic....314925#p314925


    Clsid Late Binding

    These sort of things:
    MSForms.ListBox https://web.archive.org/web/20140610...emory-listbox/
    CreateObject("New:{8BD21D20-EC42-11CE-9E0D-00AA006002F3}")

    MSForms.DataObject https://web.archive.org/web/20140610...ms-dataobject/
    CreateObject("New:{1C3B4210-F441-11CE-B9EA-00AA006B1A69}")

    The last one is the most commonly used and known about, at least around the VBA area where I am, or have been, over the last few years

    Some notes picked up from smarter people
    Mike (SpeakEasy), Hans, Chris : From about here https://eileenslounge.com/viewtopic....288963#p288963
    Microsoft simply hasn't exposed a class name for DataObject. Most object we use do have a class name. For those we can use early binding by setting a reference, or late binding by using GetObject/CreateObject with a class name. DataObject is an exception, so we MUST use its hexadecimal ClassID.
    36-character strings: .. It's the formal string representation of the underlying 128bit UUID (which Microsoft tend to refer to as a GUID; a CLSID is just a GUID being used for a specific role - identifying a class object), that representation being 32 hexadecimal digits separated by 4 hyphens ...
    We humans are sheltered from them normally, but there are odd occasions where we find we have to use them. Not very often for most users, it has to be said.

    Mike (SpeakEasy), from about here https://eileenslounge.com/viewtopic....314925#p314925
    GUID is just a unique identifier. Microsoft use unique identifiers for all sorts of purposes in Windows, and then they are given specific names to better indicate their purpose, hence FMTID in my previous post. The GUIDs you can use with CreateObject are actually knows as CLSIDs (or Class IDs); each and every class on Windows has it's own CLSID, and you can look them all up in the registry under HKEY_CLASSES_ROOT.
    In general it offers little benefit compared to using the ProgID (the human readable string, such as word.application), and indeed often obfuscates what is going on (malware writers were big fans ...).

    There are, however, a few rare scenarios where it can prove useful. Some COM objects do not have a ProgID. Often such objects are not directly useful to VB/VBA programmers, but some are. The one you use in your example, 1C3B4210-F441-11CE-B9EA-00AA006B1A69, is the userform clipboard object*, so we get a cheap way of simple clipboard access.
    ( * More accurately the userform dataobject, (Microsoft.Vbe.Interop.Forms.DataObjectClass - this is NOT a ProgID) which provides simple access to the clipboard )




    Here is a macro I found a few years back:

    Code:
    '                             This workbook kept and updated here:   (Folder at appBox.com excel fox2 excelfox2@gmail.com   RegistryCmdListsWinGimics)
    ' https://powershell.one/wmi/root/cimv2/stdregprov-EnumKey    '   https://www.vbforums.com/showthread.php?552899-Getting-all-sub-keys-from-a-registry-value                  https://www.vba-tutorial.de/apireferenz/registry.htm
    Sub ListCLSIDs() '  http://www.eileenslounge.com/viewtopic.php?f=26&t=22603&p=289007#p289007
    Dim Ws As Worksheet: Set Ws = Me ' Set Ws = ActiveSheet
    Dim Registry As Object, varKey As Variant, varKeys As Variant
     Set Registry = GetObject("winmgmts:\\.\root\default:StdRegProv")
     Registry.EnumKey 2147483650#, "SOFTWARE\Classes\CLSID", varKeys ' https://powershell.one/wmi/root/cimv2/stdregprov-EnumKey
    Dim Cnt As Long: Let Cnt = 1
        For Each varKey In varKeys
    '    Let Ws.Range("A" & Ws.Range("A" & Ws.Rows.Count & "").End(xlUp).Row + 1 & "").Value = varKey
     Let Cnt = Cnt + 1
        Let Ws.Range("A" & Cnt & "").Value = varKey
        Next
    End Sub
    Here is a more recent one from Mike ( Speakeasy https://eileenslounge.com/viewtopic....314941#p314941 )

    Code:
    Public Const HKEY_CLASSES_ROOT = &H80000000  '  https://eileenslounge.com/viewtopic.php?p=314945#p314945
    Public Sub GetCLSIDs_and_ProgIDs() '  https://eileenslounge.com/viewtopic.php?p=314941#p314941
    
        Dim entryArray() As Variant
        Dim KeyValue  As Variant  '  Dim KeyValue  As String  ..... Automation-errors-The-called-object-has-been-disconnected-from-the-clients - https://eileenslounge.com/viewtopic.php?p=314950#p314950    Mike: The error is somewhat misleading. It is down to the fact that the XP (and presumably Vista and W7, although I can't test them) WMI provider (which gives us the Registry access) handles returning Null differently than the one on W10   https://eileenslounge.com/viewtopic.php?p=314953#p314953
        Dim KeyPath As String
        Dim x As Long
        Dim row As Long
        
        Dim RegistryObject As Object
        Dim strComputer As String
        
        strComputer = "."
        Set RegistryObject = GetObject("winmgmts:{impersonationLevel=impersonate}!\\" & strComputer & "\root\default:StdRegProv")
        RegistryObject.EnumKey HKEY_CLASSES_ROOT, "CLSID", entryArray
        
        ActiveSheet.Cells(1, 1).Value = "CLSID"
        ActiveSheet.Cells(1, 2).Value = "ProgID"
        
        row = 2
        For x = 0 To UBound(entryArray)
            RegistryObject.getstringvalue HKEY_CLASSES_ROOT, "CLSID\" & entryArray(x) & "\ProgId", "", KeyValue
            If KeyValue <> "" Then
                ActiveSheet.Cells(row, 1) = entryArray(x)
                ActiveSheet.Cells(row, 2) = KeyValue
                row = row + 1
            End If
        Next x
        
    End Sub
    
    In post #545 , I slightly rearrange those routines above, ( mine and Mike’s Clsid list thing making codings) , just to make them easier to compare, and then in post #547 I do Some initial comparison thoughts





    By the way, back then I did myself the coding below to create an object from the Clsid and then look at the TypeName( object ) . I did that as a geuss on how to get the class name, if it had one. More about that abortion Later
    Code:
    ' https://powershell.one/wmi/root/cimv2/stdregprov-EnumKey    '   https://www.vbforums.com/showthread.php?552899-Getting-all-sub-keys-from-a-registry-value
    Sub CLSIDsValueNames() '
    Dim Ws As Worksheet: Set Ws = Me ' Set Ws = ActiveSheet
    Dim RngSel As Range:  Set RngSel = Selection
        If RngSel.Cells.Count = 1 Then MsgBox prompt:="Please select at least 2 cells in column A": Exit Sub
        If RngSel.Cells.Columns.Count <> 1 Then MsgBox prompt:="Please select at least 2 cells in only column A": Exit Sub
        If Not RngSel.Cells.Column = 1 Then MsgBox prompt:="Please select at least 2 cells in column A": Exit Sub
    Dim stearCel As Range
        For Each stearCel In RngSel
         Let Ws.Range("B" & stearCel.row & "").Value = "Tried" ' To indicate I tried - this can be useful to see where it crashed
        Dim OOPObj  As Object
        On Error GoTo EyeEyeSkipper
         Set OOPObj = CreateObject("New:" & stearCel.Value & "")
         Let Ws.Range("D" & stearCel.row & "").Value = TypeName(OOPObj)
         Let Application.DisplayAlerts = False
         ThisWorkbook.Save ' This is done to save all got so far incase Excel crashes on next loop or below
         Let Application.DisplayAlerts = True
        On Error Resume Next
        OOPObj.Close
        On Error GoTo 0
        Set OOPObj = Nothing
    EyeEyeSkipper:
        On Error GoTo -1
        On Error GoTo 0
        Next stearCel
    End Sub
    
    Last edited by DocAElstein; 03-29-2025 at 03:26 AM.

Similar Threads

  1. Some Date Notes and Tests
    By DocAElstein in forum Test Area
    Replies: 5
    Last Post: 03-26-2025, 02:56 AM
  2. Replies: 116
    Last Post: 02-23-2025, 12:13 AM
  3. Replies: 21
    Last Post: 12-15-2024, 07:13 PM
  4. Replies: 42
    Last Post: 05-29-2023, 01:19 PM
  5. Replies: 11
    Last Post: 10-13-2013, 10:53 PM

Posting Permissions

  • You may not post new threads
  • You may not post replies
  • You may not post attachments
  • You may not edit your posts
  •