Sync to Wine-20050419:
authorGé van Geldorp <ge@gse.nl>
Fri, 6 May 2005 16:23:24 +0000 (16:23 +0000)
committerGé van Geldorp <ge@gse.nl>
Fri, 6 May 2005 16:23:24 +0000 (16:23 +0000)
Peter Berg Larsen <pebl@math.ku.dk>
- Strncpy elimination.
- Janitorial: Get rid of strncpy/strncpyW.
Jakob Eriksson <jakov@vmlinux.org>
- Get rid of HeapAlloc casts.
Troy Rollo <wine@troy.rollo.name>
- Corrections to UrlIsW and UrlIsA.
- URL_IS_OPAQUE results depend only on the scheme, not on the URL.
- URL_IS_FILEURL also only depends on the scheme ("file:").
Francois Gouget <fgouget@free.fr>
- Assorted spelling fixes.
Robert Shearman <rob@codeweavers.com>
- Fix SHCopyKey to treat string parameter correctly as source path
  instead of destination path.
Jon Griffiths <jon_p_griffiths@yahoo.com>
- Use LMEM_ flags for LocalAlloc(), not GMEM_ (GlobalAlloc).
- Implement @188,190,195,200,256,478,481.
- IUnknown_EnableModeless() also handles IOleInPlaceActiveObject.
- Tests and small fix for PathMakePretty().
- Fix a crash and test failure with early native dlls.

svn path=/trunk/; revision=15050

13 files changed:
reactos/include/wine/shlguid.h
reactos/lib/shlwapi/istream.c
reactos/lib/shlwapi/ordinal.c
reactos/lib/shlwapi/path.c
reactos/lib/shlwapi/reg.c
reactos/lib/shlwapi/regstream.c
reactos/lib/shlwapi/shlwapi.spec
reactos/lib/shlwapi/string.c
reactos/lib/shlwapi/url.c
reactos/w32api/include/ocidl.h
reactos/w32api/include/oleidl.h
reactos/w32api/include/shlguid.h
reactos/w32api/include/shlobj.h

index 2206ca2..f9027b8 100644 (file)
@@ -34,6 +34,7 @@ DEFINE_SHLGUID(IID_IEnumIDList,         0x000214F2L, 0, 0);
 DEFINE_SHLGUID(IID_IShellLinkW,         0x000214F9L, 0, 0);
 DEFINE_SHLGUID(IID_IShellExecuteHookA,  0x000214F5L, 0, 0);
 DEFINE_SHLGUID(IID_IShellExecuteHookW,  0x000214FBL, 0, 0);
+DEFINE_SHLGUID(IID_IQueryInfo,          0x00021500L, 0, 0);
 
 DEFINE_GUID(SID_STopLevelBrowser, 0x4C96BE40L, 0x915C, 0x11CF, 0x99, 0xD3, 0x00, 0xAA, 0x00, 0x4A, 0xE8, 0x37);
 
@@ -52,4 +53,7 @@ DEFINE_GUID(CLSID_DragDropHelper, 0x4657278a, 0x411b, 0x11d2, 0x83, 0x9a, 0x0, 0
 
 DEFINE_GUID(CLSID_AutoComplete, 0x00bb2763, 0x6a77, 0x11d0, 0xa5, 0x35, 0x00, 0xc0, 0x4f, 0xd7, 0xd0, 0x62);
 
+DEFINE_GUID(IID_IInputObject,       0x068284FAA, 0x6A48, 0x11D0, 0x8C, 0x78, 0x00, 0xC0, 0x4F, 0xD9, 0x18, 0xB4);
+DEFINE_GUID(IID_IInputObjectSite,   0x0F1DB8392, 0x7331, 0x11D0, 0x8C, 0x99, 0x00, 0xA0, 0xC9, 0x2D, 0xBF, 0xE8);
+
 #endif /* __WINE_SHLGUID_H */
index 50581c0..46967fe 100644 (file)
@@ -352,7 +352,7 @@ static IStream *IStream_Create(LPCWSTR lpszPath, HANDLE hFile, DWORD dwMode)
 {\r
  ISHFileStream* fileStream;\r
 \r
- fileStream = (ISHFileStream*)HeapAlloc(GetProcessHeap(), 0, sizeof(ISHFileStream));\r
+ fileStream = HeapAlloc(GetProcessHeap(), 0, sizeof(ISHFileStream));\r
 \r
  if (fileStream)\r
  {\r
index 112c124..6fafe1d 100644 (file)
@@ -1339,7 +1339,7 @@ DWORD WINAPI IUnknown_AtomicRelease(IUnknown ** lpUnknown)
     *lpUnknown = NULL;\r
 \r
     TRACE("doing Release\n");\r
-    \r
+\r
     return IUnknown_Release(temp);\r
 }\r
 \r
@@ -1397,7 +1397,7 @@ BOOL WINAPI SHIsSameObject(IUnknown* lpInt1, IUnknown* lpInt2)
 \r
   if (lpUnknown1 == lpUnknown2)\r
     return TRUE;\r
-  \r
+\r
   return FALSE;\r
 }\r
 \r
@@ -1847,13 +1847,47 @@ DWORD WINAPI SHLoadFromPropertyBag(IUnknown *lpUnknown, IPropertyBag* lpPropBag)
   return hRet;\r
 }\r
 \r
+/*************************************************************************\r
+ * @  [SHLWAPI.188]\r
+ *\r
+ * Call IOleControlSite_TranslateAccelerator()  on an object.\r
+ *\r
+ * PARAMS\r
+ *  lpUnknown   [I] Object supporting the IOleControlSite interface.\r
+ *  lpMsg       [I] Key message to be processed.\r
+ *  dwModifiers [I] Flags containing the state of the modifier keys.\r
+ *\r
+ * RETURNS\r
+ *  Success: S_OK.\r
+ *  Failure: An HRESULT error code, or E_INVALIDARG if lpUnknown is NULL.\r
+ */\r
+HRESULT WINAPI IUnknown_TranslateAcceleratorOCS(IUnknown *lpUnknown, LPMSG lpMsg, DWORD dwModifiers)\r
+{\r
+  IOleControlSite* lpCSite = NULL;\r
+  HRESULT hRet = E_INVALIDARG;\r
+\r
+  TRACE("(%p,%p,0x%08lx)\n", lpUnknown, lpMsg, dwModifiers);\r
+  if (lpUnknown)\r
+  {\r
+    hRet = IUnknown_QueryInterface(lpUnknown, &IID_IOleControlSite,\r
+                                   (void**)&lpCSite);\r
+    if (SUCCEEDED(hRet) && lpCSite)\r
+    {\r
+      hRet = IOleControlSite_TranslateAccelerator(lpCSite, lpMsg, dwModifiers);\r
+      IOleControlSite_Release(lpCSite);\r
+    }\r
+  }\r
+  return hRet;\r
+}\r
+\r
+\r
 /*************************************************************************\r
  * @  [SHLWAPI.189]\r
  *\r
  * Call IOleControlSite_GetExtendedControl() on an object.\r
  *\r
  * PARAMS\r
- *  lpUnknown [I] Object supporting the IOleControlSite interface\r
+ *  lpUnknown [I] Object supporting the IOleControlSite interface.\r
  *  lppDisp   [O] Destination for resulting IDispatch.\r
  *\r
  * RETURNS\r
@@ -1862,7 +1896,7 @@ DWORD WINAPI SHLoadFromPropertyBag(IUnknown *lpUnknown, IPropertyBag* lpPropBag)
  */\r
 DWORD WINAPI IUnknown_OnFocusOCS(IUnknown *lpUnknown, IDispatch** lppDisp)\r
 {\r
-  IOleControlSite* lpCSite;\r
+  IOleControlSite* lpCSite = NULL;\r
   HRESULT hRet = E_FAIL;\r
 \r
   TRACE("(%p,%p)\n", lpUnknown, lppDisp);\r
@@ -1879,6 +1913,41 @@ DWORD WINAPI IUnknown_OnFocusOCS(IUnknown *lpUnknown, IDispatch** lppDisp)
   return hRet;\r
 }\r
 \r
