Use documented DROPFILES structure instead of internal DROPFILESTRUCT.

This commit is contained in:
Alexandre Julliard 2000-09-25 23:56:41 +00:00
parent d8fab2e67c
commit 60e175294b
4 changed files with 56 additions and 89 deletions

View file

@ -26,7 +26,6 @@
#include "pidl.h"
#include "wine/undocshell.h"
#include "shell32_main.h"
#include "shell.h" /* DROPFILESTRUCT */
DEFAULT_DEBUG_CHANNEL(shell)
@ -96,13 +95,13 @@ HGLOBAL RenderHDROP(LPITEMIDLIST pidlRoot, LPITEMIDLIST * apidl, UINT cidl)
char szRootPath[MAX_PATH];
char szFileName[MAX_PATH];
HGLOBAL hGlobal;
LPDROPFILESTRUCT pDropFiles;
DROPFILES *pDropFiles;
int offset;
TRACE("(%p,%p,%u)\n", pidlRoot, apidl, cidl);
/* get the size needed */
size = sizeof(DROPFILESTRUCT);
size = sizeof(DROPFILES);
SHGetPathFromIDListA(pidlRoot, szRootPath);
PathAddBackslashA(szRootPath);
@ -120,11 +119,11 @@ HGLOBAL RenderHDROP(LPITEMIDLIST pidlRoot, LPITEMIDLIST * apidl, UINT cidl)
hGlobal = GlobalAlloc(GHND|GMEM_SHARE, size);
if(!hGlobal) return hGlobal;
pDropFiles = (LPDROPFILESTRUCT)GlobalLock(hGlobal);
pDropFiles->lSize = sizeof(DROPFILESTRUCT);
pDropFiles->fWideChar = FALSE;
pDropFiles = (DROPFILES *)GlobalLock(hGlobal);
pDropFiles->pFiles = sizeof(DROPFILES);
pDropFiles->fWide = FALSE;
offset = pDropFiles->lSize;
offset = pDropFiles->pFiles;
strcpy(szFileName, szRootPath);
for (i=0; i<cidl;i++)

View file

