Add Unicode versions of internal HCR_ registry functions in shell32.dll

Rolf Kalbermatter rolf.kalbermatter at citeng.com
Sat Dec 7 16:38:23 CST 2002


Changelog
 * dlls/shell32/shell32_main.h
   Add Unicode versions of the HCR_ internal functions

 * dlls/shell32/classes.c
   Add Unicode versions of the HCR_ internal functions

These functions are necessary for some of the other functions in shell32 to
convert from ANSI to Unicode.

Rolf Kalbermatter

Index: dlls/shell32/shell32_main.h
===================================================================
RCS file: /home/wine/wine/dlls/shell32/shell32_main.h,v
retrieving revision 1.59
diff -u -r1.59 shell32_main.h
--- dlls/shell32/shell32_main.h	6 Dec 2002 23:20:52 -0000	1.59
+++ dlls/shell32/shell32_main.h	7 Dec 2002 22:28:29 -0000
@@ -57,11 +57,19 @@
 INT SIC_GetIconIndex (LPCSTR sSourceFile, INT dwSourceIndex );
 
 /* Classes Root */
-BOOL HCR_MapTypeToValue ( LPCSTR szExtension, LPSTR szFileType, DWORD len, BOOL bPrependDot);
-BOOL HCR_GetExecuteCommand ( LPCSTR szClass, LPCSTR szVerb, LPSTR szDest, DWORD len );
-BOOL HCR_GetDefaultIcon (LPCSTR szClass, LPSTR szDest, DWORD len, LPDWORD dwNr);
-BOOL HCR_GetClassName (REFIID riid, LPSTR szDest, DWORD len);
-BOOL HCR_GetFolderAttributes (REFIID riid, LPDWORD szDest);
+BOOL HCR_MapTypeToValueW(LPCWSTR szExtension, LPWSTR szFileType, DWORD len, BOOL bPrependDot);
+BOOL HCR_GetExecuteCommandW(LPCWSTR szClass, LPCWSTR szVerb, LPWSTR szDest, DWORD len);
+BOOL HCR_GetDefaultIconW(LPCWSTR szClass, LPWSTR szDest, DWORD len, LPDWORD dwNr);
+BOOL HCR_GetDefaultIconFromGUIDW(REFIID riid, LPWSTR szDest, DWORD len, LPDWORD dwNr);
+BOOL HCR_GetClassNameW(REFIID riid, LPWSTR szDest, DWORD len);
+
+/* ANSI versions of above functions, supposed to go away as soon as they are not used anymore */
+BOOL HCR_MapTypeToValue(LPCSTR szExtension, LPSTR szFileType, DWORD len, BOOL bPrependDot);
+BOOL HCR_GetExecuteCommand(LPCSTR szClass, LPCSTR szVerb, LPSTR szDest, DWORD len);
+BOOL HCR_GetDefaultIcon(LPCSTR szClass, LPSTR szDest, DWORD len, LPDWORD dwNr);
+BOOL HCR_GetClassName(REFIID riid, LPSTR szDest, DWORD len);
+
+BOOL HCR_GetFolderAttributes(REFIID riid, LPDWORD szDest);
 
 INT_PTR CALLBACK AboutDlgProc(HWND,UINT,WPARAM,LPARAM);
 DWORD WINAPI ParseFieldA(LPCSTR src, DWORD nField, LPSTR dst, DWORD len);

Index: dlls/shell32/classes.c
===================================================================
RCS file: /home/wine/wine/dlls/shell32/classes.c,v
retrieving revision 1.25
diff -u -r1.25 classes.c
--- dlls/shell32/classes.c	7 Aug 2002 01:18:41 -0000	1.25
+++ dlls/shell32/classes.c	7 Dec 2002 22:32:42 -0000
@@ -34,42 +34,104 @@
 #include "shlguid.h"
 #include "shresdef.h"
 #include "shlwapi.h"
+#include "wine/unicode.h"
 
 WINE_DEFAULT_DEBUG_CHANNEL(shell);
 
 #define MAX_EXTENSION_LENGTH 20
 
