Private Declare Function CLSIDFromProgID Lib "ole32.dll" (ByVal lpszProgID As _
Long, pCLSID As Any) As Long Private Declare Function StringFromCLSID Lib "ole32.dll" (pCLSID As Any, _ lpszProgID As Long) As Long Private Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (dest As _ Any, source As Any, ByVal bytes As Long) Private Declare Sub CoTaskMemFree Lib "ole32.dll" (ByVal pv As Long) ' Convert a ProgID (such as "Word.Application") into the ' string representation of its CLSID Function ProgIdToCLSID(ByVal ProgID 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 ' get the CLSID in binary form CLSIDFromProgID StrPtr(ProgID), guid(0) ' convert to a string, get pointer to result StringFromCLSID guid(0), pResult ' 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 ProgIdToCLSID = Space$(length \ 2) CopyMemory ByVal StrPtr(ProgIdToCLSID), ByVal pResult, length ' release the memory allocated to the string CoTaskMemFree pResult End Function |