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,27 +331,56 @@ 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))
|
|
||||||
{
|
|
||||||
Drop_file_name_unicode = Unicode_strdup((word *)LongDropFileName);
|
|
||||||
if (GetShortPathName(LongDropFileName, ShortDropFileName, MAX_PATH))
|
|
||||||
{
|
|
||||||
Drop_file_name = (char *)malloc(lstrlen(ShortDropFileName) + 1);
|
|
||||||
if (Drop_file_name != NULL)
|
|
||||||
{
|
|
||||||
int i;
|
|
||||||
|
|
||||||
for (i = 0; ShortDropFileName[i] != 0; i++)
|
GFX2_Log(GFX2_DEBUG, "WM_DROPFILES %u files\n", file_count);
|
||||||
Drop_file_name[i] = (char)ShortDropFileName[i];
|
longLen = DragQueryFileW(hDrop, 0, NULL, 0);
|
||||||
Drop_file_name[i] = 0;
|
if (longLen == 0)
|
||||||
|
GFX2_Log(GFX2_ERROR, "DragQueryFileW(%x, 0, NULL, 0) failed\n", hDrop);
|
||||||
|
else
|
||||||
|
{
|
||||||
|
Drop_file_name_unicode = GFX2_malloc(++longLen * sizeof(word)); // increment for NULL terminator
|
||||||
|
if (Drop_file_name_unicode != NULL)
|
||||||
|
{
|
||||||
|
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)
|
||||||
|
{
|
||||||
|
int i;
|
||||||
|
|
||||||
|
for (i = 0; ShortDropFileNameW[i] != 0; i++)
|
||||||
|
Drop_file_name[i] = (char)ShortDropFileNameW[i];
|
||||||
|
Drop_file_name[i] = 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
free(ShortDropFileNameW);
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user