PATCH: ProgIDFromCLSID
Marcus Meissner
meissner at suse.de
Thu Jul 25 04:14:31 CDT 2002
Hi,
Tested with MS Access 2.
Ciao, Marcus
License: LGPL
Changelog:
Factored out the OLE 16 bit allocator from StringFromCLSID.
Implemented ProgIDFromCLSID16.
Index: compobj.c
===================================================================
RCS file: /home/wine/wine/dlls/ole32/compobj.c,v
retrieving revision 1.61
diff -u -r1.61 compobj.c
--- compobj.c 23 Jul 2002 01:59:46 -0000 1.61
+++ compobj.c 25 Jul 2002 09:11:03 -0000
@@ -587,46 +587,65 @@
return S_OK;
}
+extern BOOL WINAPI K32WOWCallback16Ex( DWORD vpfn16, DWORD dwFlags,
+ DWORD cbArgs, LPVOID pArgs,
+ LPDWORD pdwRetCode );
+
+/******************************************************************************
+ * _xmalloc16 [internal]
+ * Allocates size bytes from the standard ole16 allocator.
+ *
+ * RETURNS
+ * the allocated segmented pointer and a HRESULT
+ */
+HRESULT
+_xmalloc16(DWORD size, SEGPTR *ptr) {
+ LPMALLOC16 mllc;
+ DWORD args[2];
+
+ if (CoGetMalloc16(0,&mllc))
+ return E_OUTOFMEMORY;
+
+ args[0] = (DWORD)mllc;
+ args[1] = size;
+ /* No need for a Callback entry, we have WOWCallback16Ex which does
+ * everything we need.
+ */
+ if (!K32WOWCallback16Ex(
+ (DWORD)((ICOM_VTABLE(IMalloc16)*)MapSL(
+ (SEGPTR)ICOM_VTBL(((LPMALLOC16)MapSL((SEGPTR)mllc))))
+ )->Alloc,
+ WCB16_CDECL,
+ 2*sizeof(DWORD),
+ (LPVOID)args,
+ (LPDWORD)ptr
+ )) {
+ ERR("CallTo16 IMalloc16 (%ld) failed\n",size);
+ return E_FAIL;
+ }
+ return S_OK;
+}
+
/******************************************************************************
* StringFromCLSID [COMPOBJ.19]
* Converts a GUID into the respective string representation.
* The target string is allocated using the OLE IMalloc.
+ *
* RETURNS
* the string representation and HRESULT
*/
+
HRESULT WINAPI StringFromCLSID16(
- REFCLSID id, /* [in] the GUID to be converted */
- LPOLESTR16 *idstr /* [out] a pointer to a to-be-allocated segmented pointer pointing to the resulting string */
+ REFCLSID id, /* [in] the GUID to be converted */
+ LPOLESTR16 *idstr /* [out] a pointer to a to-be-allocated segmented pointer pointing to the resulting string */
) {
- extern BOOL WINAPI K32WOWCallback16Ex( DWORD vpfn16, DWORD dwFlags,
- DWORD cbArgs, LPVOID pArgs, LPDWORD pdwRetCode );
- LPMALLOC16 mllc;
- HRESULT ret;
- DWORD args[2];
-
- ret = CoGetMalloc16(0,&mllc);
- if (ret) return ret;
-
- args[0] = (DWORD)mllc;
- args[1] = 40;
-
- /* No need for a Callback entry, we have WOWCallback16Ex which does
- * everything we need.
- */
- if (!K32WOWCallback16Ex(
- (DWORD)((ICOM_VTABLE(IMalloc16)*)MapSL(
- (SEGPTR)ICOM_VTBL(((LPMALLOC16)MapSL((SEGPTR)mllc))))
- )->Alloc,
- WCB16_CDECL,
- 2*sizeof(DWORD),
- (LPVOID)args,
- (LPDWORD)idstr
- )) {
- WARN("CallTo16 IMalloc16 failed\n");
- return E_FAIL;
- }
- return WINE_StringFromCLSID(id,MapSL((SEGPTR)*idstr));
+ HRESULT ret;
+
+ ret = _xmalloc16(40,(SEGPTR*)idstr);
+ if (ret != S_OK)
+ return ret;
+ return WINE_StringFromCLSID(id,MapSL((SEGPTR)*idstr));
}
/******************************************************************************
@@ -726,6 +745,51 @@
HeapFree(GetProcessHeap(), 0, buf2);
}
+ RegCloseKey(xhkey);
+ return ret;
+}
+
+/******************************************************************************
+ * ProgIDFromCLSID [COMPOBJ.62]
+ * Converts a class id into the respective Program ID. (By using a registry lookup)
+ * RETURNS S_OK on success
+ * riid associated with the progid
+ */
+HRESULT WINAPI ProgIDFromCLSID16(
+ REFCLSID clsid, /* [in] class id as found in registry */
+ LPOLESTR16 *lplpszProgID/* [out] associated Prog ID */
+) {
+ char strCLSID[50], *buf, *buf2;
+ DWORD buf2len;
+ HKEY xhkey;
+ HRESULT ret = S_OK;
+
+ WINE_StringFromCLSID(clsid, strCLSID);
+
+ buf = HeapAlloc(GetProcessHeap(), 0, strlen(strCLSID)+14);
+ sprintf(buf,"CLSID\\%s\\ProgID", strCLSID);
+ if (RegOpenKeyA(HKEY_CLASSES_ROOT, buf, &xhkey))
+ ret = REGDB_E_CLASSNOTREG;
+
+ HeapFree(GetProcessHeap(), 0, buf);
+
+ if (ret == S_OK)
+ {
+ buf2 = HeapAlloc(GetProcessHeap(), 0, 255);
+ buf2len = 255;
+ if (RegQueryValueA(xhkey, NULL, buf2, &buf2len))
+ ret = REGDB_E_CLASSNOTREG;
+
+ if (ret == S_OK)
+ {
+ ret = _xmalloc16(buf2len+1, (SEGPTR*)lplpszProgID);
+ if (ret != S_OK)
+ return ret;
+ strcpy(MapSL((SEGPTR)*lplpszProgID),buf2);
+ ret = S_OK;
+ }
+ HeapFree(GetProcessHeap(), 0, buf2);
+ }
RegCloseKey(xhkey);
return ret;
}
Index: compobj.spec
===================================================================
RCS file: /home/wine/wine/dlls/ole32/compobj.spec,v
retrieving revision 1.7
diff -u -r1.7 compobj.spec
--- compobj.spec 21 Jun 2002 19:15:48 -0000 1.7
+++ compobj.spec 25 Jul 2002 09:11:03 -0000
@@ -59,7 +59,7 @@
59 stub _IID_IDFRESERVED3
60 stub _IID_IMESSAGEFILTER
61 pascal CLSIDFromProgID(str ptr) CLSIDFromProgID16
-62 stub PROGIDFROMCLSID
+62 pascal ProgIDFromCLSID(ptr ptr) ProgIDFromCLSID16
63 pascal CoLockObjectExternal(segptr word word) CoLockObjectExternal16
64 stub _CLSID_STDMARSHAL
65 stub COGETTREATASCLASS
More information about the wine-patches
mailing list