1. Make buffer for message large enough to hold very long file names.
2. Pass FORMAT_MESSAGE_ARGUMENT_ARRAY for FormatMessageA to not assume
   implementation specific behaviour.
3. Show actual message to user, not non-formatted one.

diff --git a/dlls/shell32/shlfileop.c b/dlls/shell32/shlfileop.c
index c73fb53..0f00f76 100644
--- a/dlls/shell32/shlfileop.c
+++ b/dlls/shell32/shlfileop.c
@@ -19,13 +19,14 @@
 
 static BOOL SHELL_WarnFolderDelete (int nKindOfDialog, LPCSTR szDir)
 {
-	char szCaption[255], szText[255], szBuffer[256];
+	char szCaption[255], szText[255], szBuffer[MAX_PATH + 256];
 
 	LoadStringA(shell32_hInstance, IDS_DELETEFOLDER_TEXT, szText, sizeof(szText));
 	LoadStringA(shell32_hInstance, IDS_DELETEFOLDER_CAPTION, szCaption, sizeof(szCaption));
-	FormatMessageA(FORMAT_MESSAGE_FROM_STRING, szText, 0,0, szBuffer, sizeof(szBuffer), (DWORD*)&szDir);
+	FormatMessageA(FORMAT_MESSAGE_FROM_STRING|FORMAT_MESSAGE_ARGUMENT_ARRAY,
+	    szText, 0, 0, szBuffer, sizeof(szBuffer), (DWORD*)&szDir);
 
-	return (IDOK == MessageBoxA(GetActiveWindow(),szText, szCaption, MB_OKCANCEL | MB_ICONEXCLAMATION));
+	return (IDOK == MessageBoxA(GetActiveWindow(), szBuffer, szCaption, MB_OKCANCEL | MB_ICONEXCLAMATION));
 }
 
 /**************************************************************************