/* * REGDB.C * * Functions to query the registration database * * OleStdGetMiscStatusOfClass * OleStdGetDefaultFileFormatOfClass * OleStdGetAuxUserType * OleStdGetUserTypeOfClass * * (c) Copyright Microsoft Corp. 1992-1993 All Rights Reserved * */ #define STRICT 1 #include "ole2ui.h" #include "common.h" #include OLEDBGDATA // Replacement for stdlib atol, // which didn't work and doesn't take far pointers. // Must be tolerant of leading spaces. // // static LONG Atol(LPTSTR lpsz) { signed int sign = +1; UINT base = 10; LONG l = 0; if (NULL==lpsz) { OleDbgAssert (0); return 0; } while (isspace(*lpsz)) lpsz++; if (*lpsz=='-') { lpsz++; sign = -1; } if (lpsz[0]==TEXT('0') && lpsz[1]==TEXT('x')) { base = 16; lpsz+=2; } if (base==10) { while (isdigit(*lpsz)) { l = l * base + *lpsz - '0'; lpsz++; } } else { OleDbgAssert (base==16); while (isxdigit(*lpsz)) { l = l * base + isdigit(*lpsz) ? *lpsz - '0' : toupper(*lpsz) - 'A' + 10; lpsz++; } } return l * sign; } /* * OleStdGetUserTypeOfClass(REFCLSID, LPSTR, UINT, HKEY) * * Purpose: * Returns the user type (human readable class name) of the specified class. * * Parameters: * rclsid pointer to the clsid to retrieve user type of. * lpszUserType pointer to buffer to return user type in. * cch length of buffer pointed to by lpszUserType * hKey hKey for reg db - if this is NULL, then we * open and close the reg db within this function. If it * is non-NULL, then we assume it's a valid key to the * \ root and use it without closing it. (useful * if you're doing lots of reg db stuff). * * Return Value: * UINT Number of characters in returned string. 0 on error. * */ STDAPI_(UINT) OleStdGetUserTypeOfClass(REFCLSID rclsid, LPTSTR lpszUserType, UINT cch, HKEY hKey) { LONG dw; LONG lRet; LPSTR lpszCLSID, lpszProgID; BOOL fFreeProgID = FALSE; BOOL bCloseRegDB = FALSE; TCHAR szKey[128]; LPMALLOC lpIMalloc; if (!lpszUserType) return 0; *lpszUserType = TEXT('\0'); if (hKey == NULL) { //Open up the root key. lRet=RegOpenKey(HKEY_CLASSES_ROOT, NULL, &hKey); if ((LONG)ERROR_SUCCESS!=lRet) return (UINT)FALSE; bCloseRegDB = TRUE; } // Get a string containing the class name StringFromCLSIDA(rclsid, &lpszCLSID); wsprintf(szKey, TEXT("CLSID\\%s"), lpszCLSID); dw=cch; lRet = RegQueryValue(hKey, szKey, lpszUserType, &dw); if ((LONG)ERROR_SUCCESS!=lRet) { // Load 'Unknown Source' and 'Unknown Type' strings dw = (LONG)LoadString(ghInst, IDS_PSUNKNOWNTYPE, lpszUserType, cch); } if ( ((LONG)ERROR_SUCCESS!=lRet) && (CoIsOle1Class(rclsid)) ) { // We've got an OLE 1.0 class, so let's try to get the user type // name from the ProgID entry. ProgIDFromCLSIDA(rclsid, &lpszProgID); fFreeProgID = TRUE; dw = cch; lRet = RegQueryValue(hKey, lpszProgID, lpszUserType, &dw); if ((LONG)ERROR_SUCCESS != lRet) dw = 0; } if (NOERROR == CoGetMalloc(MEMCTX_TASK, &lpIMalloc)) { if (fFreeProgID) lpIMalloc->lpVtbl->Free(lpIMalloc, (LPVOID)lpszProgID); lpIMalloc->lpVtbl->Free(lpIMalloc, (LPVOID)lpszCLSID); lpIMalloc->lpVtbl->Release(lpIMalloc); } if (bCloseRegDB) RegCloseKey(hKey); return (UINT)dw; } /* * OleStdGetAuxUserType(RCLSID, WORD, LPSTR, int, HKEY) * * Purpose: * Returns the specified AuxUserType from the reg db. * * Parameters: * rclsid pointer to the clsid to retrieve aux user type of. * hKey hKey for reg db - if this is NULL, then we * open and close the reg db within this function. If it * is non-NULL, then we assume it's a valid key to the * \ root and use it without closing it. (useful * if you're doing lots of reg db stuff). * wAuxUserType which aux user type field to look for. In 4/93 release * 2 is short name and 3 is exe name. * lpszUserType pointer to buffer to return user type in. * cch length of buffer pointed to by lpszUserType * * Return Value: * UINT Number of characters in returned string. 0 on error. * */ STDAPI_(UINT) OleStdGetAuxUserType(REFCLSID rclsid, WORD wAuxUserType, LPTSTR lpszAuxUserType, int cch, HKEY hKey) { HKEY hThisKey; BOOL fCloseRegDB = FALSE; LONG dw; LRESULT lRet; LPTSTR lpszCLSID; LPMALLOC lpIMalloc; TCHAR szKey[OLEUI_CCHKEYMAX]; TCHAR szTemp[32]; lpszAuxUserType[0] = TEXT('\0'); if (NULL == hKey) { lRet = RegOpenKey(HKEY_CLASSES_ROOT, NULL, &hThisKey); if (ERROR_SUCCESS != lRet) return 0; } else hThisKey = hKey; StringFromCLSIDA(rclsid, &lpszCLSID); lstrcpy(szKey, TEXT("CLSID\\")); lstrcat(szKey, lpszCLSID); wsprintf(szTemp, TEXT("\\AuxUserType\\%d"), wAuxUserType); lstrcat(szKey, szTemp); dw = cch; lRet = RegQueryValue(hThisKey, szKey, lpszAuxUserType, &dw); if (ERROR_SUCCESS != lRet) { dw = 0; lpszAuxUserType[0] = TEXT('\0'); } if (fCloseRegDB) RegCloseKey(hThisKey); if (NOERROR == CoGetMalloc(MEMCTX_TASK, &lpIMalloc)) { lpIMalloc->lpVtbl->Free(lpIMalloc, (LPVOID)lpszCLSID); lpIMalloc->lpVtbl->Release(lpIMalloc); } return (UINT)dw; } /* * OleStdGetMiscStatusOfClass(REFCLSID, HKEY) * * Purpose: * Returns the value of the misc status for the given clsid. * * Parameters: * rclsid pointer to the clsid to retrieve user type of. * hKey hKey for reg db - if this is NULL, then we * open and close the reg db within this function. If it * is non-NULL, then we assume it's a valid key to the * \\CLSID root and use it without closing it. (useful * if you're doing lots of reg db stuff). * * Return Value: * BOOL TRUE on success, FALSE on failure. * */ STDAPI_(BOOL) OleStdGetMiscStatusOfClass(REFCLSID rclsid, HKEY hKey, DWORD FAR * lpdwValue) { DWORD dw; LONG lRet; LPTSTR lpszCLSID; TCHAR szKey[64]; TCHAR szMiscStatus[OLEUI_CCHKEYMAX]; BOOL bCloseRegDB = FALSE; if (hKey == NULL) { //Open up the root key. lRet=RegOpenKey(HKEY_CLASSES_ROOT, TEXT("CLSID"), &hKey); if ((LONG)ERROR_SUCCESS!=lRet) return FALSE; bCloseRegDB = TRUE; } // Get a string containing the class name StringFromCLSIDA(rclsid, &lpszCLSID); // Construct key lstrcpy(szKey, lpszCLSID); lstrcat(szKey, TEXT("\\MiscStatus")); dw=OLEUI_CCHKEYMAX_SIZE; lRet = RegQueryValue(hKey, szKey, (LPTSTR)szMiscStatus, &dw); if ((LONG)ERROR_SUCCESS!=lRet) { OleStdFreeString(lpszCLSID, NULL); if (bCloseRegDB) RegCloseKey(hKey); return FALSE; } *lpdwValue = Atol((LPTSTR)szMiscStatus); OleStdFreeString(lpszCLSID, NULL); if (bCloseRegDB) RegCloseKey(hKey); return TRUE; } /* * CLIPFORMAT OleStdGetDefaultFileFormatOfClass(REFCLSID, HKEY) * * Purpose: * Returns the default file format of the specified class. * this is entered in REGDB as follows: * CLSID\{...}\DataFormats\DefaultFile = * * Parameters: * rclsid pointer to the clsid to retrieve user type of. * hKey hKey for reg db- if this is NULL, then we * open and close the reg db within this function. If it * is non-NULL, then we assume it's a valid key to the * \ root and use it without closing it. (useful * if you're doing lots of reg db stuff). * * Return Value: * cfFmt -- DefaultFile format * NULL -- failed to get default file format * */ STDAPI_(CLIPFORMAT) OleStdGetDefaultFileFormatOfClass( REFCLSID rclsid, HKEY hKey ) { CLIPFORMAT cfFmt = 0; DWORD dw; LONG lRet; LPTSTR lpszCLSID; BOOL bCloseRegDB = FALSE; TCHAR szKey[128]; TCHAR szDefaultFile[OLEUI_CCHKEYMAX]; BOOL bStatus = TRUE; if (hKey == NULL) { //Open up the root key. lRet=RegOpenKey(HKEY_CLASSES_ROOT, NULL, &hKey); if ((LONG)ERROR_SUCCESS!=lRet) return 0; bCloseRegDB = TRUE; } // Get a string containing the class name StringFromCLSIDA(rclsid, &lpszCLSID); // Construct key wsprintf(szKey, TEXT("CLSID\\%s\\DataFormats\\DefaultFile"), lpszCLSID); OleStdFreeString(lpszCLSID, NULL); dw=OLEUI_CCHKEYMAX_SIZE; lRet = RegQueryValue(hKey, szKey, (LPTSTR)szDefaultFile, (LONG FAR *)&dw); if ((LONG)ERROR_SUCCESS!=lRet) bStatus = FALSE; else { /* if the format is a number, then it should refer to one of the ** standard Windows formats. */ if (isdigit(szDefaultFile[0])) cfFmt = (CLIPFORMAT)Atol(szDefaultFile); else cfFmt = RegisterClipboardFormat(szDefaultFile); } if (bCloseRegDB) RegCloseKey(hKey); return cfFmt; }