Added Drag*32 functions.
diff --git a/if1632/shell.spec b/if1632/shell.spec
index eaddc95..3a5ffb6 100644
--- a/if1632/shell.spec
+++ b/if1632/shell.spec
@@ -8,10 +8,10 @@
5 pascal RegSetValue(long str long str long) RegSetValue16
6 pascal RegQueryValue(long str ptr ptr) RegQueryValue16
7 pascal RegEnumKey(long long ptr long) RegEnumKey16
- 9 pascal16 DragAcceptFiles(word word) DragAcceptFiles
- 11 pascal16 DragQueryFile(word s_word ptr s_word) DragQueryFile
- 12 pascal16 DragFinish(word) DragFinish
- 13 pascal16 DragQueryPoint(word ptr) DragQueryPoint
+ 9 pascal16 DragAcceptFiles(word word) DragAcceptFiles16
+ 11 pascal16 DragQueryFile(word s_word ptr s_word) DragQueryFile16
+ 12 pascal16 DragFinish(word) DragFinish16
+ 13 pascal16 DragQueryPoint(word ptr) DragQueryPoint16
20 pascal16 ShellExecute(word str str str str s_word) ShellExecute16
21 pascal16 FindExecutable(str str ptr) FindExecutable16
22 pascal16 ShellAbout(word ptr ptr word) ShellAbout16
diff --git a/include/shell.h b/include/shell.h
index c5d063e..31b199e 100644
--- a/include/shell.h
+++ b/include/shell.h
@@ -68,14 +68,40 @@
typedef WORD PRINTEROP_FLAGS;
/******************************
-* DROPFILESTRUCT
+* DRAG&DROP API
*/
typedef struct { /* structure for dropped files */
WORD wSize;
POINT16 ptMousePos;
BOOL16 fInNonClientArea;
/* memory block with filenames follows */
-} DROPFILESTRUCT, *LPDROPFILESTRUCT;
+} DROPFILESTRUCT16, *LPDROPFILESTRUCT16;
+
+typedef struct { /* structure for dropped files */
+ DWORD lSize;
+ POINT32 ptMousePos;
+ BOOL32 fInNonClientArea;
+ BOOL32 fWideChar;
+ /* memory block with filenames follows */
+} DROPFILESTRUCT32, *LPDROPFILESTRUCT32;
+
+DECL_WINELIB_TYPE(DROPFILESTRUCT)
+DECL_WINELIB_TYPE(LPDROPFILESTRUCT)
+
+void WINAPI DragAcceptFiles16(HWND16 hWnd, BOOL16 b);
+void WINAPI DragAcceptFiles32(HWND32 hWnd, BOOL32 b);
+#define DragAcceptFiles WINELIB_NAME(DragAcceptFiles)
+UINT16 WINAPI DragQueryFile16(HDROP16 hDrop, WORD wFile, LPSTR lpszFile, WORD wLength);
+UINT32 WINAPI DragQueryFile32A(HDROP32 hDrop, UINT32 lFile, LPSTR lpszFile, UINT32 lLength);
+UINT32 WINAPI DragQueryFile32W(HDROP32 hDrop, UINT32 lFile, LPWSTR lpszFile, UINT32 lLength);
+#define DragQueryFile WINELIB_NAME_AW(DragQueryFile)
+void WINAPI DragFinish32(HDROP32 h);
+void WINAPI DragFinish16(HDROP16 h);
+#define DragFinish WINELIB_NAME(DragFinish)
+BOOL32 WINAPI DragQueryPoint32(HDROP32 hDrop, POINT32 *p);
+BOOL16 WINAPI DragQueryPoint16(HDROP16 hDrop, POINT16 *p);
+#define DragQueryPoint WINELIB_NAME(DragQueryPoint)
+
/****************************************************************************
* NOTIFYICONDATA
diff --git a/misc/shell.c b/misc/shell.c
index 81cf3c7..9659d69 100644
--- a/misc/shell.c
+++ b/misc/shell.c
@@ -65,82 +65,191 @@
static UINT16 uMsgShellActivate = 0;
/*************************************************************************
- * DragAcceptFiles [SHELL.9]
+ * DragAcceptFiles32 [SHELL32.54]
*/
-void WINAPI DragAcceptFiles(HWND16 hWnd, BOOL16 b)
-{ WND* wnd = WIN_FindWndPtr(hWnd);
-
- if( wnd )
- wnd->dwExStyle = b? wnd->dwExStyle | WS_EX_ACCEPTFILES
- : wnd->dwExStyle & ~WS_EX_ACCEPTFILES;
+void WINAPI DragAcceptFiles32(HWND32 hWnd, BOOL32 b)
+{
+ WND* wnd = WIN_FindWndPtr(hWnd);
+
+ if( wnd )
+ wnd->dwExStyle = b? wnd->dwExStyle | WS_EX_ACCEPTFILES
+ : wnd->dwExStyle & ~WS_EX_ACCEPTFILES;
}
+/*************************************************************************
+ * DragAcceptFiles16 [SHELL.9]
+ */
+void WINAPI DragAcceptFiles16(HWND16 hWnd, BOOL16 b)
+{
+ DragAcceptFiles32(hWnd, b);
+}
/*************************************************************************
- * DragQueryFile [SHELL.11]
+ * SHELL_DragQueryFile [internal]
+ *
*/
-UINT16 WINAPI DragQueryFile(HDROP16 hDrop, WORD wFile, LPSTR lpszFile,
+static UINT32 SHELL_DragQueryFile(LPSTR lpDrop, LPWSTR lpwDrop, UINT32 lFile,
+ LPSTR lpszFile, LPWSTR lpszwFile, UINT32 lLength)
+{
+ UINT32 i;
+
+ i = 0;
+ if (lpDrop) {
+ while (i++ < lFile) {
+ while (*lpDrop++); /* skip filename */
+ if (!*lpDrop)
+ return (lFile == 0xFFFFFFFF) ? i : 0;
+ }
+ }
+ if (lpwDrop) {
+ while (i++ < lFile) {
+ while (*lpwDrop++); /* skip filename */
+ if (!*lpwDrop)
+ return (lFile == 0xFFFFFFFF) ? i : 0;
+ }
+ }
+
+ if (lpDrop) i = lstrlen32A(lpDrop);
+ if (lpwDrop) i = lstrlen32W(lpwDrop);
+ i++;
+ if (!lpszFile && !lpszwFile) {
+ return i; /* needed buffer size */
+ }
+ i = (lLength > i) ? i : lLength;
+ if (lpszFile) {
+ if (lpDrop) lstrcpyn32A (lpszFile, lpDrop, i);
+ else lstrcpynWtoA(lpszFile, lpwDrop, i);
+ } else {
+ if (lpDrop) lstrcpynAtoW(lpszwFile, lpDrop, i);
+ else lstrcpyn32W (lpszwFile, lpwDrop, i);
+ }
+ return i;
+}
+
+/*************************************************************************
+ * DragQueryFile32A [SHELL32.81] [shell32.82]
+ */
+UINT32 WINAPI DragQueryFile32A(HDROP32 hDrop, UINT32 lFile, LPSTR lpszFile,
+ UINT32 lLength)
+{ /* hDrop is a global memory block allocated with GMEM_SHARE
+ * with DROPFILESTRUCT as a header and filenames following
+ * it, zero length filename is in the end */
+
+ LPDROPFILESTRUCT32 lpDropFileStruct;
+ LPSTR lpCurrent;
+ UINT32 i;
+
+ TRACE(shell,"(%08x, %x, %p, %u)\n", hDrop,lFile,lpszFile,lLength);
+
+ lpDropFileStruct = (LPDROPFILESTRUCT32) GlobalLock32(hDrop);
+ if(!lpDropFileStruct)
+ return 0;
+
+ lpCurrent = (LPSTR) lpDropFileStruct + lpDropFileStruct->lSize;
+ i = SHELL_DragQueryFile(lpCurrent, NULL, lFile, lpszFile, NULL, lLength);
+ GlobalUnlock32(hDrop);
+ return i;
+}
+
+/*************************************************************************
+ * DragQueryFile32W [shell32.133]
+ */
+UINT32 WINAPI DragQueryFile32W(HDROP32 hDrop, UINT32 lFile, LPWSTR lpszwFile,
+ UINT32 lLength)
+{
+ LPDROPFILESTRUCT32 lpDropFileStruct;
+ LPWSTR lpwCurrent;
+ UINT32 i;
+
+ TRACE(shell,"(%08x, %x, %p, %u)\n", hDrop,lFile,lpszwFile,lLength);
+
+ lpDropFileStruct = (LPDROPFILESTRUCT32) GlobalLock32(hDrop);
+ if(!lpDropFileStruct)
+ return 0;
+
+ lpwCurrent = (LPWSTR) lpDropFileStruct + lpDropFileStruct->lSize;
+ i = SHELL_DragQueryFile(NULL, lpwCurrent, lFile, NULL, lpszwFile,lLength);
+ GlobalUnlock32(hDrop);
+ return i;
+}
+/*************************************************************************
+ * DragQueryFile16 [SHELL.11]
+ */
+UINT16 WINAPI DragQueryFile16(HDROP16 hDrop, WORD wFile, LPSTR lpszFile,
WORD wLength)
{ /* hDrop is a global memory block allocated with GMEM_SHARE
* with DROPFILESTRUCT as a header and filenames following
* it, zero length filename is in the end */
- LPDROPFILESTRUCT lpDropFileStruct;
+ LPDROPFILESTRUCT16 lpDropFileStruct;
LPSTR lpCurrent;
WORD i;
- TRACE(shell,"(%04x, %i, %p, %u)\n",
- hDrop,wFile,lpszFile,wLength);
+ TRACE(shell,"(%04x, %x, %p, %u)\n", hDrop,wFile,lpszFile,wLength);
- lpDropFileStruct = (LPDROPFILESTRUCT) GlobalLock16(hDrop);
- if(!lpDropFileStruct)
- return 0;
-
+ lpDropFileStruct = (LPDROPFILESTRUCT16) GlobalLock16(hDrop);
+ if(!lpDropFileStruct)
+ return 0;
+
lpCurrent = (LPSTR) lpDropFileStruct + lpDropFileStruct->wSize;
-
- i = 0;
- while (i++ < wFile)
- { while (*lpCurrent++); /* skip filename */
- if (!*lpCurrent)
- return (wFile == 0xFFFF) ? i : 0;
- }
-
- i = strlen(lpCurrent);
- if (!lpszFile)
- return i+1; /* needed buffer size */
-
- i = (wLength > i) ? i : wLength-1;
- strncpy(lpszFile, lpCurrent, i);
- lpszFile[i] = '\0';
+ i = (WORD)SHELL_DragQueryFile(lpCurrent, NULL, wFile==0xffff?0xffffffff:wFile,
+ lpszFile, NULL, wLength);
GlobalUnlock16(hDrop);
return i;
}
+
/*************************************************************************
- * DragFinish [SHELL.12]
+ * DragFinish32 [SHELL32.80]
*/
-void WINAPI DragFinish(HDROP16 h)
+void WINAPI DragFinish32(HDROP32 h)
+{ TRACE(shell,"\n");
+ GlobalFree32((HGLOBAL32)h);
+}
+
+/*************************************************************************
+ * DragFinish16 [SHELL.12]
+ */
+void WINAPI DragFinish16(HDROP16 h)
{ TRACE(shell,"\n");
GlobalFree16((HGLOBAL16)h);
}
/*************************************************************************
- * DragQueryPoint [SHELL.13]
+ * DragQueryPoint32 [SHELL32.135]
*/
-BOOL16 WINAPI DragQueryPoint(HDROP16 hDrop, POINT16 *p)
-{ LPDROPFILESTRUCT lpDropFileStruct;
- BOOL16 bRet;
+BOOL32 WINAPI DragQueryPoint32(HDROP32 hDrop, POINT32 *p)
+{
+ LPDROPFILESTRUCT32 lpDropFileStruct;
+ BOOL32 bRet;
TRACE(shell,"\n");
- lpDropFileStruct = (LPDROPFILESTRUCT) GlobalLock16(hDrop);
+ lpDropFileStruct = (LPDROPFILESTRUCT32) GlobalLock32(hDrop);
+
+ memcpy(p,&lpDropFileStruct->ptMousePos,sizeof(POINT32));
+ bRet = lpDropFileStruct->fInNonClientArea;
+
+ GlobalUnlock32(hDrop);
+ return bRet;
+}
- memcpy(p,&lpDropFileStruct->ptMousePos,sizeof(POINT16));
- bRet = lpDropFileStruct->fInNonClientArea;
-
- GlobalUnlock16(hDrop);
- return bRet;
+/*************************************************************************
+ * DragQueryPoint16 [SHELL.13]
+ */
+BOOL16 WINAPI DragQueryPoint16(HDROP16 hDrop, POINT16 *p)
+{
+ LPDROPFILESTRUCT16 lpDropFileStruct;
+ BOOL16 bRet;
+ TRACE(shell,"\n");
+ lpDropFileStruct = (LPDROPFILESTRUCT16) GlobalLock16(hDrop);
+
+ memcpy(p,&lpDropFileStruct->ptMousePos,sizeof(POINT16));
+ bRet = lpDropFileStruct->fInNonClientArea;
+
+ GlobalUnlock16(hDrop);
+ return bRet;
}
/*************************************************************************
diff --git a/programs/notepad/main.c b/programs/notepad/main.c
index 791ca73..735b4da 100644
--- a/programs/notepad/main.c
+++ b/programs/notepad/main.c
@@ -103,7 +103,7 @@
break;
case WM_DROPFILES:
- DragQueryFiles(wParam, 0, szFileName, sizeof(szFileName));
+ DragQueryFile(wParam, 0, szFileName, sizeof(szFileName));
printf("file %s to be opened by drag and drop !\n", szFileName);
DragFinish(wParam);
break;
diff --git a/relay32/shell32.spec b/relay32/shell32.spec
index 89b4990..f490b89 100644
--- a/relay32/shell32.spec
+++ b/relay32/shell32.spec
@@ -59,7 +59,7 @@
51 stdcall PathResolve(str long long) PathResolve
52 stdcall PathGetArgs(str) PathGetArgs
53 stub DoEnvironmentSubstW@8 # exported by name
- 54 stdcall DragAcceptFiles(long long) DragAcceptFiles # exported by name
+ 54 stdcall DragAcceptFiles(long long) DragAcceptFiles32
55 stub PathQuoteSpaces
56 stdcall PathUnquoteSpaces(str) PathUnquoteSpaces
57 stdcall PathGetDriveNumber (str) PathGetDriveNumber32
@@ -85,9 +85,9 @@
77 stdcall SHMapPIDLToSystemImageListIndex(long long long) SHMapPIDLToSystemImageListIndex
78 stdcall OleStrToStrN(str long wstr long) OleStrToStrN
79 stdcall StrToOleStrN(wstr long str long) StrToOleStrN
- 80 stub DragFinish # exported by name
- 81 stub DragQueryFile # exported by name
- 82 stub DragQueryFileA # exported by name
+ 80 stdcall DragFinish(long) DragFinish32
+ 81 stdcall DragQueryFile(long long ptr long) DragQueryFile32A
+ 82 stdcall DragQueryFileA(long long ptr long) DragQueryFile32A
83 stub CIDLData_CreateFromIDArray
84 stub SHIsBadInterfacePtr
85 stdcall OpenRegStream(long long long long) OpenRegStream
@@ -138,9 +138,9 @@
130 stub DAD_DragEnter
131 stub DAD_DragEnterEx
132 stub DAD_DragLeave
- 133 stub DragQueryFileW # exported by name
+ 133 stdcall DragQueryFileW(long long ptr long) DragQueryFile32W
134 stub DAD_DragMove
- 135 stub DragQueryPoint # exported by name
+ 135 stdcall DragQueryPoint(long ptr) DragQueryPoint32
136 stub DAD_SetDragImage
137 stdcall DAD_ShowDragImage (long) DAD_ShowDragImage
138 stub DuplicateIcon # exported by name