+/*************************************************************************\r
+ * @    [SHLWAPI.190]\r
+ */\r
+HRESULT WINAPI IUnknown_HandleIRestrict(LPUNKNOWN lpUnknown, PVOID lpArg1,\r
+                                        PVOID lpArg2, PVOID lpArg3, PVOID lpArg4)\r
+{\r
+  /* FIXME: {D12F26B2-D90A-11D0-830D-00AA005B4383} - What object does this represent? */\r
+  static const DWORD service_id[] = { 0xd12f26b2, 0x11d0d90a, 0xaa000d83, 0x83435b00 };\r
+  /* FIXME: {D12F26B1-D90A-11D0-830D-00AA005B4383} - Also Unknown/undocumented */\r
+  static const DWORD function_id[] = { 0xd12f26b1, 0x11d0d90a, 0xaa000d83, 0x83435b00 };\r
+  HRESULT hRet = E_INVALIDARG;\r
+  LPUNKNOWN lpUnkInner = NULL; /* FIXME: Real type is unknown */\r
+\r
+  TRACE("(%p,%p,%p,%p,%p)\n", lpUnknown, lpArg1, lpArg2, lpArg3, lpArg4);\r
+\r
+  if (lpUnknown && lpArg4)\r
+  {\r
+     hRet = IUnknown_QueryService(lpUnknown, (REFGUID)service_id,\r
+                                  (REFGUID)function_id, (void**)&lpUnkInner);\r
+\r
+     if (SUCCEEDED(hRet) && lpUnkInner)\r
+     {\r
+       /* FIXME: The type of service object requested is unknown, however\r
+       * testing shows that its first method is called with 4 parameters.\r
+       * Fake this by using IParseDisplayName_ParseDisplayName since the\r
+       * signature and position in the vtable matches our unknown object type.\r
+       */\r
+       hRet = IParseDisplayName_ParseDisplayName((LPPARSEDISPLAYNAME)lpUnkInner,\r
+                                                 lpArg1, lpArg2, lpArg3, lpArg4);\r
+       IUnknown_Release(lpUnkInner);\r
+     }\r
+  }\r
+  return hRet;\r
+}\r
+\r
 /*************************************************************************\r
  * @    [SHLWAPI.192]\r
  *\r
@@ -1965,6 +2034,55 @@ DWORD WINAPI SHWaitForSendMessageThread(HANDLE hand, DWORD dwTimeout)
   return dwRet;\r
 }\r
 \r
+/*************************************************************************\r
+ *      @       [SHLWAPI.195]\r
+ *\r
+ * Determine if a shell folder can be expanded.\r
+ *\r
+ * PARAMS\r
+ *  lpFolder [I] Parent folder containing the object to test.\r
+ *  pidl     [I] Id of the object to test.\r
+ *\r
+ * RETURNS\r
+ *  Success: S_OK, if the object is expandable, S_FALSE otherwise.\r
+ *  Failure: E_INVALIDARG, if any argument is invalid.\r
+ *\r
+ * NOTES\r
+ *  If the object to be tested does not expose the IQueryInfo() interface it\r
+ *  will not be identified as an expandable folder.\r
+ */\r
+HRESULT WINAPI SHIsExpandableFolder(LPSHELLFOLDER lpFolder, LPCITEMIDLIST pidl)\r
+{\r
+  HRESULT hRet = E_INVALIDARG;\r
+  IQueryInfo *lpInfo;\r
+\r
+  if (lpFolder && pidl)\r
+  {\r
+    hRet = IShellFolder_GetUIObjectOf(lpFolder, NULL, 1, &pidl, &IID_IQueryInfo,\r
+                                      NULL, (void**)&lpInfo);\r
+    if (FAILED(hRet))\r
+      hRet = S_FALSE; /* Doesn't expose IQueryInfo */\r
+    else\r
+    {\r
+      DWORD dwFlags = 0;\r
+\r
+      /* MSDN states of IQueryInfo_GetInfoFlags() that "This method is not\r
+       * currently used". Really? You wouldn't be holding out on me would you?\r
+       */\r
+      hRet = IQueryInfo_GetInfoFlags(lpInfo, &dwFlags);\r
+\r
+      if (SUCCEEDED(hRet))\r
+      {\r
+        /* 0x2 is an undocumented flag apparently indicating expandability */\r
+        hRet = dwFlags & 0x2 ? S_OK : S_FALSE;\r
+      }\r
+\r
+      IQueryInfo_Release(lpInfo);\r
+    }\r
+  }\r
+  return hRet;\r
+}\r
+\r
 /*************************************************************************\r
  *      @       [SHLWAPI.197]\r
  *\r
@@ -2050,6 +2168,21 @@ VOID WINAPI IUnknown_Set(IUnknown **lppDest, IUnknown *lpUnknown)
   }\r
 }\r
 \r
+/*************************************************************************\r
+ *      @      [SHLWAPI.200]\r
+ *\r
+ */\r
+HRESULT WINAPI MayQSForward(IUnknown* lpUnknown, PVOID lpReserved,\r
+                            REFGUID riidCmdGrp, ULONG cCmds,\r
+                            OLECMD *prgCmds, OLECMDTEXT* pCmdText)\r
+{\r
+  FIXME("(%p,%p,%p,%ld,%p,%p) - stub\n",\r
+        lpUnknown, lpReserved, riidCmdGrp, cCmds, prgCmds, pCmdText);\r
+\r
+  /* FIXME: Calls IsQSForward & IUnknown_QueryStatus */\r
+  return DRAGDROP_E_NOTREGISTERED;\r
+}\r
+\r
 /*************************************************************************\r
  *      @      [SHLWAPI.201]\r
  *\r
@@ -2350,6 +2483,29 @@ LRESULT CALLBACK SHDefWindowProc(HWND hWnd, UINT uMessage, WPARAM wParam, LPARAM
        return DefWindowProcA(hWnd, uMessage, wParam, lParam);\r
 }\r
 \r
+/*************************************************************************\r
+ *      @       [SHLWAPI.256]\r
+ */\r
+HRESULT WINAPI IUnknown_GetSite(LPUNKNOWN lpUnknown, REFIID iid, PVOID *lppSite)\r
+{\r
+  HRESULT hRet = E_INVALIDARG;\r
+  LPOBJECTWITHSITE lpSite = NULL;\r
+\r
+  TRACE("(%p,%s,%p)\n", lpUnknown, debugstr_guid(iid), lppSite);\r
+\r
+  if (lpUnknown && iid && lppSite)\r
+  {\r
+    hRet = IUnknown_QueryInterface(lpUnknown, &IID_IObjectWithSite,\r
+                                   (void**)&lpSite);\r
+    if (SUCCEEDED(hRet) && lpSite)\r
+    {\r
+      hRet = IObjectWithSite_GetSite(lpSite, iid, lppSite);\r
+      IObjectWithSite_Release(lpSite);\r
+    }\r
+  }\r
+  return hRet;\r
+}\r
+\r
 /*************************************************************************\r
  *      @      [SHLWAPI.257]\r
  *\r
@@ -2510,7 +2666,7 @@ DWORD WINAPI SHRestrictionLookup(
  *  Failure: An HRESULT error code.\r
  *\r
  * NOTES\r
- *   This QueryInterface asks the inner object for a interface. In case\r
+ *   This QueryInterface asks the inner object for an interface. In case\r
  *   of aggregation this request would be forwarded by the inner to the\r
  *   outer object. This function asks the inner object directly for the\r
  *   interface circumventing the forwarding to the outer object.\r
@@ -3051,7 +3207,8 @@ WORD WINAPI VerQueryValueWrapW(
  * NOTES\r
  *  lpUnknown must support the IOleInPlaceFrame interface, the\r
  *  IInternetSecurityMgrSite interface, the IShellBrowser interface\r
- *  or the IDocHostUIHandler interface, or this call fails.\r
+ *  the IDocHostUIHandler interface, or the IOleInPlaceActiveObject interface,\r
+ *  or this call will fail.\r
  */\r
 HRESULT WINAPI IUnknown_EnableModeless(IUnknown *lpUnknown, BOOL bModeless)\r
 {\r
@@ -3063,7 +3220,9 @@ HRESULT WINAPI IUnknown_EnableModeless(IUnknown *lpUnknown, BOOL bModeless)
   if (!lpUnknown)\r
     return E_FAIL;\r
 \r
-  if (IsIface(IOleInPlaceFrame))\r
+  if (IsIface(IOleInPlaceActiveObject))\r
+    EnableModeless(IOleInPlaceActiveObject);\r
+  else if (IsIface(IOleInPlaceFrame))\r
     EnableModeless(IOleInPlaceFrame);\r
   else if (IsIface(IShellBrowser))\r
     EnableModeless(IShellBrowser);\r
@@ -3696,7 +3855,7 @@ BOOL WINAPI IsOS(DWORD feature)
     case OS_HOME:\r
         ISOS_RETURN(platform == VER_PLATFORM_WIN32_NT && majorv >= 5 && minorv >= 1)\r
     case OS_PROFESSIONAL:\r
-        ISOS_RETURN(platform == VER_PLATFORM_WIN32_NT) \r
+        ISOS_RETURN(platform == VER_PLATFORM_WIN32_NT)\r
     case OS_DATACENTER:\r
         ISOS_RETURN(platform == VER_PLATFORM_WIN32_NT)\r
     case OS_ADVSERVER:\r
@@ -3746,6 +3905,70 @@ BOOL WINAPI IsOS(DWORD feature)
     return FALSE;\r
 }\r
 \r
