diff --git a/dlls/shell32/shell.c b/dlls/shell32/shell.c index 81ff9880288..d3275421d5a 100644 --- a/dlls/shell32/shell.c +++ b/dlls/shell32/shell.c @@ -3,7 +3,6 @@ * * 1998 Marcus Meissner */ -#include #include #include #include @@ -26,8 +25,8 @@ #include "debugtools.h" #include "winreg.h" #include "syslevel.h" +#include "shlwapi.h" #include "imagelist.h" -#include "tchar.h" DEFAULT_DEBUG_CHANNEL(shell) DECLARE_DEBUG_CHANNEL(exec) @@ -123,22 +122,6 @@ BOOL WINAPI SHELL_DllEntryPoint(DWORD Reason, HINSTANCE16 hInst, 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] */ @@ -147,130 +130,44 @@ void WINAPI DragAcceptFiles16(HWND16 hWnd, BOOL16 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] */ -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 */ - - 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) +UINT16 WINAPI DragQueryFile16( + HDROP16 hDrop, + WORD wFile, + LPSTR lpszFile, + WORD wLength) { - TRACE("\n"); - GlobalFree((HGLOBAL)h); + LPSTR lpDrop; + 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] */ @@ -553,7 +433,7 @@ HINSTANCE16 WINAPI ShellExecute16( HWND16 hWnd, LPCSTR lpOperation, /* Remove File Protocol from lpFile */ /* In the case file://path/file */ - if(!_strnicmp(lpFile,"file",iSize)) + if(!strncasecmp(lpFile,"file",iSize)) { lpFile += iSize; while(*lpFile == ':') lpFile++; @@ -603,7 +483,7 @@ HINSTANCE16 WINAPI ShellExecute16( HWND16 hWnd, LPCSTR lpOperation, } } /* 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 */ char lpstrTmpFile[256] = "http://" ; diff --git a/dlls/shell32/shellole.c b/dlls/shell32/shellole.c index c0aa4817bcd..e21b97ef758 100644 --- a/dlls/shell32/shellole.c +++ b/dlls/shell32/shellole.c @@ -215,7 +215,7 @@ LPCLASSFACTORY IClassFactory_Constructor(REFCLSID rclsid) lpclf->rclsid = (CLSID*)rclsid; TRACE("(%p)->()\n",lpclf); - shell32_ObjCount++; + InterlockedIncrement(&shell32_ObjCount); return (LPCLASSFACTORY)lpclf; } /************************************************************************** @@ -252,8 +252,8 @@ static ULONG WINAPI IClassFactory_fnAddRef(LPCLASSFACTORY iface) ICOM_THIS(IClassFactoryImpl,iface); TRACE("(%p)->(count=%lu)\n",This,This->ref); - shell32_ObjCount++; - return ++(This->ref); + InterlockedIncrement(&shell32_ObjCount); + return InterlockedIncrement(&This->ref); } /****************************************************************************** * IClassFactory_Release @@ -263,11 +263,12 @@ static ULONG WINAPI IClassFactory_fnRelease(LPCLASSFACTORY iface) ICOM_THIS(IClassFactoryImpl,iface); TRACE("(%p)->(count=%lu)\n",This,This->ref); - shell32_ObjCount--; - if (!--(This->ref)) - { TRACE("-- destroying IClassFactory(%p)\n",This); - HeapFree(GetProcessHeap(),0,This); - return 0; + InterlockedDecrement(&shell32_ObjCount); + if (!InterlockedDecrement(&This->ref)) + { + TRACE("-- destroying IClassFactory(%p)\n",This); + HeapFree(GetProcessHeap(),0,This); + return 0; } return This->ref; } @@ -355,7 +356,7 @@ typedef struct CLSID *rclsid; LPFNCREATEINSTANCE lpfnCI; const IID * riidInst; - UINT * pcRefDll; /* pointer to refcounter in external dll (ugrrr...) */ + ULONG * pcRefDll; /* pointer to refcounter in external dll (ugrrr...) */ } IDefClFImpl; static ICOM_VTABLE(IClassFactory) dclfvt; @@ -364,7 +365,7 @@ static ICOM_VTABLE(IClassFactory) dclfvt; * IDefClF_fnConstructor */ -IClassFactory * IDefClF_fnConstructor(LPFNCREATEINSTANCE lpfnCI, UINT * pcRefDll, REFIID riidInst) +IClassFactory * IDefClF_fnConstructor(LPFNCREATEINSTANCE lpfnCI, PLONG pcRefDll, REFIID riidInst) { IDefClFImpl* lpclf; @@ -374,13 +375,11 @@ IClassFactory * IDefClF_fnConstructor(LPFNCREATEINSTANCE lpfnCI, UINT * pcRefDll lpclf->lpfnCI = lpfnCI; lpclf->pcRefDll = pcRefDll; - if (pcRefDll) - (*pcRefDll)++; - + if (pcRefDll) InterlockedIncrement(pcRefDll); lpclf->riidInst = riidInst; TRACE("(%p)\n\tIID:\t%s\n",lpclf, debugstr_guid(riidInst)); - shell32_ObjCount++; + InterlockedIncrement(&shell32_ObjCount); return (LPCLASSFACTORY)lpclf; } /************************************************************************** @@ -418,9 +417,8 @@ static ULONG WINAPI IDefClF_fnAddRef(LPCLASSFACTORY iface) ICOM_THIS(IDefClFImpl,iface); TRACE("(%p)->(count=%lu)\n",This,This->ref); - shell32_ObjCount++; - - return ++(This->ref); + InterlockedIncrement(&shell32_ObjCount); + return InterlockedIncrement(&This->ref); } /****************************************************************************** * IDefClF_fnRelease @@ -430,12 +428,11 @@ static ULONG WINAPI IDefClF_fnRelease(LPCLASSFACTORY iface) ICOM_THIS(IDefClFImpl,iface); TRACE("(%p)->(count=%lu)\n",This,This->ref); - shell32_ObjCount--; + InterlockedDecrement(&shell32_ObjCount); - if (!--(This->ref)) + if (!InterlockedDecrement(&This->ref)) { - if (This->pcRefDll) - (*This->pcRefDll)--; + if (This->pcRefDll) InterlockedDecrement(This->pcRefDll); TRACE("-- destroying IClassFactory(%p)\n",This); HeapFree(GetProcessHeap(),0,This); @@ -495,7 +492,7 @@ HRESULT WINAPI SHCreateDefClassObject( REFIID riid, LPVOID* ppv, 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 */ { TRACE("\n\tIID:\t%s %p %p %p \n\tIIDIns:\t%s\n", @@ -514,3 +511,126 @@ HRESULT WINAPI SHCreateDefClassObject( 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; +}