Fix shell32.SHBrowseForFolder W -> A calls

Rolf Kalbermatter rolf.kalbermatter at citeng.com
Thu Dec 12 10:20:47 CST 2002


Changelog
  * dlls/shell32/brsfolder.c
  Fix shell32.SHBrowseForFolder W -> A calls

Rolf Kalbermatter

Index: dlls/shell32/brsfolder.c
===================================================================
RCS file: /home/wine/wine/dlls/shell32/brsfolder.c,v
retrieving revision 1.42
diff -u -r1.42 brsfolder.c
--- dlls/shell32/brsfolder.c	21 Nov 2002 23:56:42 -0000	1.42
+++ dlls/shell32/brsfolder.c	12 Dec 2002 15:40:12 -0000
@@ -35,7 +35,7 @@
 WINE_DEFAULT_DEBUG_CHANNEL(shell);
 
 static HWND		hwndTreeView;
-static LPBROWSEINFOA	lpBrowseInfo;
+static LPBROWSEINFOW	lpBrowseInfo;
 static LPITEMIDLIST	pidlRet;
 
 static void FillTreeView(LPSHELLFOLDER lpsf, LPITEMIDLIST  lpifq, HTREEITEM hParent);
@@ -84,12 +84,12 @@
 }
 
 static int GetIcon(LPITEMIDLIST lpi, UINT uFlags)
