Private Declare Function ProgIDFromCLSID Lib "ole32.dll" (pCLSID As Any, _
lpszProgID As Long) As Long
Private Declare Function CLSIDFromString Lib "ole32.dll" (ByVal lpszProgID As _
Long, pCLSID As Any) As Long
Private Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (dest As _
Any, source As Any, ByVal bytes As Long)
' Convert a string representation of a CLSID, including the
' surrounding brace brackets, into the corresponding ProgID.
Function CLSIDToProgID(ByVal CLSID As String) As String
Dim pResult As Long, pChar As Long
Dim char As Integer, length As Long
' No need to use a special UDT
Dim guid(15) As Byte
CLSID = Format(Replace(CLSID, "-", ""), "@@@@@@@@@-@@@@-@@@@-@@@@-@@@@@@@@@@@@")
' convert from string to a binary CLSID
CLSIDFromString StrPtr(CLSID), guid(0)
' convert to a string, get pointer to result
ProgIDFromCLSID guid(0), pResult
' return a null string if not found
If pResult = 0 Then Exit Function
' find the terminating null char
pChar = pResult - 2
Do
pChar = pChar + 2
CopyMemory char, ByVal pChar, 2
Loop While char
' now get the entire string in one operation
length = pChar - pResult
' no need for a temporary string
CLSIDToProgID = Space$(length \ 2)
CopyMemory ByVal StrPtr(CLSIDToProgID), ByVal pResult, length
End Function
Private Sub Command1_Click()
Debug.Print CLSIDToProgID("{0D43FE01F09311CF894000A0C9054228}")
End Sub
(credit for most of this should go to Francesco Balena at DevX)
A slightly better way to obtain the length of a string from its pointer is to use lstrlen API function. Unlike VB's Len function, it can operate directly on raw pointers to return the string length as we desire in this case. We do not need to step from memory to find the terminating null character.
Here is a revised version of strongm's CLSIDToProgID function along with the declaration of lstrlen function.
___
[tt]
Private Declare Function lstrlen Lib "kernel32" Alias "lstrlenW" (ByVal lpString As Long) As Long
...
Function CLSIDToProgID(ByVal CLSID As String) As String
Dim pResult As Long, guid(15) As Byte
CLSID = Format(Replace(CLSID, "-", ""), "@@@@@@@@@-@@@@-@@@@-@@@@-@@@@@@@@@@@@")
' convert from string to a binary CLSID
CLSIDFromString StrPtr(CLSID), guid(0)
' convert to a string, get pointer to result
ProgIDFromCLSID guid(0), pResult
'allocate space in string buffer
CLSIDToProgID = Space$(lstrlen(pResult))
CopyMemory ByVal StrPtr(CLSIDToProgID), ByVal pResult, LenB(CLSIDToProgID)
End Function[/tt]
This site uses cookies to help personalise content, tailor your experience and to keep you logged in if you register.
By continuing to use this site, you are consenting to our use of cookies.