-BOOL HCR_MapTypeToValue ( LPCSTR szExtension, LPSTR szFileType, DWORD len, BOOL bPrependDot)
-{	HKEY	hkey;
+static WCHAR swDot[] = {'.',0};
+
+BOOL HCR_MapTypeToValueW(LPCWSTR szExtension, LPWSTR szFileType, DWORD len, BOOL bPrependDot)
+{	
+	HKEY	hkey;
+	WCHAR	szTemp[MAX_EXTENSION_LENGTH + 2];
+
+	TRACE("%s %p\n", debugstr_w(szExtension), debugstr_w(szFileType));
+
+    /* added because we do not want to have double dots */
+    if (szExtension[0] == '.')
+        bPrependDot = 0;
+
+	if (bPrependDot)
+	  szTemp[0] = '.';
+
+	lstrcpynW(szTemp + (bPrependDot?1:0), szExtension, MAX_EXTENSION_LENGTH);
+
+	if (RegOpenKeyExW(HKEY_CLASSES_ROOT, szTemp, 0, 0x02000000, &hkey))
+	{ 
+	  return FALSE;
+	}
+
+	if (RegQueryValueW(hkey, NULL, szFileType, &len))
+	{ 
+	  RegCloseKey(hkey);
+	  return FALSE;
+	}
+
+	RegCloseKey(hkey);
+
+	TRACE("--UE;\n} %s\n", debugstr_w(szFileType));
+
+	return TRUE;
+}
+
+BOOL HCR_MapTypeToValue(LPCSTR szExtension, LPSTR szFileType, DWORD len, BOOL bPrependDot)
+{
+	HKEY	hkey;
 	char	szTemp[MAX_EXTENSION_LENGTH + 2];
 
-	TRACE("%s %p\n",szExtension, szFileType );
+	TRACE("%s %p\n", szExtension, szFileType);
 
     /* added because we do not want to have double dots */
-    if (szExtension[0]=='.')
-        bPrependDot=0;
+    if (szExtension[0] == '.')
+        bPrependDot = 0;
 
 	if (bPrependDot)
-	  strcpy(szTemp, ".");
+	  szTemp[0] = '.';
 
-	lstrcpynA(szTemp+((bPrependDot)?1:0), szExtension, MAX_EXTENSION_LENGTH);
+	lstrcpynA(szTemp + (bPrependDot?1:0), szExtension, MAX_EXTENSION_LENGTH);
 
-	if (RegOpenKeyExA(HKEY_CLASSES_ROOT,szTemp,0,0x02000000,&hkey))
-	{ return FALSE;
+	if (RegOpenKeyExA(HKEY_CLASSES_ROOT, szTemp, 0, 0x02000000, &hkey))
+	{ 
+	  return FALSE;
 	}
 
-	if (RegQueryValueA(hkey,NULL,szFileType,&len))
-	{ RegCloseKey(hkey);
+	if (RegQueryValueA(hkey, NULL, szFileType, &len))
+	{ 
+	  RegCloseKey(hkey);
 	  return FALSE;
 	}
 
 	RegCloseKey(hkey);
 
-	TRACE("--UE;\n} %s\n", szFileType );
+	TRACE("--UE;\n} %s\n", szFileType);
 
 	return TRUE;
 }
-BOOL HCR_GetExecuteCommand ( LPCSTR szClass, LPCSTR szVerb, LPSTR szDest, DWORD len )
+
+static WCHAR swShell[] = {'\\','s','h','e','l','l','\\',0};
+static WCHAR swCommand[] = {'\\','c','o','m','m','a','n','d',0};
+
+BOOL HCR_GetExecuteCommandW(LPCWSTR szClass, LPCWSTR szVerb, LPWSTR szDest, DWORD len)
+{
+	WCHAR	sTemp[MAX_PATH];
+
+	TRACE("%s %s %p\n",szClass, szVerb, szDest);
+
+	lstrcpyW(sTemp, szClass);
+	lstrcatW(sTemp, swShell);
+	lstrcatW(sTemp, szVerb);
+	lstrcatW(sTemp, swCommand);
+
+	if (ERROR_SUCCESS == SHGetValueW(HKEY_CLASSES_ROOT, sTemp, NULL, NULL, szDest, &len)) {
+	    TRACE("-- %s\n", debugstr_w(szDest) );
+	    return TRUE;
+	}
+	return FALSE;
+}
+
+BOOL HCR_GetExecuteCommand(LPCSTR szClass, LPCSTR szVerb, LPSTR szDest, DWORD len)
 {
 	char	sTemp[MAX_PATH];
 
@@ -83,65 +145,173 @@
 	}
 	return FALSE;
 }
+
 /***************************************************************************************
 *	HCR_GetDefaultIcon	[internal]
 *
 * Gets the icon for a filetype
 */
-BOOL HCR_GetDefaultIcon (LPCSTR szClass, LPSTR szDest, DWORD len, LPDWORD dwNr)
+static WCHAR swDefaultIcon[] = {'\\','D','e','f','a','u','l','t','I','c','o','n',0};
+
+static HRESULT HCR_RegOpenClassIDKey(REFIID riid, HKEY *hkey)
+{
+	char	xriid[50];
+    sprintf( xriid, "CLSID\\{%08lx-%04x-%04x-%02x%02x-%02x%02x%02x%02x%02x%02x}",
+                 riid->Data1, riid->Data2, riid->Data3,
+                 riid->Data4[0], riid->Data4[1], riid->Data4[2], riid->Data4[3],
+                 riid->Data4[4], riid->Data4[5], riid->Data4[6], riid->Data4[7] );
+
+ 	TRACE("%s\n",xriid );
+
+	return RegOpenKeyExA(HKEY_CLASSES_ROOT, xriid, 0, KEY_READ, hkey);
+}
+
+static BOOL HCR_RegGetDefaultIconW(HKEY hkey, LPWSTR szDest, DWORD len, LPDWORD dwNr)
+{
+	DWORD dwType;
+	WCHAR sTemp[MAX_PATH];
+	WCHAR sNum[5];
+
+	if (!RegQueryValueExW(hkey, NULL, 0, &dwType, (LPBYTE)szDest, &len))
+	{
+      if (dwType == REG_EXPAND_SZ)
+	  {
+	    ExpandEnvironmentStringsW(szDest, sTemp, MAX_PATH);
+	    lstrcpynW(szDest, sTemp, len);
+	  }
+	  if (ParseFieldW (szDest, 2, sNum, 5))
+             *dwNr = atoiW(sNum);
+          else
+             *dwNr=0; /* sometimes the icon number is missing */
+	  ParseFieldW (szDest, 1, szDest, len);
+	  return TRUE;
+	}
+	return FALSE;
+}
+
+BOOL HCR_RegGetDefaultIcon(HKEY hkey, LPSTR szDest, DWORD len, LPDWORD dwNr)
+{
+	DWORD dwType;
+	char sTemp[MAX_PATH];
+	char  sNum[5];
+
+	if (!RegQueryValueExA(hkey, NULL, 0, &dwType, szDest, &len))
+	{
+      if (dwType == REG_EXPAND_SZ)
+	  {
+	    ExpandEnvironmentStringsA(szDest, sTemp, MAX_PATH);
+	    lstrcpynA(szDest, sTemp, len);
+	  }
+	  if (ParseFieldA (szDest, 2, sNum, 5))
+             *dwNr=atoi(sNum);
+          else
+             *dwNr=0; /* sometimes the icon number is missing */
+	  ParseFieldA (szDest, 1, szDest, len);
+	  return TRUE;
+	}
+	return FALSE;
+}
+
+static BOOL HCR_GetDefaultIconW(LPCWSTR szClass, LPWSTR szDest, DWORD len, LPDWORD dwNr)
+{
+	HKEY	hkey;
+	WCHAR	sTemp[MAX_PATH];
+	BOOL	ret = FALSE;
+
+	TRACE("%s\n",szClass );
+
+	lstrcpynW(sTemp, szClass, MAX_PATH);
+	lstrcatW(sTemp, swDefaultIcon);
+
+	if (!RegOpenKeyExW(HKEY_CLASSES_ROOT, sTemp, 0, 0x02000000, &hkey))
+	{
+	  ret = HCR_RegGetDefaultIconW(hkey, szDest, len, dwNr);
+	  RegCloseKey(hkey);
+	}
+	TRACE("-- %s %li\n", debugstr_w(szDest), *dwNr );
+	return ret;
+}
+
+BOOL HCR_GetDefaultIcon(LPCSTR szClass, LPSTR szDest, DWORD len, LPDWORD dwNr)
 {
 	HKEY	hkey;
 	char	sTemp[MAX_PATH];
-	char	sNum[5];
-	DWORD	dwType;
 	BOOL	ret = FALSE;
 
 	TRACE("%s\n",szClass );
 
 	sprintf(sTemp, "%s\\DefaultIcon",szClass);
 
-	if (!RegOpenKeyExA(HKEY_CLASSES_ROOT,sTemp,0,0x02000000,&hkey))
+	if (!RegOpenKeyExA(HKEY_CLASSES_ROOT, sTemp, 0, 0x02000000, &hkey))
 	{
-	  if (!RegQueryValueExA(hkey, NULL, 0, &dwType, szDest, &len))
-	  {
-	    if (dwType == REG_EXPAND_SZ)
-	    {
-	      ExpandEnvironmentStringsA(szDest, sTemp, MAX_PATH);
-	      strcpy(szDest, sTemp);
-	    }
-	    if (ParseFieldA (szDest, 2, sNum, 5))
-               *dwNr=atoi(sNum);
-            else
-               *dwNr=0; /* sometimes the icon number is missing */
-	    ParseFieldA (szDest, 1, szDest, len);
-	    ret = TRUE;
-	  }
+	  ret = HCR_RegGetDefaultIcon(hkey, szDest, len, dwNr);
 	  RegCloseKey(hkey);
 	}
 	TRACE("-- %s %li\n", szDest, *dwNr );
 	return ret;
 }
 
+BOOL HCR_GetDefaultIconFromGUIDW(REFIID riid, LPWSTR szDest, DWORD len, LPDWORD dwNr)
+{
+	HKEY	hkey;
+	BOOL	ret = FALSE;
+
+	if (!HCR_RegOpenClassIDKey(riid, &hkey))
+	{
+	  ret = HCR_RegGetDefaultIconW(hkey, szDest, len, dwNr);
+	  RegCloseKey(hkey);
+	}
+	TRACE("-- %s %li\n", debugstr_w(szDest), *dwNr );
+	return ret;
+}
+
 /***************************************************************************************
 *	HCR_GetClassName	[internal]
 *
 * Gets the name of a registred class
 */
-BOOL HCR_GetClassName (REFIID riid, LPSTR szDest, DWORD len)
-{	HKEY	hkey;
-	char	xriid[50];
+static WCHAR swEmpty[] = {0};
+
+BOOL HCR_GetClassNameW(REFIID riid, LPWSTR szDest, DWORD len)
+{	
+	HKEY	hkey;
 	BOOL ret = FALSE;
 	DWORD buflen = len;
 
-        sprintf( xriid, "CLSID\\{%08lx-%04x-%04x-%02x%02x-%02x%02x%02x%02x%02x%02x}",
-                 riid->Data1, riid->Data2, riid->Data3,
-                 riid->Data4[0], riid->Data4[1], riid->Data4[2], riid->Data4[3],
-                 riid->Data4[4], riid->Data4[5], riid->Data4[6], riid->Data4[7] );
+ 	szDest[0] = 0;
+	if (HCR_RegOpenClassIDKey(riid, &hkey))
+	{
+	  if (!RegQueryValueExW(hkey, swEmpty, 0, NULL, (LPBYTE)szDest, &len))
+	  {
+	    ret = TRUE;
+	  }
+	  RegCloseKey(hkey);
+	}
+
+	if (!ret || !szDest[0])
+	{
+	  if(IsEqualIID(riid, &CLSID_ShellDesktop))
+	  {
+	    if (LoadStringW(shell32_hInstance, IDS_DESKTOP, szDest, buflen))
+	      ret = TRUE;
+	  }
+	  else if (IsEqualIID(riid, &CLSID_MyComputer))
+	  {
+	    if(LoadStringW(shell32_hInstance, IDS_MYCOMPUTER, szDest, buflen))
+	      ret = TRUE;
+	  }
+	}
+	TRACE("-- %s\n", debugstr_w(szDest));
+	return ret;
+}
 
-	TRACE("%s\n",xriid );
+BOOL HCR_GetClassName(REFIID riid, LPSTR szDest, DWORD len)
+{	HKEY	hkey;
+	BOOL ret = FALSE;
+	DWORD buflen = len;
 
 	szDest[0] = 0;
-	if (!RegOpenKeyExA(HKEY_CLASSES_ROOT,xriid,0,KEY_READ,&hkey))
+	if (HCR_RegOpenClassIDKey(riid, &hkey))
 	{
 	  if (!RegQueryValueExA(hkey,"",0,NULL,szDest,&len))
 	  {




More information about the wine-patches mailing list