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

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

Updated clsid handling to correctly draw textual clsid's
Fixed GUID instansiation.
Moved initialisation to OLE32.CPP
Added many new APIs incl. CoCreateInstance & CoGetClassObject.
Many partially implemented stubs completed and moved to OLE32.CPP
Running Object Table implemented (Moniker.cpp)
IMalloc & Task Memory implemented.

File size: 6.2 KB
Line 
1/*
2 *
3 * Project Odin Software License can be found in LICENSE.TXT
4 *
5 */
6/*
7 * ClassID Manipulation.
8 *
9 * 1/7/99
10 *
11 * Copyright 1999 David J. Raison
12 *
13 * Some portions from Wine Implementation
14 * Copyright 1995 Martin von Loewis
15 * Copyright 1998 Justin Bradford
16 * Copyright 1999 Francis Beaudet
17 * Copyright 1999 Sylvain St-Germain
18 */
19
20#include "ole32.h"
21
22#include "oString.h"
23
24// ----------------------------------------------------------------------
25// CLSIDFromProgID()
26// ----------------------------------------------------------------------
27HRESULT WIN32API CLSIDFromProgID(
28 LPCOLESTR lpszProgID, // [in] - UNICODE program id as found in registry
29 LPCLSID pclsid) // [out] - CLSID
30{
31 dprintf(("OLE32: CLSIDFromProgID"));
32
33 LONG lDataLen = 80;
34 oStringW szKey(lpszProgID);
35 oStringW szCLSID(lDataLen);
36 HKEY hKey;
37 HRESULT rc;
38
39 // Create the registry lookup string...
40 szKey += L"\\CLSID";
41
42 // Try to open the key in the registry...
43 rc = RegOpenKeyW(HKEY_CLASSES_ROOT, szKey, &hKey);
44 if (rc != 0)
45 return OLE_ERROR_GENERIC;
46
47 // Now get the data from the _default_ entry on this key...
48 rc = RegQueryValueW(hKey, NULL, szCLSID, &lDataLen);
49 RegCloseKey(hKey);
50 if (rc != 0)
51 return OLE_ERROR_GENERIC;
52
53 // Now convert from a string to a UUID
54 return CLSIDFromString(szCLSID, pclsid);
55}
56
57// ----------------------------------------------------------------------
58// IIDFromString
59// ----------------------------------------------------------------------
60HRESULT WIN32API IIDFromString(LPSTR lpsz, LPIID lpiid)
61{
62 dprintf(("OLE32: IIDFromString"));
63 return CLSIDFromString((LPCOLESTR)lpsz, (LPCLSID)lpiid);
64}
65
66// ----------------------------------------------------------------------
67// CLSIDFromString()
68// ----------------------------------------------------------------------
69HRESULT WIN32API CLSIDFromString(
70 LPCOLESTR lpsz, // [in] - Unicode string CLSID
71 LPCLSID pclsid) // [out] - Binary CLSID
72{
73 dprintf(("OLE32: CLSIDFromString"));
74
75 oStringA tClsId(lpsz);
76
77 HRESULT ret = OLE_ERROR_GENERIC;
78
79 // Convert to binary CLSID
80 char *s = (char *) tClsId;
81 char *p;
82 int i;
83 char table[256];
84
85 /* quick lookup table */
86 memset(table, 0, 256);
87
88 for (i = 0; i < 10; i++)
89 {
90 table['0' + i] = i;
91 }
92 for (i = 0; i < 6; i++)
93 {
94 table['A' + i] = i+10;
95 table['a' + i] = i+10;
96 }
97
98 /* in form {XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX} */
99
100 if (lstrlenW(lpsz) != 38)
101 return OLE_ERROR_OBJECT;
102
103 p = (char *) pclsid;
104
105 s++; /* skip leading brace */
106 for (i = 0; i < 4; i++)
107 {
108 p[3 - i] = table[*s]<<4 | table[*(s+1)];
109 s += 2;
110 }
111 p += 4;
112 s++; /* skip - */
113
114 for (i = 0; i < 2; i++)
115 {
116 p[1-i] = table[*s]<<4 | table[*(s+1)];
117 s += 2;
118 }
119 p += 2;
120 s++; /* skip - */
121
122 for (i = 0; i < 2; i++)
123 {
124 p[1-i] = table[*s]<<4 | table[*(s+1)];
125 s += 2;
126 }
127 p += 2;
128 s++; /* skip - */
129
130 /* these are just sequential bytes */
131 for (i = 0; i < 2; i++)
132 {
133 *p++ = table[*s]<<4 | table[*(s+1)];
134 s += 2;
135 }
136 s++; /* skip - */
137
138 for (i = 0; i < 6; i++)
139 {
140 *p++ = table[*s]<<4 | table[*(s+1)];
141 s += 2;
142 }
143
144 return S_OK;
145}
146
147// ----------------------------------------------------------------------
148// CoCreateGuid()
149// ----------------------------------------------------------------------
150HRESULT WIN32API CoCreateGuid(GUID *pguid)
151{
152 dprintf(("OLE32: CoCreateGuid"));
153 memset(pguid, 0, sizeof(GUID)); //TODO: should be random GUID
154 return S_OK;
155}
156
157// ----------------------------------------------------------------------
158// StringFromCLSID
159// Memory allocated here on behalf of application should be freed using CoTaskMemFree()
160// ----------------------------------------------------------------------
161HRESULT WIN32API StringFromCLSID(REFCLSID rclsid, LPOLESTR *ppsz)
162{
163 char tmp[50];
164 LPWSTR szclsid;
165 size_t strLen;
166
167 dprintf(("OLE32: StringFromCLSID"));
168
169 // Setup new string...
170 strLen = sprintf(tmp, "{%08X-%04X-%04X-%02X%02X-%02X%02X%02X%02X%02X%02X}",
171 rclsid->Data1,
172 rclsid->Data2,
173 rclsid->Data3,
174 rclsid->Data4[0],
175 rclsid->Data4[1],
176 rclsid->Data4[2],
177 rclsid->Data4[3],
178 rclsid->Data4[4],
179 rclsid->Data4[5],
180 rclsid->Data4[6],
181 rclsid->Data4[7]);
182
183 // Grab buffer for string...
184 szclsid = (LPWSTR)CoTaskMemAlloc((strLen + 1) * sizeof(WCHAR));
185
186 AsciiToUnicode(tmp, szclsid);
187
188 *ppsz = (LPOLESTR)szclsid;
189
190 return S_OK;
191}
192
193// ----------------------------------------------------------------------
194// StringFromIID
195// Memory allocated here on behalf of application should be freed using CoTaskMemFree()
196// ----------------------------------------------------------------------
197HRESULT WIN32API StringFromIID(REFIID riid, LPOLESTR *ppsz)
198{
199 char tmp[50];
200 LPWSTR sziid;
201 size_t strLen;
202
203 dprintf(("OLE32: StringFromIID"));
204
205 // Setup new string...
206 strLen = sprintf(tmp, "{%08X-%04X-%04X-%02X%02X-%02X%02X%02X%02X%02X%02X}",
207 riid->Data1,
208 riid->Data2,
209 riid->Data3,
210 riid->Data4[0],
211 riid->Data4[1],
212 riid->Data4[2],
213 riid->Data4[3],
214 riid->Data4[4],
215 riid->Data4[5],
216 riid->Data4[6],
217 riid->Data4[7]);
218
219 // Grab buffer for string...
220 sziid = (LPWSTR)CoTaskMemAlloc((strLen + 1) * sizeof(WCHAR));
221
222 AsciiToUnicode(tmp, sziid);
223
224 *ppsz = (LPOLESTR)sziid;
225
226 return S_OK;
227}
228
229// ----------------------------------------------------------------------
230// StringFromGUID2
231// ----------------------------------------------------------------------
232int WIN32API StringFromGUID2(REFGUID rguid, LPOLESTR lpsz, int cbMax)
233{
234 char tmp[64];
235 size_t strLen;
236
237 dprintf(("OLE32: StringFromGUID2"));
238
239 // Setup new string...
240 strLen = sprintf(tmp, "{%08X-%04X-%04X-%02X%02X-%02X%02X%02X%02X%02X%02X}",
241 rguid->Data1,
242 rguid->Data2,
243 rguid->Data3,
244 rguid->Data4[0],
245 rguid->Data4[1],
246 rguid->Data4[2],
247 rguid->Data4[3],
248 rguid->Data4[4],
249 rguid->Data4[5],
250 rguid->Data4[6],
251 rguid->Data4[7]);
252
253 if(cbMax < (strLen * 2 + 1))
254 return 0;
255
256 AsciiToUnicode(tmp, lpsz);
257
258 return(strLen * 2 + 1); // including 0 terminator
259}
260
Note: See TracBrowser for help on using the repository browser.