-{	SHFILEINFOA    sfi;
-	SHGetFileInfoA((LPCSTR)lpi,0,&sfi, sizeof(SHFILEINFOA), uFlags);
+{	SHFILEINFOW    sfi;
+	SHGetFileInfoW((LPCWSTR)lpi, 0 ,&sfi, sizeof(SHFILEINFOW), uFlags);
 	return sfi.iIcon;
 }
 
-static void GetNormalAndSelectedIcons(LPITEMIDLIST lpifq,LPTVITEMA lpTV_ITEM)
+static void GetNormalAndSelectedIcons(LPITEMIDLIST lpifq, LPTVITEMW lpTV_ITEM)
 {	TRACE("%p %p\n",lpifq, lpTV_ITEM);
 
 	lpTV_ITEM->iImage = GetIcon(lpifq, SHGFI_PIDL | SHGFI_SYSICONINDEX | SHGFI_SMALLICON);
@@ -105,7 +105,7 @@
    LPITEMIDLIST  lpifq;
 } TV_ITEMDATA, *LPTV_ITEMDATA;
 
-static BOOL GetName(LPSHELLFOLDER lpsf, LPITEMIDLIST lpi, DWORD dwFlags, LPSTR lpFriendlyName)
+static BOOL GetName(LPSHELLFOLDER lpsf, LPITEMIDLIST lpi, DWORD dwFlags, LPWSTR lpFriendlyName)
 {
 	BOOL   bSuccess=TRUE;
 	STRRET str;
@@ -113,7 +113,7 @@
 	TRACE("%p %p %lx %p\n", lpsf, lpi, dwFlags, lpFriendlyName);
 	if (SUCCEEDED(IShellFolder_GetDisplayNameOf(lpsf, lpi, dwFlags, &str)))
 	{
-	  if(FAILED(StrRetToStrNA (lpFriendlyName, MAX_PATH, &str, lpi)))
+	  if (FAILED(StrRetToStrNW(lpFriendlyName, MAX_PATH, &str, lpi)))
 	  {
 	      bSuccess = FALSE;
 	  }
@@ -121,28 +121,28 @@
 	else
 	  bSuccess = FALSE;
 
-	TRACE("-- %s\n",lpFriendlyName);
+	TRACE("-- %s\n", debugstr_w(lpFriendlyName));
 	return bSuccess;
 }
 
 static void FillTreeView(IShellFolder * lpsf, LPITEMIDLIST  pidl, HTREEITEM hParent)
 {
-	TVITEMA 	tvi;
-	TVINSERTSTRUCTA	tvins;
+	TVITEMW 	tvi;
+	TVINSERTSTRUCTW	tvins;
 	HTREEITEM	hPrev = 0;
 	LPENUMIDLIST	lpe=0;
 	LPITEMIDLIST	pidlTemp=0;
 	LPTV_ITEMDATA	lptvid=0;
 	ULONG		ulFetched;
 	HRESULT		hr;
-	char		szBuff[256];
+	WCHAR		szBuff[MAX_PATH];
 	HWND		hwnd=GetParent(hwndTreeView);
 
 	TRACE("%p %p %x\n",lpsf, pidl, (INT)hParent);
 	SetCapture(GetParent(hwndTreeView));
 	SetCursor(LoadCursorA(0, IDC_WAITA));
 
-	hr=IShellFolder_EnumObjects(lpsf,hwnd, SHCONTF_FOLDERS | SHCONTF_NONFOLDERS,&lpe);
+	hr=IShellFolder_EnumObjects(lpsf, hwnd, SHCONTF_FOLDERS | SHCONTF_NONFOLDERS, &lpe);
 
 	if (SUCCEEDED(hr))
 	{ while (NOERROR == IEnumIDList_Next(lpe,1,&pidlTemp,&ulFetched))
@@ -157,7 +157,7 @@
 	           tvi.mask |= TVIF_CHILDREN;
 	        }
 
-	        if (!( lptvid = (LPTV_ITEMDATA)SHAlloc(sizeof(TV_ITEMDATA))))
+	        if (!(lptvid = (LPTV_ITEMDATA)SHAlloc(sizeof(TV_ITEMDATA))))
 		    goto Done;
 
 	        if (!GetName(lpsf, pidlTemp, SHGDN_NORMAL, szBuff))
@@ -177,7 +177,7 @@
 	        tvins.hInsertAfter = hPrev;
 	        tvins.hParent      = hParent;
 
-	        hPrev = (HTREEITEM)TreeView_InsertItemA (hwndTreeView, &tvins);
+	        hPrev = (HTREEITEM)TreeView_InsertItemW(hwndTreeView, &tvins);
 
 	      }
 	    }
@@ -188,7 +188,7 @@
 
 Done:
 	ReleaseCapture();
-	SetCursor(LoadCursorA(0, IDC_ARROWA));
+	SetCursor(LoadCursorW(0, IDC_ARROWW));
 
 	if (lpe)
 	  IEnumIDList_Release(lpe);
@@ -198,7 +198,7 @@
 
 static LRESULT MsgNotify(HWND hWnd,  UINT CtlID, LPNMHDR lpnmh)
 {
-	NMTREEVIEWA	*pnmtv   = (NMTREEVIEWA *)lpnmh;
+	NMTREEVIEWW	*pnmtv   = (NMTREEVIEWW *)lpnmh;
 	LPTV_ITEMDATA	lptvid;  /* Long pointer to TreeView item data */
 	IShellFolder *	lpsf2=0;
 
@@ -208,9 +208,10 @@
 	switch (pnmtv->hdr.idFrom)
 	{ case IDD_TREEVIEW:
 	    switch (pnmtv->hdr.code)
-	    { case TVN_DELETEITEMA: case TVN_DELETEITEMW:
+	    { case TVN_DELETEITEMA:
+	      case TVN_DELETEITEMW:
 	        { FIXME("TVN_DELETEITEMA/W\n");
-		  lptvid=(LPTV_ITEMDATA)pnmtv->itemOld.lParam;
+	          lptvid=(LPTV_ITEMDATA)pnmtv->itemOld.lParam;
 	          IShellFolder_Release(lptvid->lpsfParent);
 	          SHFree(lptvid->lpi);
 	          SHFree(lptvid->lpifq);
@@ -218,7 +219,8 @@
 		}
 	        break;
 
-	      case TVN_ITEMEXPANDINGA: case TVN_ITEMEXPANDINGW:
+	      case TVN_ITEMEXPANDINGA:
+	      case TVN_ITEMEXPANDINGW:
 		{ FIXME("TVN_ITEMEXPANDINGA/W\n");
 		  if ((pnmtv->itemNew.state & TVIS_EXPANDEDONCE))
 	            break;
@@ -230,7 +232,8 @@
 	          TreeView_SortChildren(hwndTreeView, pnmtv->itemNew.hItem, FALSE);
 		}
 	        break;
-	      case TVN_SELCHANGEDA: case TVN_SELCHANGEDW:
+	      case TVN_SELCHANGEDA:
+	      case TVN_SELCHANGEDW:
 	        lptvid=(LPTV_ITEMDATA)pnmtv->itemNew.lParam;
 		pidlRet = lptvid->lpifq;
 		if (lpBrowseInfo->lpfn)
@@ -254,29 +257,29 @@
 /*************************************************************************
  *             BrsFolderDlgProc32  (not an exported API function)
  */
-static INT_PTR CALLBACK BrsFolderDlgProc( HWND hWnd, UINT msg, WPARAM wParam,
+static INT_PTR CALLBACK BrsFolderDlgProc(HWND hWnd, UINT msg, WPARAM wParam,
 				     LPARAM lParam )
 {
-       TRACE("hwnd=%p msg=%04x 0x%08x 0x%08lx\n", hWnd,  msg, wParam, lParam );
+	TRACE("hwnd=%p msg=%04x 0x%08x 0x%08lx\n", hWnd,  msg, wParam, lParam );
 
 	switch(msg)
 	{ case WM_INITDIALOG:
 	    pidlRet = NULL;
-	    lpBrowseInfo = (LPBROWSEINFOA) lParam;
+	    lpBrowseInfo = (LPBROWSEINFOW) lParam;
 	    if (lpBrowseInfo->ulFlags & ~(BIF_STATUSTEXT))
 	      FIXME("flags %x not implemented\n", lpBrowseInfo->ulFlags & ~(BIF_STATUSTEXT));
 	    if (lpBrowseInfo->lpszTitle) {
-	       SetWindowTextA(GetDlgItem(hWnd, IDD_TITLE), lpBrowseInfo->lpszTitle);
+	       SetWindowTextW(GetDlgItem(hWnd, IDD_TITLE), lpBrowseInfo->lpszTitle);
 	    } else {
 	       ShowWindow(GetDlgItem(hWnd, IDD_TITLE), SW_HIDE);
 	    }
 	    if (!(lpBrowseInfo->ulFlags & BIF_STATUSTEXT))
 	       ShowWindow(GetDlgItem(hWnd, IDD_STATUS), SW_HIDE);
 
-	    if ( lpBrowseInfo->pidlRoot )
+	    if (lpBrowseInfo->pidlRoot )
 	      FIXME("root is desktop\n");
 
-	    InitializeTreeView( hWnd, lpBrowseInfo->pidlRoot );
+	    InitializeTreeView(hWnd, lpBrowseInfo->pidlRoot);
 
 	    if (lpBrowseInfo->lpfn) {
 	       (lpBrowseInfo->lpfn)(hWnd, BFFM_INITIALIZED, 0, lpBrowseInfo->lParam);
@@ -292,8 +295,8 @@
 	  case WM_COMMAND:
 	    switch (wParam)
 	    { case IDOK:
-		pdump ( pidlRet );
-		SHGetPathFromIDListA(pidlRet, lpBrowseInfo->pszDisplayName);
+	        pdump ( pidlRet );
+	        SHGetPathFromIDListW(pidlRet, lpBrowseInfo->pszDisplayName);
 	        EndDialog(hWnd, (DWORD) ILClone(pidlRet));
 	        return TRUE;
 
@@ -330,59 +333,77 @@
 	return FALSE;
 }
 
+static WCHAR swBrowseTempName[] = {'S','H','B','R','S','F','O','R','F','O','L','D','E','R','_','M','S','G','B','O','X',0};
+
 /*************************************************************************
  * SHBrowseForFolderA [SHELL32.@]
  * SHBrowseForFolder  [SHELL32.@]
- *
  */
 LPITEMIDLIST WINAPI SHBrowseForFolderA (LPBROWSEINFOA lpbi)
 {
-	TRACE("(%p{lpszTitle=%s,owner=%p})\n",
-	      lpbi, debugstr_a(lpbi->lpszTitle), lpbi->hwndOwner);
+	BROWSEINFOW bi;
+	LPITEMIDLIST lpid;
+	INT len;
+	
+	TRACE("(%p{lpszTitle=%s,owner=%p})\n", lpbi,
+	    lpbi ? debugstr_a(lpbi->lpszTitle) : NULL, lpbi ? lpbi->hwndOwner : NULL);
+
+	if (!lpbi)
+	  return NULL;
+
+	bi.hwndOwner = lpbi->hwndOwner;
+	bi.pidlRoot = lpbi->pidlRoot;
+	if (lpbi->pszDisplayName)
+	{
+	  len = MultiByteToWideChar(CP_ACP, 0, lpbi->pszDisplayName, -1, NULL, 0);
+	  bi.pszDisplayName = HeapAlloc(GetProcessHeap(), 0, len * sizeof(WCHAR));
+	  MultiByteToWideChar(CP_ACP, 0, lpbi->pszDisplayName, -1, bi.pszDisplayName, len);
+	}
+	else
+	  bi.pszDisplayName = NULL;
+
+	if (lpbi->lpszTitle)
+	{
+	  len = MultiByteToWideChar(CP_ACP, 0, lpbi->lpszTitle, -1, NULL, 0);
+	  bi.lpszTitle = HeapAlloc(GetProcessHeap(), 0, len * sizeof(WCHAR));
+	  MultiByteToWideChar(CP_ACP, 0, lpbi->lpszTitle, -1, (LPWSTR)bi.lpszTitle, len);
+	}
+	else
+	  bi.lpszTitle = NULL;
 
-	return (LPITEMIDLIST) DialogBoxParamA( shell32_hInstance,
-					       "SHBRSFORFOLDER_MSGBOX",
-					       lpbi->hwndOwner,
-					       BrsFolderDlgProc, (INT)lpbi );
+	bi.ulFlags = lpbi->ulFlags;
+	bi.lpfn = lpbi->lpfn;
+	bi.lParam = lpbi->lParam;
+	bi.iImage = lpbi->iImage;
+	lpid = (LPITEMIDLIST) DialogBoxParamW(shell32_hInstance,
+	                                      swBrowseTempName, lpbi->hwndOwner,
+	                                      BrsFolderDlgProc, (INT)&bi);
+	if (bi.pszDisplayName)
+	{
+	  WideCharToMultiByte(CP_ACP, 0, bi.pszDisplayName, -1, lpbi->pszDisplayName, MAX_PATH, 0, NULL);
+	  HeapFree(GetProcessHeap(), 0, bi.pszDisplayName);
+	}
+	if (bi.lpszTitle)
+	{
+	  HeapFree(GetProcessHeap(), 0, (LPVOID)bi.lpszTitle);
+	}
+	lpbi->iImage = bi.iImage;
+	return lpid;
 }
 
+
 /*************************************************************************
  * SHBrowseForFolderW [SHELL32.@]
  */
 LPITEMIDLIST WINAPI SHBrowseForFolderW (LPBROWSEINFOW lpbi)
 {
-  char szDisplayName[MAX_PATH], szTitle[MAX_PATH];
-  BROWSEINFOA bi;
-
-  TRACE("((%p->{lpszTitle=%s,owner=%p})\n", lpbi,
-        lpbi ? debugstr_w(lpbi->lpszTitle): NULL, lpbi ? lpbi->hwndOwner: 0);
+	TRACE("((%p->{lpszTitle=%s,owner=%p})\n", lpbi,
+	    lpbi ? debugstr_w(lpbi->lpszTitle) : NULL, lpbi ? lpbi->hwndOwner : 0);
 
-  if (!lpbi)
-    return NULL;
+	if (!lpbi)
+	  return NULL;
 
-  bi.hwndOwner = lpbi->hwndOwner;
-  bi.pidlRoot = lpbi->pidlRoot;
-  if (lpbi->pszDisplayName)
-  {
-    WideCharToMultiByte(CP_ACP, 0, lpbi->pszDisplayName, -1, szDisplayName, MAX_PATH, 0, NULL);
-    bi.pszDisplayName = szDisplayName;
-  }
-  else
-    bi.pszDisplayName = NULL;
-
-  if (lpbi->lpszTitle)
-  {
-    WideCharToMultiByte(CP_ACP, 0, lpbi->lpszTitle, -1, szTitle, MAX_PATH, 0, NULL);
-    bi.lpszTitle = szTitle;
-  }
-  else
-    bi.lpszTitle = NULL;
-
-  bi.ulFlags = lpbi->ulFlags;
-  bi.lpfn = lpbi->lpfn;
-  bi.lParam = lpbi->lParam;
-  bi.iImage = lpbi->iImage;
-  return (LPITEMIDLIST) DialogBoxParamA(shell32_hInstance,
-                                        "SHBRSFORFOLDER_MSGBOX", lpbi->hwndOwner,
-                                        BrsFolderDlgProc, (INT)lpbi);
+	return (LPITEMIDLIST) DialogBoxParamW(shell32_hInstance,
+	                                      swBrowseTempName, lpbi->hwndOwner,
+	                                      BrsFolderDlgProc, (INT)lpbi);
 }




More information about the wine-patches mailing list