@ -55,6 +55,13 @@ typedef struct
#include "poppack.h"
typedef struct { /* structure for dropped files */
WORD wSize;
POINT16 ptMousePos;
BOOL16 fInNonClientArea;
/* memory block with filenames follows */
} DROPFILESTRUCT16, *LPDROPFILESTRUCT16;
static const char* lpstrMsgWndCreated = "OTHERWINDOWCREATED";
static const char* lpstrMsgWndDestroyed = "OTHERWINDOWDESTROYED";
static const char* lpstrMsgShellActivate = "ACTIVATESHELLWINDOW";
@ -1022,7 +1029,7 @@ LPSTR SHELL_FindString(LPSTR lpEnv, LPCSTR entry)
l = strlen(entry);
for( ; *lpEnv ; lpEnv+=strlen(lpEnv)+1 )
{ if( lstrncmpiA(lpEnv, entry, l) )
{ if( strncasecmp(lpEnv, entry, l) )
continue;
if( !*(lpEnv+l) )
return (lpEnv + l); /* empty entry */

View file

@ -9,16 +9,10 @@
#include <stdlib.h>
#include <string.h>
#include "wine/obj_base.h"
#include "wine/obj_shelllink.h"
#include "wine/obj_shellfolder.h"
#include "wine/obj_shellbrowser.h"
#include "wine/obj_contextmenu.h"
#include "wine/obj_shellextinit.h"
#include "wine/obj_extracticon.h"
#include "shlobj.h"
#include "shlguid.h"
#include "winreg.h"
#include "wine/unicode.h"
#include "winerror.h"
#include "debugtools.h"
@ -543,15 +537,15 @@ void WINAPI DragFinish(HDROP h)
*/
BOOL WINAPI DragQueryPoint(HDROP hDrop, POINT *p)
{
LPDROPFILESTRUCT lpDropFileStruct;
DROPFILES *lpDropFileStruct;
BOOL bRet;
TRACE("\n");
lpDropFileStruct = (LPDROPFILESTRUCT) GlobalLock(hDrop);
memcpy(p,&lpDropFileStruct->ptMousePos,sizeof(POINT));
bRet = lpDropFileStruct->fInNonClientArea;
lpDropFileStruct = (DROPFILES *) GlobalLock(hDrop);
*p = lpDropFileStruct->pt;
bRet = lpDropFileStruct->fNC;
GlobalUnlock(hDrop);
return bRet;
@ -568,13 +562,13 @@ UINT WINAPI DragQueryFileA(
{
LPSTR lpDrop;
UINT i = 0;
LPDROPFILESTRUCT lpDropFileStruct = (LPDROPFILESTRUCT) GlobalLock(hDrop);
DROPFILES *lpDropFileStruct = (DROPFILES *) GlobalLock(hDrop);
TRACE("(%08x, %x, %p, %u)\n", hDrop,lFile,lpszFile,lLength);
if(!lpDropFileStruct) goto end;
lpDrop = (LPSTR) lpDropFileStruct + lpDropFileStruct->lSize;
lpDrop = (LPSTR) lpDropFileStruct + lpDropFileStruct->pFiles;
while (i++ < lFile)
{
@ -607,13 +601,13 @@ UINT WINAPI DragQueryFileW(
{
LPWSTR lpwDrop;
UINT i = 0;
LPDROPFILESTRUCT lpDropFileStruct = (LPDROPFILESTRUCT) GlobalLock(hDrop);
DROPFILES *lpDropFileStruct = (DROPFILES *) GlobalLock(hDrop);
TRACE("(%08x, %x, %p, %u)\n", hDrop,lFile,lpszwFile,lLength);
if(!lpDropFileStruct) goto end;
lpwDrop = (LPWSTR) lpDropFileStruct + lpDropFileStruct->lSize;
lpwDrop = (LPWSTR) lpDropFileStruct + lpDropFileStruct->pFiles;
i = 0;
while (i++ < lFile)
@ -626,7 +620,7 @@ UINT WINAPI DragQueryFileW(
}
}
i = lstrlenW(lpwDrop);
i = strlenW(lpwDrop);
i++;
if ( !lpszwFile) goto end; /* needed buffer size */

View file

@ -23,6 +23,7 @@
#include <assert.h>
#include <string.h>
#include "wine/winuser16.h"
#include "shlobj.h" /* DROPFILES */
#include "clipboard.h"
#include "dce.h"
@ -35,7 +36,6 @@
#include "mouse.h"
#include "options.h"
#include "queue.h"
#include "shell.h"
#include "win.h"
#include "winpos.h"
#include "services.h"
@ -1587,24 +1587,25 @@ static void EVENT_DropFromOffiX( HWND hWnd, XClientMessageEvent *event )
}
if( aux_long && aux_long < 65535 )
{
HDROP16 hDrop;
LPDROPFILESTRUCT16 lpDrop;
HDROP hDrop;
DROPFILES *lpDrop;
aux_long += sizeof(DROPFILESTRUCT16) + 1;
hDrop = (HDROP16)GlobalAlloc16( GMEM_SHARE, aux_long );
lpDrop = (LPDROPFILESTRUCT16) GlobalLock16( hDrop );
aux_long += sizeof(DROPFILES) + 1;
hDrop = GlobalAlloc( GMEM_SHARE, aux_long );
lpDrop = (DROPFILES*)GlobalLock( hDrop );
if( lpDrop )
{
lpDrop->wSize = sizeof(DROPFILESTRUCT16);
lpDrop->ptMousePos.x = (INT16)x;
lpDrop->ptMousePos.y = (INT16)y;
lpDrop->fInNonClientArea = (BOOL16)
lpDrop->pFiles = sizeof(DROPFILES);
lpDrop->pt.x = x;
lpDrop->pt.y = y;
lpDrop->fNC =
( x < (pDropWnd->rectClient.left - pDropWnd->rectWindow.left) ||
y < (pDropWnd->rectClient.top - pDropWnd->rectWindow.top) ||
x > (pDropWnd->rectClient.right - pDropWnd->rectWindow.left) ||
y > (pDropWnd->rectClient.bottom - pDropWnd->rectWindow.top) );
p_drop = ((char*)lpDrop) + sizeof(DROPFILESTRUCT16);
lpDrop->fWide = FALSE;
p_drop = (char *)(lpDrop + 1);
p = p_data;
while(*p)
{
@ -1616,8 +1617,7 @@ static void EVENT_DropFromOffiX( HWND hWnd, XClientMessageEvent *event )
p += strlen(p) + 1;
}
*p_drop = '\0';
PostMessage16( hWnd, WM_DROPFILES,
(WPARAM16)hDrop, 0L );
PostMessageA( hWnd, WM_DROPFILES, hDrop, 0L );
}
}
}
@ -1645,19 +1645,16 @@ static void EVENT_DropURLs( HWND hWnd, XClientMessageEvent *event )
unsigned char *p_data = NULL; /* property data */
char *p_drop = NULL;
char *p, *next;
int x, y, drop32 = FALSE ;
int x, y;
DROPFILES *lpDrop;
HDROP hDrop;
union {
Atom atom_aux;
int i;
Window w_aux;
} u; /* unused */
union {
HDROP16 h16;
HDROP h32;
} hDrop;
pWnd = WIN_FindWndPtr(hWnd);
drop32 = pWnd->flags & WIN_ISWIN32;
if (!(pWnd->dwExStyle & WS_EX_ACCEPTFILES))
{
@ -1699,43 +1696,23 @@ static void EVENT_DropURLs( HWND hWnd, XClientMessageEvent *event )
pDropWnd = WIN_FindWndPtr( hWnd );
if (drop32) {
LPDROPFILESTRUCT lpDrop;
drop_len += sizeof(DROPFILESTRUCT) + 1;
hDrop.h32 = (HDROP)GlobalAlloc( GMEM_SHARE, drop_len );
lpDrop = (LPDROPFILESTRUCT) GlobalLock( hDrop.h32 );
if( lpDrop ) {
lpDrop->lSize = sizeof(DROPFILESTRUCT);
lpDrop->ptMousePos.x = (INT)x;
lpDrop->ptMousePos.y = (INT)y;
lpDrop->fInNonClientArea = (BOOL)
drop_len += sizeof(DROPFILES) + 1;
hDrop = (HDROP)GlobalAlloc( GMEM_SHARE, drop_len );
lpDrop = (DROPFILES *) GlobalLock( hDrop );
if( lpDrop ) {
lpDrop->pFiles = sizeof(DROPFILES);
lpDrop->pt.x = (INT)x;
lpDrop->pt.y = (INT)y;
lpDrop->fNC =
( x < (pDropWnd->rectClient.left - pDropWnd->rectWindow.left) ||
y < (pDropWnd->rectClient.top - pDropWnd->rectWindow.top) ||
x > (pDropWnd->rectClient.right - pDropWnd->rectWindow.left) ||
y > (pDropWnd->rectClient.bottom - pDropWnd->rectWindow.top) );
lpDrop->fWideChar = FALSE;
p_drop = ((char*)lpDrop) + sizeof(DROPFILESTRUCT);
}
} else {
LPDROPFILESTRUCT16 lpDrop;
drop_len += sizeof(DROPFILESTRUCT16) + 1;
hDrop.h16 = (HDROP16)GlobalAlloc16( GMEM_SHARE, drop_len );
lpDrop = (LPDROPFILESTRUCT16) GlobalLock16( hDrop.h16 );
if( lpDrop ) {
lpDrop->wSize = sizeof(DROPFILESTRUCT16);
lpDrop->ptMousePos.x = (INT16)x;
lpDrop->ptMousePos.y = (INT16)y;
lpDrop->fInNonClientArea = (BOOL16)
( x < (pDropWnd->rectClient.left - pDropWnd->rectWindow.left) ||
y < (pDropWnd->rectClient.top - pDropWnd->rectWindow.top) ||
x > (pDropWnd->rectClient.right - pDropWnd->rectWindow.left) ||
y > (pDropWnd->rectClient.bottom - pDropWnd->rectWindow.top) );
p_drop = ((char*)lpDrop) + sizeof(DROPFILESTRUCT16);
}
lpDrop->fWide = FALSE;
p_drop = (char*)(lpDrop + 1);
}
/* create message content */
if (p_drop) {
p = p_data;
@ -1763,18 +1740,8 @@ static void EVENT_DropURLs( HWND hWnd, XClientMessageEvent *event )
*p_drop = '\0';
}
if (drop32) {
/* can not use PostMessage32A because it is currently based on
* PostMessage16 and WPARAM32 would be truncated to WPARAM16
*/
GlobalUnlock(hDrop.h32);
SendMessageA( hWnd, WM_DROPFILES,
(WPARAM)hDrop.h32, 0L );
} else {
GlobalUnlock16(hDrop.h16);
PostMessage16( hWnd, WM_DROPFILES,
(WPARAM16)hDrop.h16, 0L );
}
GlobalUnlock(hDrop);
PostMessageA( hWnd, WM_DROPFILES, hDrop, 0L );
}
WIN_ReleaseWndPtr(pDropWnd);
}