Tek-Tips is the largest IT community on the Internet today!

Members share and learn making Tek-Tips Forums the best source of peer-reviewed technical information on the Internet!

  • Congratulations Chriss Miller on being selected by the Tek-Tips community for having the most helpful posts in the forums last week. Way to Go!

Getting the ProgID from a GUID 2

Status
Not open for further replies.

DevonTaig

Programmer
May 2, 2001
73
US
I have a GUID such as {1F7DFB1D-0690-11D5-8536-0001031AE9DB}... what is the best way to get the ProgID for that using VB?
 
You could open the key in the registry

HKEY_CLASSES_ROOT\CLSID\{GUID_HERE}\PROGID

Then it would be the default value.

I don't know how reliable this is though... something to look into.

See faq222-92 on how to read the registry.
 
Option Explicit

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)
 
Thanks! Whew! I would not have guessed that on my own.
 
That is much easier strongm,,, learn something new everyday...
 
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]
 
Yes. Goodness knows why Francesco did it the long way around way. He's normally spot on.
 
Status
Not open for further replies.

Part and Inventory Search

Sponsor

Back
Top