+/*************************************************************************\r
+ * @  [SHLWAPI.478]\r
+ *\r
+ * Call IInputObject_TranslateAcceleratorIO() on an object.\r
+ *\r
+ * PARAMS\r
+ *  lpUnknown [I] Object supporting the IInputObject interface.\r
+ *  lpMsg     [I] Key message to be processed.\r
+ *\r
+ * RETURNS\r
+ *  Success: S_OK.\r
+ *  Failure: An HRESULT error code, or E_INVALIDARG if lpUnknown is NULL.\r
+ */\r
+HRESULT WINAPI IUnknown_TranslateAcceleratorIO(IUnknown *lpUnknown, LPMSG lpMsg)\r
+{\r
+  IInputObject* lpInput = NULL;\r
+  HRESULT hRet = E_INVALIDARG;\r
+\r
+  TRACE("(%p,%p)\n", lpUnknown, lpMsg);\r
+  if (lpUnknown)\r
+  {\r
+    hRet = IUnknown_QueryInterface(lpUnknown, &IID_IInputObject,\r
+                                   (void**)&lpInput);\r
+    if (SUCCEEDED(hRet) && lpInput)\r
+    {\r
+      hRet = IInputObject_TranslateAcceleratorIO(lpInput, lpMsg);\r
+      IInputObject_Release(lpInput);\r
+    }\r
+  }\r
+  return hRet;\r
+}\r
+\r
+/*************************************************************************\r
+ * @  [SHLWAPI.481]\r
+ *\r
+ * Call IInputObject_HasFocusIO() on an object.\r
+ *\r
+ * PARAMS\r
+ *  lpUnknown [I] Object supporting the IInputObject interface.\r
+ *\r
+ * RETURNS\r
+ *  Success: S_OK, if lpUnknown is an IInputObject object and has the focus,\r
+ *           or S_FALSE otherwise.\r
+ *  Failure: An HRESULT error code, or E_INVALIDARG if lpUnknown is NULL.\r
+ */\r
+HRESULT WINAPI IUnknown_HasFocusIO(IUnknown *lpUnknown)\r
+{\r
+  IInputObject* lpInput = NULL;\r
+  HRESULT hRet = E_INVALIDARG;\r
+\r
+  TRACE("(%p)\n", lpUnknown);\r
+  if (lpUnknown)\r
+  {\r
+    hRet = IUnknown_QueryInterface(lpUnknown, &IID_IInputObject,\r
+                                   (void**)&lpInput);\r
+    if (SUCCEEDED(hRet) && lpInput)\r
+    {\r
+      hRet = IInputObject_HasFocusIO(lpInput);\r
+      IInputObject_Release(lpInput);\r
+    }\r
+  }\r
+  return hRet;\r
+}\r
+\r
 /*************************************************************************\r
  *      ColorRGBToHLS  [SHLWAPI.@]\r
  *\r
@@ -3940,9 +4163,9 @@ VOID WINAPI FixSlashesAndColonW(LPWSTR lpwstr)
 /*************************************************************************\r
  *      @      [SHLWAPI.461]\r
  */\r
-DWORD WINAPI SHGetAppCompatFlags(DWORD Unknown)\r
+DWORD WINAPI SHGetAppCompatFlags(DWORD dwUnknown)\r
 {\r
-  FIXME("stub\n");\r
+  FIXME("(0x%08lx) stub\n", dwUnknown);\r
   return 0;\r
 }\r
 \r
