Separated 32 bit functions to shellole.c.
This commit is contained in:
parent
12aae27ae6
commit
d650903cec
|
@ -3,7 +3,6 @@
|
||||||
*
|
*
|
||||||
* 1998 Marcus Meissner
|
* 1998 Marcus Meissner
|
||||||
*/
|
*/
|
||||||
#include <assert.h>
|
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
#include <unistd.h>
|
#include <unistd.h>
|
||||||
|
@ -26,8 +25,8 @@
|
||||||
#include "debugtools.h"
|
#include "debugtools.h"
|
||||||
#include "winreg.h"
|
#include "winreg.h"
|
||||||
#include "syslevel.h"
|
#include "syslevel.h"
|
||||||
|
#include "shlwapi.h"
|
||||||
#include "imagelist.h"
|
#include "imagelist.h"
|
||||||
#include "tchar.h"
|
|
||||||
|
|
||||||
DEFAULT_DEBUG_CHANNEL(shell)
|
DEFAULT_DEBUG_CHANNEL(shell)
|
||||||
DECLARE_DEBUG_CHANNEL(exec)
|
DECLARE_DEBUG_CHANNEL(exec)
|
||||||
|
@ -123,22 +122,6 @@ BOOL WINAPI SHELL_DllEntryPoint(DWORD Reason, HINSTANCE16 hInst,
|
||||||
return TRUE;
|
return TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*************************************************************************
|
|
||||||
* DragAcceptFiles [SHELL32.54]
|
|
||||||
*/
|
|
||||||
void WINAPI DragAcceptFiles(HWND hWnd, BOOL b)
|
|
||||||
{
|
|
||||||
LONG exstyle;
|
|
||||||
|
|
||||||
|
|
||||||
if( !IsWindow(hWnd) )
|
|
||||||
return;
|
|
||||||
exstyle = GetWindowLongA(hWnd,GWL_EXSTYLE);
|
|
||||||
if (b)exstyle |= WS_EX_ACCEPTFILES;
|
|
||||||
else exstyle &= ~WS_EX_ACCEPTFILES;
|
|
||||||
SetWindowLongA(hWnd,GWL_EXSTYLE,exstyle);
|
|
||||||
}
|
|
||||||
|
|
||||||
/*************************************************************************
|
/*************************************************************************
|
||||||
* DragAcceptFiles16 [SHELL.9]
|
* DragAcceptFiles16 [SHELL.9]
|
||||||
*/
|
*/
|
||||||
|
@ -147,130 +130,44 @@ void WINAPI DragAcceptFiles16(HWND16 hWnd, BOOL16 b)
|
||||||
DragAcceptFiles(hWnd, b);
|
DragAcceptFiles(hWnd, b);
|
||||||
}
|
}
|
||||||
|
|
||||||
/*************************************************************************
|
|
||||||
* SHELL_DragQueryFile [internal]
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
static UINT SHELL_DragQueryFile(LPSTR lpDrop, LPWSTR lpwDrop, UINT lFile,
|
|
||||||
LPSTR lpszFile, LPWSTR lpszwFile, UINT lLength)
|
|
||||||
{
|
|
||||||
UINT 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 = lstrlenA(lpDrop);
|
|
||||||
if (lpwDrop) i = lstrlenW(lpwDrop);
|
|
||||||
i++;
|
|
||||||
if (!lpszFile && !lpszwFile) {
|
|
||||||
return i; /* needed buffer size */
|
|
||||||
}
|
|
||||||
i = (lLength > i) ? i : lLength;
|
|
||||||
if (lpszFile) {
|
|
||||||
if (lpDrop) lstrcpynA (lpszFile, lpDrop, i);
|
|
||||||
else lstrcpynWtoA(lpszFile, lpwDrop, i);
|
|
||||||
} else {
|
|
||||||
if (lpDrop) lstrcpynAtoW(lpszwFile, lpDrop, i);
|
|
||||||
else lstrcpynW (lpszwFile, lpwDrop, i);
|
|
||||||
}
|
|
||||||
return i;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*************************************************************************
|
|
||||||
* DragQueryFileA [SHELL32.81] [shell32.82]
|
|
||||||
*/
|
|
||||||
UINT WINAPI DragQueryFileA(HDROP hDrop, UINT lFile, LPSTR lpszFile,
|
|
||||||
UINT 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 */
|
|
||||||
|
|
||||||
LPDROPFILESTRUCT lpDropFileStruct;
|
|
||||||
LPSTR lpCurrent;
|
|
||||||
UINT i;
|
|
||||||
|
|
||||||
TRACE("(%08x, %x, %p, %u)\n", hDrop,lFile,lpszFile,lLength);
|
|
||||||
|
|
||||||
lpDropFileStruct = (LPDROPFILESTRUCT) GlobalLock(hDrop);
|
|
||||||
if(!lpDropFileStruct)
|
|
||||||
return 0;
|
|
||||||
|
|
||||||
lpCurrent = (LPSTR) lpDropFileStruct + lpDropFileStruct->lSize;
|
|
||||||
i = SHELL_DragQueryFile(lpCurrent, NULL, lFile, lpszFile, NULL, lLength);
|
|
||||||
GlobalUnlock(hDrop);
|
|
||||||
return i;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*************************************************************************
|
|
||||||
* DragQueryFileW [shell32.133]
|
|
||||||
*/
|
|
||||||
UINT WINAPI DragQueryFileW(HDROP hDrop, UINT lFile, LPWSTR lpszwFile,
|
|
||||||
UINT lLength)
|
|
||||||
{
|
|
||||||
LPDROPFILESTRUCT lpDropFileStruct;
|
|
||||||
LPWSTR lpwCurrent;
|
|
||||||
UINT i;
|
|
||||||
|
|
||||||
TRACE("(%08x, %x, %p, %u)\n", hDrop,lFile,lpszwFile,lLength);
|
|
||||||
|
|
||||||
lpDropFileStruct = (LPDROPFILESTRUCT) GlobalLock(hDrop);
|
|
||||||
if(!lpDropFileStruct)
|
|
||||||
return 0;
|
|
||||||
|
|
||||||
lpwCurrent = (LPWSTR) lpDropFileStruct + lpDropFileStruct->lSize;
|
|
||||||
i = SHELL_DragQueryFile(NULL, lpwCurrent, lFile, NULL, lpszwFile,lLength);
|
|
||||||
GlobalUnlock(hDrop);
|
|
||||||
return i;
|
|
||||||
}
|
|
||||||
/*************************************************************************
|
/*************************************************************************
|
||||||
* DragQueryFile16 [SHELL.11]
|
* DragQueryFile16 [SHELL.11]
|
||||||
*/
|
*/
|
||||||
UINT16 WINAPI DragQueryFile16(HDROP16 hDrop, WORD wFile, LPSTR lpszFile,
|
UINT16 WINAPI DragQueryFile16(
|
||||||
WORD wLength)
|
HDROP16 hDrop,
|
||||||
{ /* hDrop is a global memory block allocated with GMEM_SHARE
|
WORD wFile,
|
||||||
* with DROPFILESTRUCT as a header and filenames following
|
LPSTR lpszFile,
|
||||||
* it, zero length filename is in the end */
|
WORD wLength)
|
||||||
|
|
||||||
LPDROPFILESTRUCT16 lpDropFileStruct;
|
|
||||||
LPSTR lpCurrent;
|
|
||||||
WORD i;
|
|
||||||
|
|
||||||
TRACE("(%04x, %x, %p, %u)\n", hDrop,wFile,lpszFile,wLength);
|
|
||||||
|
|
||||||
lpDropFileStruct = (LPDROPFILESTRUCT16) GlobalLock16(hDrop);
|
|
||||||
if(!lpDropFileStruct)
|
|
||||||
return 0;
|
|
||||||
|
|
||||||
lpCurrent = (LPSTR) lpDropFileStruct + lpDropFileStruct->wSize;
|
|
||||||
|
|
||||||
i = (WORD)SHELL_DragQueryFile(lpCurrent, NULL, wFile==0xffff?0xffffffff:wFile,
|
|
||||||
lpszFile, NULL, wLength);
|
|
||||||
GlobalUnlock16(hDrop);
|
|
||||||
return i;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/*************************************************************************
|
|
||||||
* DragFinish [SHELL32.80]
|
|
||||||
*/
|
|
||||||
void WINAPI DragFinish(HDROP h)
|
|
||||||
{
|
{
|
||||||
TRACE("\n");
|
LPSTR lpDrop;
|
||||||
GlobalFree((HGLOBAL)h);
|
UINT i = 0;
|
||||||
|
LPDROPFILESTRUCT16 lpDropFileStruct = (LPDROPFILESTRUCT16) GlobalLock16(hDrop);
|
||||||
|
|
||||||
|
TRACE("(%04x, %x, %p, %u)\n", hDrop,wFile,lpszFile,wLength);
|
||||||
|
|
||||||
|
if(!lpDropFileStruct) goto end;
|
||||||
|
|
||||||
|
lpDrop = (LPSTR) lpDropFileStruct + lpDropFileStruct->wSize;
|
||||||
|
wFile = (wFile==0xffff) ? 0xffffffff : wFile;
|
||||||
|
|
||||||
|
while (i++ < wFile)
|
||||||
|
{
|
||||||
|
while (*lpDrop++); /* skip filename */
|
||||||
|
if (!*lpDrop)
|
||||||
|
{
|
||||||
|
i = (wFile == 0xFFFFFFFF) ? i : 0;
|
||||||
|
goto end;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
i = lstrlenA(lpDrop);
|
||||||
|
i++;
|
||||||
|
if (!lpszFile ) goto end; /* needed buffer size */
|
||||||
|
i = (wLength > i) ? i : wLength;
|
||||||
|
lstrcpynA (lpszFile, lpDrop, i);
|
||||||
|
end:
|
||||||
|
GlobalUnlock16(hDrop);
|
||||||
|
return i;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*************************************************************************
|
/*************************************************************************
|
||||||
|
@ -283,23 +180,6 @@ void WINAPI DragFinish16(HDROP16 h)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/*************************************************************************
|
|
||||||
* DragQueryPoint [SHELL32.135]
|
|
||||||
*/
|
|
||||||
BOOL WINAPI DragQueryPoint(HDROP hDrop, POINT *p)
|
|
||||||
{
|
|
||||||
LPDROPFILESTRUCT lpDropFileStruct;
|
|
||||||
BOOL bRet;
|
|
||||||
TRACE("\n");
|
|
||||||
lpDropFileStruct = (LPDROPFILESTRUCT) GlobalLock(hDrop);
|
|
||||||
|
|
||||||
memcpy(p,&lpDropFileStruct->ptMousePos,sizeof(POINT));
|
|
||||||
bRet = lpDropFileStruct->fInNonClientArea;
|
|
||||||
|
|
||||||
GlobalUnlock(hDrop);
|
|
||||||
return bRet;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*************************************************************************
|
/*************************************************************************
|
||||||
* DragQueryPoint16 [SHELL.13]
|
* DragQueryPoint16 [SHELL.13]
|
||||||
*/
|
*/
|
||||||
|
@ -553,7 +433,7 @@ HINSTANCE16 WINAPI ShellExecute16( HWND16 hWnd, LPCSTR lpOperation,
|
||||||
|
|
||||||
/* Remove File Protocol from lpFile */
|
/* Remove File Protocol from lpFile */
|
||||||
/* In the case file://path/file */
|
/* In the case file://path/file */
|
||||||
if(!_strnicmp(lpFile,"file",iSize))
|
if(!strncasecmp(lpFile,"file",iSize))
|
||||||
{
|
{
|
||||||
lpFile += iSize;
|
lpFile += iSize;
|
||||||
while(*lpFile == ':') lpFile++;
|
while(*lpFile == ':') lpFile++;
|
||||||
|
@ -603,7 +483,7 @@ HINSTANCE16 WINAPI ShellExecute16( HWND16 hWnd, LPCSTR lpOperation,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
/* Check if file specified is in the form www.??????.*** */
|
/* Check if file specified is in the form www.??????.*** */
|
||||||
else if(!_strnicmp(lpFile,"www",3))
|
else if(!strncasecmp(lpFile,"www",3))
|
||||||
{
|
{
|
||||||
/* if so, append lpFile http:// and call ShellExecute */
|
/* if so, append lpFile http:// and call ShellExecute */
|
||||||
char lpstrTmpFile[256] = "http://" ;
|
char lpstrTmpFile[256] = "http://" ;
|
||||||
|
|
|
@ -215,7 +215,7 @@ LPCLASSFACTORY IClassFactory_Constructor(REFCLSID rclsid)
|
||||||
lpclf->rclsid = (CLSID*)rclsid;
|
lpclf->rclsid = (CLSID*)rclsid;
|
||||||
|
|
||||||
TRACE("(%p)->()\n",lpclf);
|
TRACE("(%p)->()\n",lpclf);
|
||||||
shell32_ObjCount++;
|
InterlockedIncrement(&shell32_ObjCount);
|
||||||
return (LPCLASSFACTORY)lpclf;
|
return (LPCLASSFACTORY)lpclf;
|
||||||
}
|
}
|
||||||
/**************************************************************************
|
/**************************************************************************
|
||||||
|
@ -252,8 +252,8 @@ static ULONG WINAPI IClassFactory_fnAddRef(LPCLASSFACTORY iface)
|
||||||
ICOM_THIS(IClassFactoryImpl,iface);
|
ICOM_THIS(IClassFactoryImpl,iface);
|
||||||
TRACE("(%p)->(count=%lu)\n",This,This->ref);
|
TRACE("(%p)->(count=%lu)\n",This,This->ref);
|
||||||
|
|
||||||
shell32_ObjCount++;
|
InterlockedIncrement(&shell32_ObjCount);
|
||||||
return ++(This->ref);
|
return InterlockedIncrement(&This->ref);
|
||||||
}
|
}
|
||||||
/******************************************************************************
|
/******************************************************************************
|
||||||
* IClassFactory_Release
|
* IClassFactory_Release
|
||||||
|
@ -263,11 +263,12 @@ static ULONG WINAPI IClassFactory_fnRelease(LPCLASSFACTORY iface)
|
||||||
ICOM_THIS(IClassFactoryImpl,iface);
|
ICOM_THIS(IClassFactoryImpl,iface);
|
||||||
TRACE("(%p)->(count=%lu)\n",This,This->ref);
|
TRACE("(%p)->(count=%lu)\n",This,This->ref);
|
||||||
|
|
||||||
shell32_ObjCount--;
|
InterlockedDecrement(&shell32_ObjCount);
|
||||||
if (!--(This->ref))
|
if (!InterlockedDecrement(&This->ref))
|
||||||
{ TRACE("-- destroying IClassFactory(%p)\n",This);
|
{
|
||||||
HeapFree(GetProcessHeap(),0,This);
|
TRACE("-- destroying IClassFactory(%p)\n",This);
|
||||||
return 0;
|
HeapFree(GetProcessHeap(),0,This);
|
||||||
|
return 0;
|
||||||
}
|
}
|
||||||
return This->ref;
|
return This->ref;
|
||||||
}
|
}
|
||||||
|
@ -355,7 +356,7 @@ typedef struct
|
||||||
CLSID *rclsid;
|
CLSID *rclsid;
|
||||||
LPFNCREATEINSTANCE lpfnCI;
|
LPFNCREATEINSTANCE lpfnCI;
|
||||||
const IID * riidInst;
|
const IID * riidInst;
|
||||||
UINT * pcRefDll; /* pointer to refcounter in external dll (ugrrr...) */
|
ULONG * pcRefDll; /* pointer to refcounter in external dll (ugrrr...) */
|
||||||
} IDefClFImpl;
|
} IDefClFImpl;
|
||||||
|
|
||||||
static ICOM_VTABLE(IClassFactory) dclfvt;
|
static ICOM_VTABLE(IClassFactory) dclfvt;
|
||||||
|
@ -364,7 +365,7 @@ static ICOM_VTABLE(IClassFactory) dclfvt;
|
||||||
* IDefClF_fnConstructor
|
* IDefClF_fnConstructor
|
||||||
*/
|
*/
|
||||||
|
|
||||||
IClassFactory * IDefClF_fnConstructor(LPFNCREATEINSTANCE lpfnCI, UINT * pcRefDll, REFIID riidInst)
|
IClassFactory * IDefClF_fnConstructor(LPFNCREATEINSTANCE lpfnCI, PLONG pcRefDll, REFIID riidInst)
|
||||||
{
|
{
|
||||||
IDefClFImpl* lpclf;
|
IDefClFImpl* lpclf;
|
||||||
|
|
||||||
|
@ -374,13 +375,11 @@ IClassFactory * IDefClF_fnConstructor(LPFNCREATEINSTANCE lpfnCI, UINT * pcRefDll
|
||||||
lpclf->lpfnCI = lpfnCI;
|
lpclf->lpfnCI = lpfnCI;
|
||||||
lpclf->pcRefDll = pcRefDll;
|
lpclf->pcRefDll = pcRefDll;
|
||||||
|
|
||||||
if (pcRefDll)
|
if (pcRefDll) InterlockedIncrement(pcRefDll);
|
||||||
(*pcRefDll)++;
|
|
||||||
|
|
||||||
lpclf->riidInst = riidInst;
|
lpclf->riidInst = riidInst;
|
||||||
|
|
||||||
TRACE("(%p)\n\tIID:\t%s\n",lpclf, debugstr_guid(riidInst));
|
TRACE("(%p)\n\tIID:\t%s\n",lpclf, debugstr_guid(riidInst));
|
||||||
shell32_ObjCount++;
|
InterlockedIncrement(&shell32_ObjCount);
|
||||||
return (LPCLASSFACTORY)lpclf;
|
return (LPCLASSFACTORY)lpclf;
|
||||||
}
|
}
|
||||||
/**************************************************************************
|
/**************************************************************************
|
||||||
|
@ -418,9 +417,8 @@ static ULONG WINAPI IDefClF_fnAddRef(LPCLASSFACTORY iface)
|
||||||
ICOM_THIS(IDefClFImpl,iface);
|
ICOM_THIS(IDefClFImpl,iface);
|
||||||
TRACE("(%p)->(count=%lu)\n",This,This->ref);
|
TRACE("(%p)->(count=%lu)\n",This,This->ref);
|
||||||
|
|
||||||
shell32_ObjCount++;
|
InterlockedIncrement(&shell32_ObjCount);
|
||||||
|
return InterlockedIncrement(&This->ref);
|
||||||
return ++(This->ref);
|
|
||||||
}
|
}
|
||||||
/******************************************************************************
|
/******************************************************************************
|
||||||
* IDefClF_fnRelease
|
* IDefClF_fnRelease
|
||||||
|
@ -430,12 +428,11 @@ static ULONG WINAPI IDefClF_fnRelease(LPCLASSFACTORY iface)
|
||||||
ICOM_THIS(IDefClFImpl,iface);
|
ICOM_THIS(IDefClFImpl,iface);
|
||||||
TRACE("(%p)->(count=%lu)\n",This,This->ref);
|
TRACE("(%p)->(count=%lu)\n",This,This->ref);
|
||||||
|
|
||||||
shell32_ObjCount--;
|
InterlockedDecrement(&shell32_ObjCount);
|
||||||
|
|
||||||
if (!--(This->ref))
|
if (!InterlockedDecrement(&This->ref))
|
||||||
{
|
{
|
||||||
if (This->pcRefDll)
|
if (This->pcRefDll) InterlockedDecrement(This->pcRefDll);
|
||||||
(*This->pcRefDll)--;
|
|
||||||
|
|
||||||
TRACE("-- destroying IClassFactory(%p)\n",This);
|
TRACE("-- destroying IClassFactory(%p)\n",This);
|
||||||
HeapFree(GetProcessHeap(),0,This);
|
HeapFree(GetProcessHeap(),0,This);
|
||||||
|
@ -495,7 +492,7 @@ HRESULT WINAPI SHCreateDefClassObject(
|
||||||
REFIID riid,
|
REFIID riid,
|
||||||
LPVOID* ppv,
|
LPVOID* ppv,
|
||||||
LPFNCREATEINSTANCE lpfnCI, /* create instance callback entry */
|
LPFNCREATEINSTANCE lpfnCI, /* create instance callback entry */
|
||||||
UINT *pcRefDll, /* ref count of the dll */
|
PLONG pcRefDll, /* ref count of the dll */
|
||||||
REFIID riidInst) /* optional interface to the instance */
|
REFIID riidInst) /* optional interface to the instance */
|
||||||
{
|
{
|
||||||
TRACE("\n\tIID:\t%s %p %p %p \n\tIIDIns:\t%s\n",
|
TRACE("\n\tIID:\t%s %p %p %p \n\tIIDIns:\t%s\n",
|
||||||
|
@ -514,3 +511,126 @@ HRESULT WINAPI SHCreateDefClassObject(
|
||||||
return E_NOINTERFACE;
|
return E_NOINTERFACE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*************************************************************************
|
||||||
|
* DragAcceptFiles [SHELL32.54]
|
||||||
|
*/
|
||||||
|
void WINAPI DragAcceptFiles(HWND hWnd, BOOL b)
|
||||||
|
{
|
||||||
|
LONG exstyle;
|
||||||
|
|
||||||
|
if( !IsWindow(hWnd) ) return;
|
||||||
|
exstyle = GetWindowLongA(hWnd,GWL_EXSTYLE);
|
||||||
|
if (b)
|
||||||
|
exstyle |= WS_EX_ACCEPTFILES;
|
||||||
|
else
|
||||||
|
exstyle &= ~WS_EX_ACCEPTFILES;
|
||||||
|
SetWindowLongA(hWnd,GWL_EXSTYLE,exstyle);
|
||||||
|
}
|
||||||
|
|
||||||
|
/*************************************************************************
|
||||||
|
* DragFinish [SHELL32.80]
|
||||||
|
*/
|
||||||
|
void WINAPI DragFinish(HDROP h)
|
||||||
|
{
|
||||||
|
TRACE("\n");
|
||||||
|
GlobalFree((HGLOBAL)h);
|
||||||
|
}
|
||||||
|
|
||||||
|
/*************************************************************************
|
||||||
|
* DragQueryPoint [SHELL32.135]
|
||||||
|
*/
|
||||||
|
BOOL WINAPI DragQueryPoint(HDROP hDrop, POINT *p)
|
||||||
|
{
|
||||||
|
LPDROPFILESTRUCT lpDropFileStruct;
|
||||||
|
BOOL bRet;
|
||||||
|
|
||||||
|
TRACE("\n");
|
||||||
|
|
||||||
|
lpDropFileStruct = (LPDROPFILESTRUCT) GlobalLock(hDrop);
|
||||||
|
|
||||||
|
memcpy(p,&lpDropFileStruct->ptMousePos,sizeof(POINT));
|
||||||
|
bRet = lpDropFileStruct->fInNonClientArea;
|
||||||
|
|
||||||
|
GlobalUnlock(hDrop);
|
||||||
|
return bRet;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*************************************************************************
|
||||||
|
* DragQueryFileA [SHELL32.81] [shell32.82]
|
||||||
|
*/
|
||||||
|
UINT WINAPI DragQueryFileA(
|
||||||
|
HDROP hDrop,
|
||||||
|
UINT lFile,
|
||||||
|
LPSTR lpszFile,
|
||||||
|
UINT lLength)
|
||||||
|
{
|
||||||
|
LPSTR lpDrop;
|
||||||
|
UINT i = 0;
|
||||||
|
LPDROPFILESTRUCT lpDropFileStruct = (LPDROPFILESTRUCT) GlobalLock(hDrop);
|
||||||
|
|
||||||
|
TRACE("(%08x, %x, %p, %u)\n", hDrop,lFile,lpszFile,lLength);
|
||||||
|
|
||||||
|
if(!lpDropFileStruct) goto end;
|
||||||
|
|
||||||
|
lpDrop = (LPSTR) lpDropFileStruct + lpDropFileStruct->lSize;
|
||||||
|
|
||||||
|
while (i++ < lFile)
|
||||||
|
{
|
||||||
|
while (*lpDrop++); /* skip filename */
|
||||||
|
if (!*lpDrop)
|
||||||
|
{
|
||||||
|
i = (lFile == 0xFFFFFFFF) ? i : 0;
|
||||||
|
goto end;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
i = lstrlenA(lpDrop);
|
||||||
|
i++;
|
||||||
|
if (!lpszFile ) goto end; /* needed buffer size */
|
||||||
|
i = (lLength > i) ? i : lLength;
|
||||||
|
lstrcpynA (lpszFile, lpDrop, i);
|
||||||
|
end:
|
||||||
|
GlobalUnlock(hDrop);
|
||||||
|
return i;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*************************************************************************
|
||||||
|
* DragQueryFileW [shell32.133]
|
||||||
|
*/
|
||||||
|
UINT WINAPI DragQueryFileW(
|
||||||
|
HDROP hDrop,
|
||||||
|
UINT lFile,
|
||||||
|
LPWSTR lpszwFile,
|
||||||
|
UINT lLength)
|
||||||
|
{
|
||||||
|
LPWSTR lpwDrop;
|
||||||
|
UINT i = 0;
|
||||||
|
LPDROPFILESTRUCT lpDropFileStruct = (LPDROPFILESTRUCT) GlobalLock(hDrop);
|
||||||
|
|
||||||
|
TRACE("(%08x, %x, %p, %u)\n", hDrop,lFile,lpszwFile,lLength);
|
||||||
|
|
||||||
|
if(!lpDropFileStruct) goto end;
|
||||||
|
|
||||||
|
lpwDrop = (LPWSTR) lpDropFileStruct + lpDropFileStruct->lSize;
|
||||||
|
|
||||||
|
i = 0;
|
||||||
|
while (i++ < lFile)
|
||||||
|
{
|
||||||
|
while (*lpwDrop++); /* skip filename */
|
||||||
|
if (!*lpwDrop)
|
||||||
|
{
|
||||||
|
i = (lFile == 0xFFFFFFFF) ? i : 0;
|
||||||
|
goto end;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
i = lstrlenW(lpwDrop);
|
||||||
|
i++;
|
||||||
|
if ( !lpszwFile) goto end; /* needed buffer size */
|
||||||
|
|
||||||
|
i = (lLength > i) ? i : lLength;
|
||||||
|
lstrcpynW (lpszwFile, lpwDrop, i);
|
||||||
|
end:
|
||||||
|
GlobalUnlock(hDrop);
|
||||||
|
return i;
|
||||||
|
}
|
||||||
|
|
Loading…
Reference in New Issue