Win32 Drag&Drop: Make sure we are using WCHAR functions and error handling
This commit is contained in:
		
							parent
							
								
									0915f86aa3
								
							
						
					
					
						commit
						882a2892cf
					
				@ -27,6 +27,8 @@
 | 
				
			|||||||
#if defined(_MSC_VER) && _MSC_VER < 1900
 | 
					#if defined(_MSC_VER) && _MSC_VER < 1900
 | 
				
			||||||
	#define snprintf _snprintf
 | 
						#define snprintf _snprintf
 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
 | 
					#include "gfx2mem.h"
 | 
				
			||||||
 | 
					#include "gfx2log.h"
 | 
				
			||||||
#include "screen.h"
 | 
					#include "screen.h"
 | 
				
			||||||
#include "errors.h"
 | 
					#include "errors.h"
 | 
				
			||||||
#include "windows.h"
 | 
					#include "windows.h"
 | 
				
			||||||
@ -329,29 +331,58 @@ static LRESULT CALLBACK Win32_WindowProc(HWND hwnd, UINT uMsg, WPARAM wParam, LP
 | 
				
			|||||||
    return 0;
 | 
					    return 0;
 | 
				
			||||||
  case WM_DROPFILES:
 | 
					  case WM_DROPFILES:
 | 
				
			||||||
    {
 | 
					    {
 | 
				
			||||||
      int file_count;
 | 
					      UINT file_count;
 | 
				
			||||||
      HDROP hDrop = (HDROP)wParam;
 | 
					      HDROP hDrop = (HDROP)wParam;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
      file_count = DragQueryFile(hDrop, (UINT)-1, NULL , 0);
 | 
					      file_count = DragQueryFileW(hDrop, (UINT)-1, NULL, 0);
 | 
				
			||||||
      if (file_count > 0)
 | 
					      if (file_count == 0)
 | 
				
			||||||
 | 
					        GFX2_Log(GFX2_WARNING, "WM_DROPFILES but 0 files\n");
 | 
				
			||||||
 | 
					      else
 | 
				
			||||||
      {
 | 
					      {
 | 
				
			||||||
        TCHAR LongDropFileName[MAX_PATH];
 | 
					        UINT longLen;
 | 
				
			||||||
        TCHAR ShortDropFileName[MAX_PATH];
 | 
					
 | 
				
			||||||
        if (DragQueryFile(hDrop, 0 , LongDropFileName ,(UINT) MAX_PATH))
 | 
					        GFX2_Log(GFX2_DEBUG, "WM_DROPFILES %u files\n", file_count);
 | 
				
			||||||
 | 
					        longLen = DragQueryFileW(hDrop, 0, NULL, 0);
 | 
				
			||||||
 | 
					        if (longLen == 0)
 | 
				
			||||||
 | 
					          GFX2_Log(GFX2_ERROR, "DragQueryFileW(%x, 0, NULL, 0) failed\n", hDrop);
 | 
				
			||||||
 | 
					        else
 | 
				
			||||||
        {
 | 
					        {
 | 
				
			||||||
          Drop_file_name_unicode = Unicode_strdup((word *)LongDropFileName);
 | 
					          Drop_file_name_unicode = GFX2_malloc(++longLen * sizeof(word)); // increment for NULL terminator
 | 
				
			||||||
          if (GetShortPathName(LongDropFileName, ShortDropFileName, MAX_PATH))
 | 
					          if (Drop_file_name_unicode != NULL)
 | 
				
			||||||
          {
 | 
					          {
 | 
				
			||||||
            Drop_file_name = (char *)malloc(lstrlen(ShortDropFileName) + 1);
 | 
					            if (DragQueryFileW(hDrop, 0, Drop_file_name_unicode, longLen) == 0)
 | 
				
			||||||
 | 
					              GFX2_Log(GFX2_ERROR, "DragQueryFileW(%x, 0, %p, %u) failed\n", hDrop, Drop_file_name_unicode, longLen);
 | 
				
			||||||
 | 
					            else
 | 
				
			||||||
 | 
					            {
 | 
				
			||||||
 | 
					              // get the short path name
 | 
				
			||||||
 | 
					              UINT shortLen = GetShortPathNameW(Drop_file_name_unicode, NULL, 0);
 | 
				
			||||||
 | 
					              if (shortLen == 0)
 | 
				
			||||||
 | 
					                GFX2_Log(GFX2_ERROR, "GetShortPathNameW(%p, NULL, 0) failed\n", Drop_file_name_unicode);
 | 
				
			||||||
 | 
					              else
 | 
				
			||||||
 | 
					              {
 | 
				
			||||||
 | 
					                WCHAR * ShortDropFileNameW = GFX2_malloc(shortLen * sizeof(WCHAR));
 | 
				
			||||||
 | 
					                if (ShortDropFileNameW != NULL)
 | 
				
			||||||
 | 
					                {
 | 
				
			||||||
 | 
					                  if (GetShortPathNameW(Drop_file_name_unicode, ShortDropFileNameW, shortLen) == 0)
 | 
				
			||||||
 | 
					                    GFX2_Log(GFX2_ERROR, "GetShortPathNameW(%p, %p, %u) failed\n", Drop_file_name_unicode, ShortDropFileNameW, shortLen);
 | 
				
			||||||
 | 
					                  else
 | 
				
			||||||
 | 
					                  {
 | 
				
			||||||
 | 
					                    // convert to ANSI/ASCII
 | 
				
			||||||
 | 
					                    Drop_file_name = (char *)GFX2_malloc(shortLen);
 | 
				
			||||||
                    if (Drop_file_name != NULL)
 | 
					                    if (Drop_file_name != NULL)
 | 
				
			||||||
                    {
 | 
					                    {
 | 
				
			||||||
                      int i;
 | 
					                      int i;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
              for (i = 0; ShortDropFileName[i] != 0; i++)
 | 
					                      for (i = 0; ShortDropFileNameW[i] != 0; i++)
 | 
				
			||||||
                Drop_file_name[i] = (char)ShortDropFileName[i];
 | 
					                        Drop_file_name[i] = (char)ShortDropFileNameW[i];
 | 
				
			||||||
                      Drop_file_name[i] = 0;
 | 
					                      Drop_file_name[i] = 0;
 | 
				
			||||||
                    }
 | 
					                    }
 | 
				
			||||||
                  }
 | 
					                  }
 | 
				
			||||||
 | 
					                  free(ShortDropFileNameW);
 | 
				
			||||||
 | 
					                }
 | 
				
			||||||
 | 
					              }
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					          }
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
      }
 | 
					      }
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
				
			|||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user