source: trunk/src/ole32/clsid.cpp@ 197

Last change on this file since 197 was 197, checked in by davidr, 26 years ago

CLSID manipulation for OLE32.

File size: 3.1 KB
Line 
1/*
2 *
3 * Project Odin Software License can be found in LICENSE.TXT
4 *
5 */
6/*
7 * Win32 OLE stubs for OS/2
8 *
9 * 1998/06/12
10 *
11 * Copyright 1998 Sander van Leeuwen
12 */
13
14#include "ole32.h"
15
16#include "oString.h"
17
18// ----------------------------------------------------------------------
19// CLSIDFromStringA() [Internal]
20// ----------------------------------------------------------------------
21static HRESULT CLSIDFromStringA(
22 const char * lpsz, // [in] - ASCII string to convert
23 LPCLSID pclisid) // [out] - CLSID
24{
25 dprintf(("OLE32.CLSIDFromStringA [Internal]\n"));
26
27 BYTE *s = (BYTE *) lpsz;
28 BYTE *p;
29 int i;
30 BYTE table[256];
31
32 /* quick lookup table */
33 memset(table, 0, 256);
34
35 for (i = 0; i < 10; i++)
36 {
37 table['0' + i] = i;
38 }
39 for (i = 0; i < 6; i++)
40 {
41 table['A' + i] = i+10;
42 table['a' + i] = i+10;
43 }
44
45 /* in form {XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX} */
46
47 if (strlen(lpsz) != 38)
48 return OLE_ERROR_OBJECT;
49
50 p = (BYTE *) pclisid;
51
52 s++; /* skip leading brace */
53 for (i = 0; i < 4; i++)
54 {
55 p[3 - i] = table[*s]<<4 | table[*(s+1)];
56 s += 2;
57 }
58 p += 4;
59 s++; /* skip - */
60
61 for (i = 0; i < 2; i++)
62 {
63 p[1-i] = table[*s]<<4 | table[*(s+1)];
64 s += 2;
65 }
66 p += 2;
67 s++; /* skip - */
68
69 for (i = 0; i < 2; i++)
70 {
71 p[1-i] = table[*s]<<4 | table[*(s+1)];
72 s += 2;
73 }
74 p += 2;
75 s++; /* skip - */
76
77 /* these are just sequential bytes */
78 for (i = 0; i < 2; i++)
79 {
80 *p++ = table[*s]<<4 | table[*(s+1)];
81 s += 2;
82 }
83 s++; /* skip - */
84
85 for (i = 0; i < 6; i++)
86 {
87 *p++ = table[*s]<<4 | table[*(s+1)];
88 s += 2;
89 }
90
91 return S_OK;
92}
93
94// ----------------------------------------------------------------------
95// CLSIDFromProgID()
96// ----------------------------------------------------------------------
97HRESULT WIN32API CLSIDFromProgID(
98 LPCOLESTR lpszProgID, // [in] - UNICODE program id as found in registry
99 LPCLSID pclsid) // [out] - CLSID
100{
101 dprintf(("OLE32.CLSIDFromProgID\n"));
102
103 LONG lDataLen = 80;
104 oStringA szKey(lpszProgID);
105 oStringA szCLSID(lDataLen);
106 HKEY hKey;
107 HRESULT rc;
108
109 // Create the registry lookup string...
110 szKey += "\\CLSID";
111
112 // Try to open the key in the registry...
113 rc = RegOpenKeyA(HKEY_CLASSES_ROOT, szKey, &hKey);
114 if (rc != 0)
115 return OLE_ERROR_GENERIC;
116
117 // Now get the data from the _default_ entry on this key...
118 rc = RegQueryValueA(hKey, NULL, szCLSID, &lDataLen);
119 RegCloseKey(hKey);
120 if (rc != 0)
121 return OLE_ERROR_GENERIC;
122
123 // Now convert from a string to a UUID
124 return CLSIDFromStringA(szCLSID, pclsid);
125}
126
127// ----------------------------------------------------------------------
128// CLSIDFromString()
129// ----------------------------------------------------------------------
130HRESULT WIN32API CLSIDFromString(
131 LPCOLESTR lpsz, // [in] - Unicode string CLSID
132 LPCLSID pclsid) // [out] - Binary CLSID
133{
134 dprintf(("OLE32.CLSIDFromString\n"));
135
136 HRESULT ret = OLE_ERROR_GENERIC;
137 oStringA szCLSID(lpsz);
138
139 // Convert to binary CLSID
140 return CLSIDFromStringA(szCLSID, pclsid);
141}
142
Note: See TracBrowser for help on using the repository browser.