@@ -4015,17 +4238,24 @@ HRESULT WINAPI SHQueueUserWorkItem(DWORD a, DWORD b, DWORD c, DWORD d, DWORD e,
 /***********************************************************************\r
  *             IUnknown_OnFocusChangeIS (SHLWAPI.@)\r
  */\r
-DWORD WINAPI IUnknown_OnFocusChangeIS(IUnknown * pUnk, IUnknown * pFocusObject, BOOL bChange)\r
+HRESULT WINAPI IUnknown_OnFocusChangeIS(LPUNKNOWN lpUnknown, LPUNKNOWN pFocusObject, BOOL bFocus)\r
 {\r
-    FIXME("(%p, %p, %s)\n", pUnk, pFocusObject, bChange ? "TRUE" : "FALSE");\r
+    IInputObjectSite *pIOS = NULL;\r
+    HRESULT hRet = E_INVALIDARG;\r
 \r
-/*\r
-    IInputObjectSite * pIOS = NULL;\r
-    if (SUCCEEDED(IUnknown_QueryInterface(pUnk, &IID_IInputObjectSite, (void **)&pIOS))\r
-        IInputObjectSite_OnFocusChangeIS(pIOS, pFocusObject, bChange);\r
-*/\r
+    TRACE("(%p, %p, %s)\n", lpUnknown, pFocusObject, bFocus ? "TRUE" : "FALSE");\r
 \r
-    return 0;\r
+    if (lpUnknown)\r
+    {\r
+        hRet = IUnknown_QueryInterface(lpUnknown, &IID_IInputObjectSite,\r
+                                       (void **)&pIOS);\r
+        if (SUCCEEDED(hRet) && pIOS)\r
+        {\r
+            hRet = IInputObjectSite_OnFocusChangeIS(pIOS, pFocusObject, bFocus);\r
+            IInputObjectSite_Release(pIOS);\r
+        }\r
+    }\r
+    return hRet;\r
 }\r
 \r
 /***********************************************************************\r
index 1c070f1..bb1c3f2 100644 (file)
@@ -168,14 +168,14 @@ LPWSTR WINAPI PathCombineW(LPWSTR lpszDest, LPCWSTR lpszDir, LPCWSTR lpszFile)
   if (!lpszFile || !*lpszFile)\r
   {\r
     /* Use dir only */\r
-    strncpyW(szTemp, lpszDir, MAX_PATH);\r
+    lstrcpynW(szTemp, lpszDir, MAX_PATH);\r
   }\r
   else if (!lpszDir || !*lpszDir || !PathIsRelativeW(lpszFile))\r
   {\r
     if (!lpszDir || !*lpszDir || *lpszFile != '\\' || PathIsUNCW(lpszFile))\r
     {\r
       /* Use file only */\r
-      strncpyW(szTemp, lpszFile, MAX_PATH);\r
+      lstrcpynW(szTemp, lpszFile, MAX_PATH);\r
     }\r
     else\r
     {\r
@@ -188,7 +188,7 @@ LPWSTR WINAPI PathCombineW(LPWSTR lpszDest, LPCWSTR lpszDir, LPCWSTR lpszFile)
 \r
   if (bUseBoth)\r
   {\r
-    strncpyW(szTemp, lpszDir, MAX_PATH);\r
+    lstrcpynW(szTemp, lpszDir, MAX_PATH);\r
     if (bStrip)\r
     {\r
       PathStripToRootW(szTemp);\r
@@ -1687,7 +1687,8 @@ BOOL WINAPI PathFileExistsA(LPCSTR lpszPath)
   if (!lpszPath)\r
     return FALSE;\r
 \r
-  iPrevErrMode = SetErrorMode(1);\r
+  /* Prevent a dialog box if path is on a disk that has been ejected. */\r
+  iPrevErrMode = SetErrorMode(SEM_FAILCRITICALERRORS);\r
   dwAttr = GetFileAttributesA(lpszPath);\r
   SetErrorMode(iPrevErrMode);\r
   return dwAttr == INVALID_FILE_ATTRIBUTES ? FALSE : TRUE;\r
@@ -1708,7 +1709,7 @@ BOOL WINAPI PathFileExistsW(LPCWSTR lpszPath)
   if (!lpszPath)\r
     return FALSE;\r
 \r
-  iPrevErrMode = SetErrorMode(1);\r
+  iPrevErrMode = SetErrorMode(SEM_FAILCRITICALERRORS);\r
   dwAttr = GetFileAttributesW(lpszPath);\r
   SetErrorMode(iPrevErrMode);\r
   return dwAttr == INVALID_FILE_ATTRIBUTES ? FALSE : TRUE;\r
@@ -2580,20 +2581,23 @@ BOOL WINAPI PathMakePrettyA(LPSTR lpszPath)
 \r
   TRACE("(%s)\n", debugstr_a(lpszPath));\r
 \r
-  if (!pszIter || !*pszIter)\r
+  if (!pszIter)\r
     return FALSE;\r
 \r
-  while (*pszIter)\r
-  {\r
-    if (islower(*pszIter) || IsDBCSLeadByte(*pszIter))\r
-      return FALSE; /* Not DOS path */\r
-    pszIter++;\r
-  }\r
-  pszIter = lpszPath + 1;\r
-  while (*pszIter)\r
+  if (*pszIter)\r
   {\r
-    *pszIter = tolower(*pszIter);\r
-    pszIter++;\r
+    do\r
+    {\r
+      if (islower(*pszIter) || IsDBCSLeadByte(*pszIter))\r
+        return FALSE; /* Not DOS path */\r
+      pszIter++;\r
+    } while (*pszIter);\r
+    pszIter = lpszPath + 1;\r
+    while (*pszIter)\r
+    {\r
+      *pszIter = tolower(*pszIter);\r
+      pszIter++;\r
+    }\r
   }\r
   return TRUE;\r
 }\r
@@ -2609,20 +2613,23 @@ BOOL WINAPI PathMakePrettyW(LPWSTR lpszPath)
 \r
   TRACE("(%s)\n", debugstr_w(lpszPath));\r
 \r
-  if (!pszIter || !*pszIter)\r
+  if (!pszIter)\r
     return FALSE;\r
 \r
-  while (*pszIter)\r
+  if (*pszIter)\r
   {\r
-    if (islowerW(*pszIter))\r
-      return FALSE; /* Not DOS path */\r
-    pszIter++;\r
-  }\r
-  pszIter = lpszPath + 1;\r
-  while (*pszIter)\r
-  {\r
-    *pszIter = tolowerW(*pszIter);\r
-    pszIter++;\r
+    do\r
+    {\r
+      if (islowerW(*pszIter))\r
+        return FALSE; /* Not DOS path */\r
+      pszIter++;\r
+    } while (*pszIter);\r
+    pszIter = lpszPath + 1;\r
+    while (*pszIter)\r
+    {\r
+      *pszIter = tolowerW(*pszIter);\r
+      pszIter++;\r
+    }\r
   }\r
   return TRUE;\r
 }\r
@@ -2767,7 +2774,7 @@ int WINAPI PathCommonPrefixW(LPCWSTR lpszFile1, LPCWSTR lpszFile2, LPWSTR achPat
  *  dx       [I]   Desired width\r
  *\r
  * RETURNS\r
- *  TRUE  If the path was modified.\r
+ *  TRUE  If the path was modified/went well.\r
  *  FALSE Otherwise.\r
  */\r
 BOOL WINAPI PathCompactPathA(HDC hDC, LPSTR lpszPath, UINT dx)\r
@@ -2803,7 +2810,7 @@ BOOL WINAPI PathCompactPathW(HDC hDC, LPWSTR lpszPath, UINT dx)
   TRACE("(%p,%s,%d)\n", hDC, debugstr_w(lpszPath), dx);\r
 \r
   if (!lpszPath)\r
-    return bRet;\r
+    return FALSE;\r
 \r
   if (!hDC)\r
     hdc = hDC = GetDC(0);\r
@@ -2838,7 +2845,7 @@ BOOL WINAPI PathCompactPathW(HDC hDC, LPWSTR lpszPath, UINT dx)
        * the file name as possible, allowing for the ellipses, e.g:\r
        * c:\some very long path\filename ==> c:\some v...\filename\r
        */\r
-      strncpyW(buff, sFile, MAX_PATH);\r
+      lstrcpynW(buff, sFile, MAX_PATH);\r
 \r
       do\r
       {\r
@@ -2880,7 +2887,7 @@ BOOL WINAPI PathCompactPathW(HDC hDC, LPWSTR lpszPath, UINT dx)
 \r
     if (dwLen > MAX_PATH - 3)\r
       dwLen =  MAX_PATH - 3;\r
-    strncpyW(buff, sFile, dwLen);\r
+    lstrcpynW(buff, sFile, dwLen);\r
 \r
     do {\r
       dwLen--;\r
@@ -3390,8 +3397,8 @@ BOOL WINAPI PathRelativePathToW(LPWSTR lpszPath, LPCWSTR lpszFrom, DWORD dwAttrF
     return FALSE;\r
 \r
   *lpszPath = '\0';\r
-  strncpyW(szFrom, lpszFrom, MAX_PATH);\r
-  strncpyW(szTo, lpszTo, MAX_PATH);\r
+  lstrcpynW(szFrom, lpszFrom, MAX_PATH);\r
+  lstrcpynW(szTo, lpszTo, MAX_PATH);\r
 \r
   if(!(dwAttrFrom & FILE_ATTRIBUTE_DIRECTORY))\r
     PathRemoveFileSpecW(szFrom);\r
@@ -3739,7 +3746,7 @@ BOOL WINAPI PathIsDirectoryEmptyW(LPCWSTR lpszPath)
   if (!lpszPath || !PathIsDirectoryW(lpszPath))\r
       return FALSE;\r
 \r
-  strncpyW(szSearch, lpszPath, MAX_PATH);\r
+  lstrcpynW(szSearch, lpszPath, MAX_PATH);\r
   PathAddBackslashW(szSearch);\r
   dwLen = strlenW(szSearch);\r
   if (dwLen > MAX_PATH - 4)\r
index 15a1f17..f4ce437 100644 (file)
@@ -133,7 +133,7 @@ LONG WINAPI SHRegOpenUSKeyW(LPCWSTR Path, REGSAM AccessType, HUSKEY hRelativeUSK
         *phNewUSKey = NULL;\r
 \r
     /* Create internal HUSKEY */\r
-    hKey = (LPSHUSKEY)HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(*hKey));\r
+    hKey = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(*hKey));\r
     lstrcpynW(hKey->lpszPath, Path, sizeof(hKey->lpszPath));\r
 \r
     if (hRelativeUSKey)\r
@@ -1305,7 +1305,7 @@ LONG WINAPI SHQueryInfoKeyW(HKEY hKey, LPDWORD pwSubKeys, LPDWORD pwSubKeyMax,
  *\r
  *       subcase-2: buffer is to small to hold the expanded string:\r
  *          the function return success (!!) and the result is truncated\r
- *         *** This is clearly a error in the native implementation. ***\r
+ *         *** This is clearly an error in the native implementation. ***\r
  *\r
  *     case-2: the unexpanded string is bigger than the expanded one\r
  *       The buffer must have enough space to hold the unexpanded\r
@@ -1340,7 +1340,7 @@ DWORD WINAPI SHQueryValueExA( HKEY hKey, LPCSTR lpszValue,
       char cNull = '\0';\r
       nBytesToAlloc = (!pvData || (dwRet == ERROR_MORE_DATA)) ? dwUnExpDataLen : *pcbData;\r
 \r
-      szData = (LPSTR) LocalAlloc(GMEM_ZEROINIT, nBytesToAlloc);\r
+      szData = (LPSTR) LocalAlloc(LMEM_ZEROINIT, nBytesToAlloc);\r
       RegQueryValueExA (hKey, lpszValue, lpReserved, NULL, (LPBYTE)szData, &nBytesToAlloc);\r
       dwExpDataLen = ExpandEnvironmentStringsA(szData, &cNull, 1);\r
       dwUnExpDataLen = max(nBytesToAlloc, dwExpDataLen);\r
@@ -1349,7 +1349,7 @@ DWORD WINAPI SHQueryValueExA( HKEY hKey, LPCSTR lpszValue,
     else\r
     {\r
       nBytesToAlloc = (lstrlenA(pvData)+1) * sizeof (CHAR);\r
-      szData = (LPSTR) LocalAlloc(GMEM_ZEROINIT, nBytesToAlloc );\r
+      szData = (LPSTR) LocalAlloc(LMEM_ZEROINIT, nBytesToAlloc );\r
       lstrcpyA(szData, pvData);\r
       dwExpDataLen = ExpandEnvironmentStringsA(szData, pvData, *pcbData / sizeof(CHAR));\r
       if (dwExpDataLen > *pcbData) dwRet = ERROR_MORE_DATA;\r
@@ -1401,7 +1401,7 @@ DWORD WINAPI SHQueryValueExW(HKEY hKey, LPCWSTR lpszValue,
       WCHAR cNull = '\0';\r
       nBytesToAlloc = (!pvData || (dwRet == ERROR_MORE_DATA)) ? dwUnExpDataLen : *pcbData;\r
 \r
-      szData = (LPWSTR) LocalAlloc(GMEM_ZEROINIT, nBytesToAlloc);\r
+      szData = (LPWSTR) LocalAlloc(LMEM_ZEROINIT, nBytesToAlloc);\r
       RegQueryValueExW (hKey, lpszValue, lpReserved, NULL, (LPBYTE)szData, &nBytesToAlloc);\r
       dwExpDataLen = ExpandEnvironmentStringsW(szData, &cNull, 1);\r
       dwUnExpDataLen = max(nBytesToAlloc, dwExpDataLen);\r
@@ -1410,7 +1410,7 @@ DWORD WINAPI SHQueryValueExW(HKEY hKey, LPCWSTR lpszValue,
     else\r
     {\r
       nBytesToAlloc = (lstrlenW(pvData) + 1) * sizeof(WCHAR);\r
-      szData = (LPWSTR) LocalAlloc(GMEM_ZEROINIT, nBytesToAlloc );\r
+      szData = (LPWSTR) LocalAlloc(LMEM_ZEROINIT, nBytesToAlloc );\r
       lstrcpyW(szData, pvData);\r
       dwExpDataLen = ExpandEnvironmentStringsW(szData, pvData, *pcbData/sizeof(WCHAR) );\r
       if (dwExpDataLen > *pcbData) dwRet = ERROR_MORE_DATA;\r
@@ -2183,7 +2183,7 @@ HKEY WINAPI SHRegDuplicateHKey(HKEY hKey)
  *\r
  * PARAMS\r
  *  hKeySrc    [I] Source key to copy from\r
- *  lpszSubKey [I] Sub key under hKeyDst, or NULL to use hKeyDst directly\r
+ *  lpszSrcSubKey [I] Sub key under hKeySrc, or NULL to use hKeySrc directly\r
  *  hKeyDst    [I] Destination key\r
  *  dwReserved [I] Reserved, must be 0\r
  *\r
@@ -2196,16 +2196,16 @@ HKEY WINAPI SHRegDuplicateHKey(HKEY hKey)
  *  (It will loop until out of stack, or the registry is full). This\r
  *  bug is present in Win32 also.\r
  */\r
-DWORD WINAPI SHCopyKeyA(HKEY hKeySrc, LPCSTR lpszSubKey, HKEY hKeyDst, DWORD dwReserved)\r
+DWORD WINAPI SHCopyKeyA(HKEY hKeySrc, LPCSTR lpszSrcSubKey, HKEY hKeyDst, DWORD dwReserved)\r
 {\r
   WCHAR szSubKeyW[MAX_PATH];\r
 \r
-  TRACE("(hkey=%p,%s,%p08x,%ld)\n", hKeySrc, debugstr_a(lpszSubKey), hKeyDst, dwReserved);\r
+  TRACE("(hkey=%p,%s,%p08x,%ld)\n", hKeySrc, debugstr_a(lpszSrcSubKey), hKeyDst, dwReserved);\r
 \r
-  if (lpszSubKey)\r
-    MultiByteToWideChar(0, 0, lpszSubKey, -1, szSubKeyW, MAX_PATH);\r
+  if (lpszSrcSubKey)\r
+    MultiByteToWideChar(0, 0, lpszSrcSubKey, -1, szSubKeyW, MAX_PATH);\r
 \r
-  return SHCopyKeyW(hKeySrc, lpszSubKey ? szSubKeyW : NULL, hKeyDst, dwReserved);\r
+  return SHCopyKeyW(hKeySrc, lpszSrcSubKey ? szSubKeyW : NULL, hKeyDst, dwReserved);\r
 }\r
 \r
 /*************************************************************************\r
@@ -2213,7 +2213,7 @@ DWORD WINAPI SHCopyKeyA(HKEY hKeySrc, LPCSTR lpszSubKey, HKEY hKeyDst, DWORD dwR
  *\r
  * See SHCopyKeyA.\r
  */\r
-DWORD WINAPI SHCopyKeyW(HKEY hKeySrc, LPCWSTR lpszSubKey, HKEY hKeyDst, DWORD dwReserved)\r
+DWORD WINAPI SHCopyKeyW(HKEY hKeySrc, LPCWSTR lpszSrcSubKey, HKEY hKeyDst, DWORD dwReserved)\r
 {\r
   DWORD dwKeyCount = 0, dwValueCount = 0, dwMaxKeyLen = 0;\r
   DWORD  dwMaxValueLen = 0, dwMaxDataLen = 0, i;\r
@@ -2222,18 +2222,18 @@ DWORD WINAPI SHCopyKeyW(HKEY hKeySrc, LPCWSTR lpszSubKey, HKEY hKeyDst, DWORD dw
   WCHAR szName[MAX_PATH], *lpszName = szName;\r
   DWORD dwRet = S_OK;\r
 \r
-  TRACE("hkey=%p,%s,%p08x,%ld)\n", hKeySrc, debugstr_w(lpszSubKey), hKeyDst, dwReserved);\r
+  TRACE("hkey=%p,%s,%p08x,%ld)\n", hKeySrc, debugstr_w(lpszSrcSubKey), hKeyDst, dwReserved);\r
 \r
   if(!hKeyDst || !hKeySrc)\r
     dwRet = ERROR_INVALID_PARAMETER;\r
   else\r
   {\r
-    /* Open destination key */\r
-    if(lpszSubKey)\r
-      dwRet = RegOpenKeyExW(hKeyDst, lpszSubKey, 0, KEY_ALL_ACCESS, &hKeyDst);\r
+    /* Open source key */\r
+    if(lpszSrcSubKey)\r
+      dwRet = RegOpenKeyExW(hKeySrc, lpszSrcSubKey, 0, KEY_ALL_ACCESS, &hKeySrc);\r
 \r
     if(dwRet)\r
-      hKeyDst = 0; /* Don't close this key since we didn't open it */\r
+      hKeyDst = NULL; /* Don't close this key since we didn't open it */\r
     else\r
     {\r
       /* Get details about sub keys and values */\r
@@ -2303,7 +2303,7 @@ DWORD WINAPI SHCopyKeyW(HKEY hKeySrc, LPCWSTR lpszSubKey, HKEY hKeyDst, DWORD dw
   if (lpBuff != buff)\r
     HeapFree(GetProcessHeap(), 0, lpBuff);\r
 \r
-  if (lpszSubKey && hKeyDst)\r
+  if (lpszSrcSubKey && hKeyDst)\r
     RegCloseKey(hKeyDst);\r
   return dwRet;\r
 }\r
index 172e1bb..894176c 100644 (file)
@@ -343,7 +343,7 @@ static IStream *IStream_Create(HKEY hKey, LPBYTE pbBuffer, DWORD dwLength)
 {\r
  ISHRegStream* regStream;\r
 \r
- regStream = (ISHRegStream*)HeapAlloc(GetProcessHeap(), 0, sizeof(ISHRegStream));\r
+ regStream = HeapAlloc(GetProcessHeap(), 0, sizeof(ISHRegStream));\r
 \r
  if (regStream)\r
  {\r
@@ -493,7 +493,7 @@ IStream * WINAPI SHCreateMemStream(LPBYTE lpbData, DWORD dwDataLen)
 \r
   if (lpbData)\r
   {\r
-    LPBYTE lpbDup = (LPBYTE)HeapAlloc(GetProcessHeap(), 0, dwDataLen);\r
+    LPBYTE lpbDup = HeapAlloc(GetProcessHeap(), 0, dwDataLen);\r
 \r
     if (lpbDup)\r
     {\r
index f234b7e..2291f71 100644 (file)
 185 stdcall -noname SHMessageBoxCheckA(ptr str str long long str)
 186 stdcall -noname SHSimulateDrop(ptr ptr long ptr ptr)
 187 stdcall -noname SHLoadFromPropertyBag(ptr ptr)
-188 stub -noname IUnknown_TranslateAcceleratorOCS
+188 stdcall -noname IUnknown_TranslateAcceleratorOCS(ptr ptr long)
 189 stdcall -noname IUnknown_OnFocusOCS(ptr ptr)
-190 stub -noname IUnknown_HandleIRestrict
+190 stdcall -noname IUnknown_HandleIRestrict(ptr ptr ptr ptr ptr)
 191 stdcall -noname SHMessageBoxCheckW(ptr wstr wstr long long wstr)
 192 stdcall -noname SHGetMenuFromID(ptr long)
 193 stdcall -noname SHGetCurColorRes()
 194 stdcall -noname SHWaitForSendMessageThread(ptr long)
-195 stub -noname SHIsExpandableFolder
-196 stub -noname DnsRecordSetCompare
+195 stdcall -noname SHIsExpandableFolder(ptr ptr)
+196 stub -noname DnsRecordSetCompare #stdcall @(ptr ptr ptr ptr) dnsapi.DnsRecordSetCompare
 197 stdcall -noname SHFillRectClr(long ptr long)
 198 stdcall -noname SHSearchMapInt(ptr ptr long long)
 199 stdcall -noname IUnknown_Set(ptr ptr)
-200 stub -noname MayQSForward
+200 stdcall -noname MayQSForward(ptr ptr ptr long ptr ptr)
 201 stdcall -noname MayExecForward(ptr long ptr long long ptr ptr)
 202 stdcall -noname IsQSForward(ptr long ptr)
 203 stdcall -noname SHStripMneumonicA(str)
 253 stub -noname StopWatchExA
 254 stub -noname StopWatchExW
 255 stub -noname EventTraceHandler
-256 stub -noname IUnknown_GetSite
+256 stdcall -noname IUnknown_GetSite(ptr ptr ptr)
 257 stdcall -noname SHCreateWorkerWindowA(long ptr long long ptr long)
 258 stub -noname SHRegisterWaitForSingleObject
 259 stub -noname SHUnregisterWait
 475 stub -noname GetShellSecurityDescriptor
 476 stub -noname SHGetObjectCompatFlags
 477 stub -noname SHCreatePropertyBagOnMemory
-478 stub -noname IUnknown_TranslateAcceleratorIO
+478 stdcall -noname IUnknown_TranslateAcceleratorIO(ptr ptr)
 479 stub -noname IUnknown_UIActivateIO
 480 stub -noname UrlCrackW
-481 stub -noname IUnknown_HasFocusIO
+481 stdcall -noname IUnknown_HasFocusIO(ptr)
 482 stub -noname SHMessageBoxHelpA
 483 stub -noname SHMessageBoxHelpW
 484 stub -noname IUnknown_QueryServiceExec
 
 548 stub -noname SHAreIconsEqual
 549 stdcall -noname SHCoCreateInstanceAC(ptr ptr long ptr ptr)
-550 stub -noname GetTemplateInfoFroHandle
+550 stub -noname GetTemplateInfoFromHandle
 551 stub -noname IShellFolder_CompareIDs
 
 @ stdcall AssocCreate(long long long long ptr ptr)
index 78f5c1d..39ad641 100644 (file)
@@ -1577,7 +1577,7 @@ LPSTR WINAPI StrFormatKBSizeA(LONGLONG llBytes, LPSTR lpszDest, UINT cchMax)
     ulKB = (ulKB - ulNextDigit) / 10;\r
   } while (ulKB > 0);\r
 \r
-  strncpy(lpszDest, szOut + 1, cchMax);\r
+  lstrcpynA(lpszDest, szOut + 1, cchMax);\r
   return lpszDest;\r
 }\r
 \r
@@ -1605,7 +1605,7 @@ LPWSTR WINAPI StrFormatKBSizeW(LONGLONG llBytes, LPWSTR lpszDest, UINT cchMax)
     ulKB = (ulKB - ulNextDigit) / 10;\r
   } while (ulKB > 0);\r
 \r
-  strncpyW(lpszDest, szOut + 1, cchMax);\r
+  lstrcpynW(lpszDest, szOut + 1, cchMax);\r
   return lpszDest;\r
 }\r
 \r
@@ -2027,7 +2027,7 @@ INT WINAPI StrFromTimeIntervalW(LPWSTR lpszStr, UINT cchMax, DWORD dwMS,
     if (iDigits) /* Always write seconds if we have significant digits */\r
       SHLWAPI_WriteTimeClass(szCopy, dwMS, szSec, iDigits);\r
 \r
-    strncpyW(lpszStr, szCopy, cchMax);\r
+    lstrcpynW(lpszStr, szCopy, cchMax);\r
     iRet = strlenW(lpszStr);\r
   }\r
   return iRet;\r
@@ -2301,7 +2301,7 @@ LPWSTR WINAPI StrFormatByteSizeW(LONGLONG llBytes, LPWSTR lpszDest, UINT cchMax)
   sprintfW(wszBuff, bfFormats[i].lpwszFormat, dBytes);\r
   wszAdd[1] = bfFormats[i].wPrefix;\r
   strcatW(wszBuff, wszAdd);\r
-  strncpyW(lpszDest, wszBuff, cchMax);\r
+  lstrcpynW(lpszDest, wszBuff, cchMax);\r
   return lpszDest;\r
 }\r
 \r
@@ -2546,7 +2546,7 @@ INT WINAPI SHUnicodeToAnsiCP(UINT CodePage, LPCWSTR lpSrcStr, LPSTR lpDstStr,
 \r
       if (nWideCharCount < len - 1)\r
       {\r
-        mem = (LPSTR)HeapAlloc(GetProcessHeap(), 0, *lpiLen);\r
+        mem = HeapAlloc(GetProcessHeap(), 0, *lpiLen);\r
         if (!mem)\r
           return 0;\r
 \r
@@ -2577,7 +2577,7 @@ INT WINAPI SHUnicodeToAnsiCP(UINT CodePage, LPCWSTR lpSrcStr, LPSTR lpDstStr,
     reqLen = WideCharToMultiByte(CodePage, 0, lpSrcStr, len, NULL, 0, NULL, NULL);\r
     if (reqLen)\r
     {\r
-      mem = (LPSTR)HeapAlloc(GetProcessHeap(), 0, reqLen);\r
+      mem = HeapAlloc(GetProcessHeap(), 0, reqLen);\r
       if (mem)\r
       {\r
         reqLen = WideCharToMultiByte(CodePage, 0, lpSrcStr, len, mem,\r
@@ -2638,9 +2638,6 @@ DWORD WINAPI SHAnsiToAnsi(LPCSTR lpszSrc, LPSTR lpszDst, int iLen)
 \r
     TRACE("(%s,%p,0x%08x)\n", debugstr_a(lpszSrc), lpszDst, iLen);\r
 \r
-    /* Our original version used lstrncpy/lstrlen, incorrectly filling up all\r
-     * of lpszDst with extra NULs. This version is correct, and faster too.\r
-     */\r
     lpszRet = StrCpyNXA(lpszDst, lpszSrc, iLen);\r
     return lpszRet - lpszDst + 1;\r
 }\r
index db67c34..eedb50b 100644 (file)
@@ -238,7 +238,7 @@ HRESULT WINAPI ParseURLW(LPCWSTR x, PARSEDURLW *y)
 \r
     /* see if known scheme and return indicator number */\r
     len = WideCharToMultiByte(0, 0, y->pszProtocol, y->cchProtocol, 0, 0, 0, 0);\r
-    cmpstr = (LPSTR)HeapAlloc(GetProcessHeap(), 0, len);\r
+    cmpstr = HeapAlloc(GetProcessHeap(), 0, len);\r
     WideCharToMultiByte(0, 0, y->pszProtocol, y->cchProtocol, cmpstr, len, 0, 0);\r
     y->nScheme = URL_SCHEME_UNKNOWN;\r
     inet_pro = shlwapi_schemes;\r
@@ -329,7 +329,7 @@ HRESULT WINAPI UrlCanonicalizeW(LPCWSTR pszUrl, LPWSTR pszCanonicalized,
     DWORD EscapeFlags;\r
     LPWSTR lpszUrlCpy, wk1, wk2, mp, root;\r
     INT nByteLen, state;\r
-    DWORD nLen;\r
+    DWORD nLen, nWkLen;\r
 \r
     TRACE("(%s %p %p 0x%08lx)\n", debugstr_w(pszUrl), pszCanonicalized,\r
          pcchCanonicalized, dwFlags);\r
@@ -379,9 +379,10 @@ HRESULT WINAPI UrlCanonicalizeW(LPCWSTR pszUrl, LPWSTR pszCanonicalized,
                state = 4;\r
                break;\r
            case 3:\r
-               strcpyW(wk2, wk1);\r
-               wk1 += strlenW(wk1);\r
-               wk2 += strlenW(wk2);\r
+               nWkLen = strlenW(wk1);\r
+               memcpy(wk2, wk1, (nWkLen + 1) * sizeof(WCHAR));\r
+               wk1 += nWkLen;\r
+               wk2 += nWkLen;\r
                break;\r
            case 4:\r
                if (!isalnumW(*wk1) && (*wk1 != L'-') && (*wk1 != L'.')) {state = 3; break;}\r
@@ -401,13 +402,14 @@ HRESULT WINAPI UrlCanonicalizeW(LPCWSTR pszUrl, LPWSTR pszCanonicalized,
                    TRACE("wk1=%c\n", (CHAR)*wk1);\r
                    mp = strchrW(wk1, L'/');\r
                    if (!mp) {\r
-                       strcpyW(wk2, wk1);\r
-                       wk1 += strlenW(wk1);\r
-                       wk2 += strlenW(wk2);\r
+                       nWkLen = strlenW(wk1);\r
+                       memcpy(wk2, wk1, (nWkLen + 1) * sizeof(WCHAR));\r
+                       wk1 += nWkLen;\r
+                       wk2 += nWkLen;\r
                        continue;\r
                    }\r
                    nLen = mp - wk1 + 1;\r
-                   strncpyW(wk2, wk1, nLen);\r
+                   memcpy(wk2, wk1, nLen * sizeof(WCHAR));\r
                    wk2 += nLen;\r
                    wk1 += nLen;\r
                    if (*wk1 == L'.') {\r
@@ -517,7 +519,7 @@ HRESULT WINAPI UrlCombineA(LPCSTR pszBase, LPCSTR pszRelative,
     if(!pszBase || !pszRelative || !pcchCombined)\r
        return E_INVALIDARG;\r
 \r
-    base = (LPWSTR) HeapAlloc(GetProcessHeap(), 0,\r
+    base = HeapAlloc(GetProcessHeap(), 0,\r
                              (3*INTERNET_MAX_URL_LENGTH) * sizeof(WCHAR));\r
     relative = base + INTERNET_MAX_URL_LENGTH;\r
     combined = relative + INTERNET_MAX_URL_LENGTH;\r
@@ -718,7 +720,7 @@ HRESULT WINAPI UrlCombineW(LPCWSTR pszBase, LPCWSTR pszRelative,
              * Return the pszBase scheme with pszRelative. Basically\r
              * keeps the scheme and replaces the domain and following.\r
              */\r
-       strncpyW(preliminary, base.pszProtocol, base.cchProtocol + 1);\r
+        memcpy(preliminary, base.pszProtocol, (base.cchProtocol + 1)*sizeof(WCHAR));\r
        work = preliminary + base.cchProtocol + 1;\r
        strcpyW(work, relative.pszSuffix);\r
        if (!(dwFlags & URL_PLUGGABLE_PROTOCOL) &&\r
@@ -731,7 +733,7 @@ HRESULT WINAPI UrlCombineW(LPCWSTR pszBase, LPCWSTR pszRelative,
              * after the location is pszRelative. (Replace document\r
              * from root on.)\r
              */\r
-       strncpyW(preliminary, base.pszProtocol, base.cchProtocol+1+sizeloc);\r
+        memcpy(preliminary, base.pszProtocol, (base.cchProtocol+1+sizeloc)*sizeof(WCHAR));\r
        work = preliminary + base.cchProtocol + 1 + sizeloc;\r
        if (dwFlags & URL_PLUGGABLE_PROTOCOL)\r
            *(work++) = L'/';\r
@@ -742,7 +744,8 @@ HRESULT WINAPI UrlCombineW(LPCWSTR pszBase, LPCWSTR pszRelative,
              * Return the pszBase without its document (if any) and\r
              * append pszRelative after its scheme.\r
              */\r
-       strncpyW(preliminary, base.pszProtocol, base.cchProtocol+1+base.cchSuffix);\r
+        memcpy(preliminary, base.pszProtocol,\r
+               (base.cchProtocol+1+base.cchSuffix)*sizeof(WCHAR));\r
        work = preliminary + base.cchProtocol+1+base.cchSuffix - 1;\r
        if (*work++ != L'/')\r
            *(work++) = L'/';\r
@@ -1640,13 +1643,19 @@ BOOL WINAPI UrlIsA(LPCSTR pszUrl, URLIS Urlis)
        base.cbSize = sizeof(base);\r
        res1 = ParseURLA(pszUrl, &base);\r
        if (res1) return FALSE;  /* invalid scheme */\r
-       if ((*base.pszSuffix == '/') && (*(base.pszSuffix+1) == '/'))\r
-           /* has scheme followed by 2 '/' */\r
-           return FALSE;\r
-       return TRUE;\r
+       switch (base.nScheme)\r
+       {\r
+       case URL_SCHEME_MAILTO:\r
+       case URL_SCHEME_SHELL:\r
+       case URL_SCHEME_JAVASCRIPT:\r
+       case URL_SCHEME_VBSCRIPT:\r
+       case URL_SCHEME_ABOUT:\r
+           return TRUE;\r
+       }\r
+       return FALSE;\r
 \r
     case URLIS_FILEURL:\r
-        return !StrCmpNA("file://", pszUrl, 7);\r
+        return !StrCmpNA("file:", pszUrl, 5);\r
 \r
     case URLIS_DIRECTORY:\r
         last = pszUrl + strlen(pszUrl) - 1;\r
@@ -1671,7 +1680,7 @@ BOOL WINAPI UrlIsA(LPCSTR pszUrl, URLIS Urlis)
  */\r
 BOOL WINAPI UrlIsW(LPCWSTR pszUrl, URLIS Urlis)\r
 {\r
-    static const WCHAR stemp[] = { 'f','i','l','e',':','/','/',0 };\r
+    static const WCHAR stemp[] = { 'f','i','l','e',':',0 };\r
     PARSEDURLW base;\r
     DWORD res1;\r
     LPCWSTR last;\r
@@ -1684,13 +1693,19 @@ BOOL WINAPI UrlIsW(LPCWSTR pszUrl, URLIS Urlis)
        base.cbSize = sizeof(base);\r
        res1 = ParseURLW(pszUrl, &base);\r
        if (res1) return FALSE;  /* invalid scheme */\r
-       if ((*base.pszSuffix == '/') && (*(base.pszSuffix+1) == '/'))\r
-           /* has scheme followed by 2 '/' */\r
-           return FALSE;\r
-       return TRUE;\r
+       switch (base.nScheme)\r
+       {\r
+       case URL_SCHEME_MAILTO:\r
+       case URL_SCHEME_SHELL:\r
+       case URL_SCHEME_JAVASCRIPT:\r
+       case URL_SCHEME_VBSCRIPT:\r
+       case URL_SCHEME_ABOUT:\r
+           return TRUE;\r
+       }\r
+       return FALSE;\r
 \r
     case URLIS_FILEURL:\r
-        return !strncmpW(stemp, pszUrl, 7);\r
+        return !strncmpW(stemp, pszUrl, 5);\r
 \r
     case URLIS_DIRECTORY:\r
         last = pszUrl + strlenW(pszUrl) - 1;\r
@@ -1937,7 +1952,9 @@ static LONG URL_ParseUrl(LPCWSTR pszUrl, WINE_PARSE_URL *pl)
  * PARAMS\r
  *  pszIn   [I]   Url to parse\r
  *  pszOut  [O]   Destination for part of pszIn requested\r
- *  pcchOut [I/O] Length of pszOut/destination for length of pszOut\r
+ *  pcchOut [I]   Size of pszOut\r
+ *          [O]   length of pszOut string EXLUDING '\0' if S_OK, otherwise\r
+ *                needed size of pszOut INCLUDING '\0'.\r
  *  dwPart  [I]   URL_PART_ enum from "shlwapi.h"\r
  *  dwFlags [I]   URL_ flags from "shlwapi.h"\r
  *\r
@@ -1989,7 +2006,6 @@ HRESULT WINAPI UrlGetPartW(LPCWSTR pszIn, LPWSTR pszOut, LPDWORD pcchOut,
     HRESULT ret;\r
     DWORD size, schsize;\r
     LPCWSTR addr, schaddr;\r
-    LPWSTR work;\r
 \r
     TRACE("(%s %p %p(%ld) %08lx %08lx)\n",\r
          debugstr_w(pszIn), pszOut, pcchOut, *pcchOut, dwPart, dwFlags);\r
@@ -2041,24 +2057,21 @@ HRESULT WINAPI UrlGetPartW(LPCWSTR pszIn, LPWSTR pszOut, LPDWORD pcchOut,
        }\r
 \r
        if (dwFlags == URL_PARTFLAG_KEEPSCHEME) {\r
-           if (*pcchOut < size + schsize + 2) {\r
-               *pcchOut = size + schsize + 2;\r
+            if (*pcchOut < schsize + size + 2) {\r
+                *pcchOut = schsize + size + 2;\r
                return E_POINTER;\r
            }\r
-           strncpyW(pszOut, schaddr, schsize);\r
-           work = pszOut + schsize;\r
-           *work = L':';\r
-           strncpyW(work+1, addr, size);\r
-           *pcchOut = size + schsize + 1;\r
-           work += (size + 1);\r
-           *work = L'\0';\r
+            memcpy(pszOut, schaddr, schsize*sizeof(WCHAR));\r
+            pszOut[schsize] = ':';\r
+            memcpy(pszOut+schsize+1, addr, size*sizeof(WCHAR));\r
+            pszOut[schsize+1+size] = 0;\r
+            *pcchOut = schsize + 1 + size;\r
        }\r
        else {\r
            if (*pcchOut < size + 1) {*pcchOut = size+1; return E_POINTER;}\r
-           strncpyW(pszOut, addr, size);\r
+            memcpy(pszOut, addr, size*sizeof(WCHAR));\r
+            pszOut[size] = 0;\r
            *pcchOut = size;\r
-           work = pszOut + size;\r
-           *work = L'\0';\r
        }\r
        TRACE("len=%ld %s\n", *pcchOut, debugstr_w(pszOut));\r
     }\r
index 5c2006b..43f0dce 100644 (file)
@@ -21,6 +21,7 @@ typedef interface IFont *LPFONT;
 typedef interface IFontDisp *LPFONTDISP;
 typedef interface IOleUndoManager *LPOLEUNDOMANAGER;
 typedef interface IQuickActivate *LPQUICKACTIVATE;
+typedef interface IObjectWithSite *LPOBJECTWITHSITE;
 
 #ifndef OLE2ANSI
 typedef TEXTMETRICW TEXTMETRICOLE;
@@ -731,6 +732,16 @@ DECLARE_INTERFACE_(IObjectWithSite,IUnknown)
 };
 #undef INTERFACE
 
+#ifdef COBJMACROS
+/*** IUnknown methods ***/
+#define IObjectWithSite_QueryInterface(p,a,b) (p)->lpVtbl->QueryInterface(p,a,b)
+#define IObjectWithSite_AddRef(p) (p)->lpVtbl->AddRef(p)
+#define IObjectWithSite_Release(p) (p)->lpVtbl->Release(p)
+/*** IObjectWithSite methods ***/
+#define IObjectWithSite_SetSite(p,a) (p)->lpVtbl->SetSite(p,a)
+#define IObjectWithSite_GetSite(p,a,b) (p)->lpVtbl->GetSite(p,a,b)
+#endif
+
 EXTERN_C const IID IID_IOleInPlaceSiteWindowless;
 #define INTERFACE IOleInPlaceSiteWindowless
 DECLARE_INTERFACE_(IOleInPlaceSiteWindowless,IOleInPlaceSiteEx)
index e2a3460..6b92015 100644 (file)
@@ -308,6 +308,22 @@ DECLARE_INTERFACE_(IOleInPlaceActiveObject,IOleWindow)
 };
 #undef INTERFACE
 
+#ifdef COBJMACROS
+/*** IUnknown methods ***/
+#define IOleInPlaceActiveObject_QueryInterface(p,a,b) (p)->lpVtbl->QueryInterface(p,a,b)
+#define IOleInPlaceActiveObject_AddRef(p) (p)->lpVtbl->AddRef(p)
+#define IOleInPlaceActiveObject_Release(p) (p)->lpVtbl->Release(p)
+/*** IOleWindow methods ***/
+#define IOleInPlaceActiveObject_GetWindow(p,a) (p)->lpVtbl->GetWindow(p,a)
+#define IOleInPlaceActiveObject_ContextSensitiveHelp(p,a) (p)->lpVtbl->ContextSensitiveHelp(p,a)
+/*** IOleInPlaceActiveObject methods ***/
+#define IOleInPlaceActiveObject_TranslateAccelerator(p,a) (p)->lpVtbl->TranslateAccelerator(p,a)
+#define IOleInPlaceActiveObject_OnFrameWindowActivate(p,a) (p)->lpVtbl->OnFrameWindowActivate(p,a)
+#define IOleInPlaceActiveObject_OnDocWindowActivate(p,a) (p)->lpVtbl->OnDocWindowActivate(p,a)
+#define IOleInPlaceActiveObject_ResizeBorder(p,a,b,c) (p)->lpVtbl->ResizeBorder(p,a,b,c)
+#define IOleInPlaceActiveObject_EnableModeless(p,a) (p)->lpVtbl->EnableModeless(p,a)
+#endif
+
 EXTERN_C const IID IID_IOleInPlaceFrame;
 #define INTERFACE IOleInPlaceFrame
 DECLARE_INTERFACE_(IOleInPlaceFrame,IOleInPlaceUIWindow)
index 56b706a..4b2830d 100644 (file)
@@ -95,6 +95,8 @@ extern const GUID IID_IFileSystemBindData;
 #define IID_IShellExecuteHook  IID_IShellExecuteHookA
 #define IID_INewShortcutHook   IID_INewShortcutHookA
 #endif
+extern const GUID IID_IInputObject;
+extern const GUID IID_IInputObjectSite;
 
 #ifdef __cplusplus
 }
index a05909d..6af4cb1 100644 (file)
@@ -930,6 +930,16 @@ DECLARE_INTERFACE_(IQueryInfo,IUnknown)
 };
 #undef INTERFACE
 
+#if !defined(__cplusplus) || defined(CINTERFACE)
+/*** IUnknown methods ***/
+#define IQueryInfo_QueryInterface(p,a,b)      (p)->lpVtbl->QueryInterface(p,a,b)
+#define IQueryInfo_AddRef(p)                  (p)->lpVtbl->AddRef(p)
+#define IQueryInfo_Release(p)                 (p)->lpVtbl->Release(p)
+/*** IQueryInfo methods ***/
+#define IQueryInfo_GetInfoTip(p,a,b)          (p)->lpVtbl->GetInfoTip(p,a,b)
+#define IQueryInfo_GetInfoFlags(p,a)          (p)->lpVtbl->GetInfoFlags(p,a)
+#endif
+
 #define INTERFACE IShellExtInit
 DECLARE_INTERFACE_(IShellExtInit, IUnknown)
 {
@@ -1622,6 +1632,52 @@ DECLARE_INTERFACE_(IDropTargetHelper, IUnknown)
 #undef INTERFACE
 #endif /* _WIN32_IE >= 0x0500 */
 
+#define INTERFACE IInputObject
+DECLARE_INTERFACE_(IInputObject,IUnknown)
+{
+    /*** IUnknown methods ***/
+    STDMETHOD(QueryInterface)(THIS_ REFIID riid, void** ppvObject) PURE;
+    STDMETHOD_(ULONG,AddRef)(THIS) PURE;
+    STDMETHOD_(ULONG,Release)(THIS) PURE;
+    /*** IInputObject methods ***/
+    STDMETHOD(UIActivateIO)(THIS_ BOOL bActivating, LPMSG lpMsg) PURE;
+    STDMETHOD(HasFocusIO)(THIS) PURE;
+    STDMETHOD(TranslateAcceleratorIO)(THIS_ LPMSG lpMsg) PURE;
+};
+#undef INTERFACE
+
+#if defined(COBJMACROS)
+/*** IUnknown methods ***/
+#define IInputObject_QueryInterface(p,a,b)       (p)->lpVtbl->QueryInterface(p,a,b)
+#define IInputObject_AddRef(p)                   (p)->lpVtbl->AddRef(p)
+#define IInputObject_Release(p)                  (p)->lpVtbl->Release(p)
+/*** IInputObject methods ***/
+#define IInputObject_UIActivateIO(p,a,b)         (p)->lpVtbl->UIActivateIO(p,a,b)
+#define IInputObject_HasFocusIO(p)               (p)->lpVtbl->HasFocusIO(p)
+#define IInputObject_TranslateAcceleratorIO(p,a) (p)->lpVtbl->TranslateAcceleratorIO(p,a)
+#endif
+
+#define INTERFACE IInputObjectSite
+DECLARE_INTERFACE_(IInputObjectSite,IUnknown)
+{
+    /*** IUnknown methods ***/
+    STDMETHOD_(HRESULT,QueryInterface) (THIS_ REFIID riid, void** ppvObject) PURE;
+    STDMETHOD_(ULONG,AddRef) (THIS) PURE;
+    STDMETHOD_(ULONG,Release) (THIS) PURE;
+    /*** IInputObjectSite methods ***/
+    STDMETHOD(OnFocusChangeIS)(THIS_ LPUNKNOWN lpUnknown, BOOL bFocus) PURE;
+};
+#undef INTERFACE
+
+#if defined(COBJMACROS)
+/*** IUnknown methods ***/
+#define IInputObjectSite_QueryInterface(p,a,b)  (p)->lpVtbl->QueryInterface(p,a,b)
+#define IInputObjectSite_AddRef(p)              (p)->lpVtbl->AddRef(p)
+#define IInputObjectSite_Release(p)             (p)->lpVtbl->Release(p)
+/*** IInputObject methods ***/
+#define IInputObjectSite_OnFocusChangeIS(p,a,b) (p)->lpVtbl->OnFocusChangeIS(p,a,b)
+#endif
+
 typedef HRESULT (CALLBACK *LPFNVIEWCALLBACK)(
        IShellView* dwUser,
        IShellFolder* pshf,