- Timestamp:
- Dec 28, 2002, 11:08:16 AM (23 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/shell32/shlfileop.c
r9424 r9552 20 20 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA 21 21 */ 22 23 #include "config.h" 24 #include "wine/port.h" 25 22 26 #include <string.h> 27 23 28 #include "winreg.h" 24 29 #include "shellapi.h" … … 32 37 WINE_DEFAULT_DEBUG_CHANNEL(shell); 33 38 34 #ifdef __WIN32OS2__35 39 BOOL SHELL_ConfirmDialog (int nKindOfDialog, LPCSTR szDir) 36 40 { … … 57 61 break; 58 62 default: 59 FIXME(__FUNCTION__" Unhandled nKindOfDialog %d stub\n", nKindOfDialog);63 FIXME(" Unhandled nKindOfDialog %d stub\n", nKindOfDialog); 60 64 return FALSE; 61 65 } … … 63 67 LoadStringA(shell32_hInstance, caption_resource_id, szCaption, sizeof(szCaption)); 64 68 LoadStringA(shell32_hInstance, text_resource_id, szText, sizeof(szText)); 65 #else 66 BOOL SHELL_WarnItemDelete (int nKindOfDialog, LPCSTR szDir) 67 { 68 char szCaption[255], szText[255], szBuffer[MAX_PATH + 256]; 69 70 if(nKindOfDialog == ASK_DELETE_FILE) 71 { 72 LoadStringA(shell32_hInstance, IDS_DELETEITEM_TEXT, szText, 73 sizeof(szText)); 74 LoadStringA(shell32_hInstance, IDS_DELETEITEM_CAPTION, 75 szCaption, sizeof(szCaption)); 76 } 77 else if(nKindOfDialog == ASK_DELETE_FOLDER) 78 { 79 LoadStringA(shell32_hInstance, IDS_DELETEITEM_TEXT, szText, 80 sizeof(szText)); 81 LoadStringA(shell32_hInstance, IDS_DELETEFOLDER_CAPTION, 82 szCaption, sizeof(szCaption)); 83 } 84 else if(nKindOfDialog == ASK_DELETE_MULTIPLE_ITEM) 85 { 86 LoadStringA(shell32_hInstance, IDS_DELETEMULTIPLE_TEXT, szText, 87 sizeof(szText)); 88 LoadStringA(shell32_hInstance, IDS_DELETEITEM_CAPTION, 89 szCaption, sizeof(szCaption)); 90 } 91 else { 92 FIXME("Called without a valid nKindOfDialog specified!\n"); 93 LoadStringA(shell32_hInstance, IDS_DELETEITEM_TEXT, szText, 94 sizeof(szText)); 95 LoadStringA(shell32_hInstance, IDS_DELETEITEM_CAPTION, 96 szCaption, sizeof(szCaption)); 97 } 98 #endif 69 99 70 FormatMessageA(FORMAT_MESSAGE_FROM_STRING|FORMAT_MESSAGE_ARGUMENT_ARRAY, 100 71 szText, 0, 0, szBuffer, sizeof(szBuffer), (va_list*)&szDir); … … 120 91 strcat(szTemp, "*.*"); 121 92 122 if (bShowUI && !SHELL_ WarnItemDelete(ASK_DELETE_FOLDER, pszDir))93 if (bShowUI && !SHELL_ConfirmDialog(ASK_DELETE_FOLDER, pszDir)) 123 94 return FALSE; 124 95 125 96 if(INVALID_HANDLE_VALUE != (hFind = FindFirstFileA(szTemp, &wfd))) 126 97 { … … 132 103 PathAddBackslashA(szTemp); 133 104 strcat(szTemp, wfd.cFileName); 134 105 135 106 if(FILE_ATTRIBUTE_DIRECTORY & wfd.dwFileAttributes) 136 107 SHELL_DeleteDirectoryA(szTemp, FALSE); … … 153 124 BOOL SHELL_DeleteFileA(LPCSTR pszFile, BOOL bShowUI) 154 125 { 155 if (bShowUI && !SHELL_ WarnItemDelete(ASK_DELETE_FILE, pszFile))126 if (bShowUI && !SHELL_ConfirmDialog(ASK_DELETE_FILE, pszFile)) 156 127 return FALSE; 157 128 158 129 return DeleteFileA(pszFile); 159 130 } … … 178 149 179 150 /************************************************************************ 180 * Win32DeleteFile [SHELL32.164] 151 * Win32DeleteFile [SHELL32.164] 181 152 * 182 153 * Deletes a file. Also triggers a change notify if one exists. … … 197 168 } 198 169 199 #ifdef __WIN32OS2__200 170 /************************************************************************* 201 171 * … … 224 194 if (i_len == 0) return TypisUnkn; 225 195 strcpy(pTemp,pFromTo); 196 if (pTemp[1] == ':' && pTemp[0] >= 'a' && pTemp[0] <= 'z') pTemp[0] = (pTemp[0] & (0xff - ' ')); 226 197 *pFile = i_pFile = &pTemp[i_len]; 227 198 pTemp[i_len+1] = '\0'; … … 269 240 if (-1 == i_PathAttr || !(i_PathAttr & FILE_ATTRIBUTE_DIRECTORY)) Typ = TypisBad; 270 241 } 271 strcpy( pTemp,pFromTo);242 strcpy(&pTemp[1],&pFromTo[1]); 272 243 if (Typ == TypisUnkn && i_PathAttr != -1 && (i_PathAttr & FILE_ATTRIBUTE_DIRECTORY)) { 273 244 if (NULL == strpbrk(i_pFile,"*?\0")) { … … 283 254 return Typ; 284 255 } 285 #else286 /**************************************************************************287 * SHELL_FileNamesMatch()288 *289 * Accepts two \0 delimited lists of the file names. Checks whether number of290 * files in the both lists is the same.291 */292 BOOL SHELL_FileNamesMatch(LPCSTR pszFiles1, LPCSTR pszFiles2)293 {294 while ((pszFiles1[strlen(pszFiles1) + 1] != '\0') &&295 (pszFiles2[strlen(pszFiles2) + 1] != '\0'))296 {297 pszFiles1 += strlen(pszFiles1) + 1;298 pszFiles2 += strlen(pszFiles2) + 1;299 }300 301 return302 ((pszFiles1[strlen(pszFiles1) + 1] == '\0') &&303 (pszFiles2[strlen(pszFiles2) + 1] == '\0')) ||304 ((pszFiles1[strlen(pszFiles1) + 1] != '\0') &&305 (pszFiles2[strlen(pszFiles2) + 1] != '\0'));306 }307 #endif308 256 309 257 /************************************************************************* 310 * SHFileOperationA [SHELL32. 243]258 * SHFileOperationA [SHELL32.@] 311 259 * 312 260 * NOTES 313 261 * exported by name 314 262 */ 315 DWORD WINAPI SHFileOperationA (LPSHFILEOPSTRUCTA lpFileOp) 263 DWORD WINAPI SHFileOperationA (LPSHFILEOPSTRUCTA lpFileOp) 316 264 { 317 265 LPSTR pFrom = (LPSTR)lpFileOp->pFrom; 318 266 LPSTR pTo = (LPSTR)lpFileOp->pTo; 319 267 LPSTR pTempTo; 320 #ifdef __WIN32OS2__321 268 DWORD FromAttr; 322 269 DWORD ToAttr; … … 359 306 nlpFileOp.wFunc = (level<<4) + FuncSwitch; 360 307 if (level == 1) 361 #endif 362 TRACE("flags (0x%04x) : %s%s%s%s%s%s%s%s%s%s%s%s \n", lpFileOp->fFlags, 308 TRACE("flags (0x%04x) : %s%s%s%s%s%s%s%s%s%s%s%s \n", lpFileOp->fFlags, 363 309 lpFileOp->fFlags & FOF_MULTIDESTFILES ? "FOF_MULTIDESTFILES " : "", 364 310 lpFileOp->fFlags & FOF_CONFIRMMOUSE ? "FOF_CONFIRMMOUSE " : "", … … 373 319 lpFileOp->fFlags & FOF_NOERRORUI ? "FOF_NOERRORUI " : "", 374 320 lpFileOp->fFlags & 0xf800 ? "MORE-UNKNOWN-Flags" : ""); 375 #ifdef __WIN32OS2__376 321 switch(FuncSwitch) { 377 322 case FO_MOVE: 378 323 retCode = 0xb7; 379 324 pToFuncTXT = "FO_MOVE"; 380 #else381 switch(lpFileOp->wFunc) {382 case FO_MOVE:383 #endif384 325 case FO_COPY: 385 326 { … … 398 339 * --------------- 399 340 * copy files to dir 1 0 1 1 0 0 1 0 400 * create dir 0 0 0 0 0 0 1 0 341 * create dir 0 0 0 0 0 0 1 0 401 342 */ 402 #ifdef __WIN32OS2__403 343 nlpFileOp.pFrom = pTempFrom = HeapAlloc(GetProcessHeap(), 0, 3 * MAX_PATH+6); 404 344 nlpFileOp.pTo = pTempTo = &pTempFrom[MAX_PATH+4]; … … 438 378 } /* endif */ 439 379 440 TRACE(__FUNCTION__" %s level=%d From='%s' To='%s'\n", pToFuncTXT, level, pFrom, pTo);441 442 380 FromTyp = SHFileTyp(pFrom, &lenFrom, 443 381 pTempFrom, &lenTempFrom, … … 445 383 &FromPathAttr, &FromAttr); 446 384 447 // Check Source 385 zTyp = ToTyp; 386 ToTyp = SHFileTyp(pTo, &lenTo, 387 pTempTo, &lenTempTo, 388 &pToFile, 389 &ToPathAttr, &ToAttr); 390 391 TRACE(__FUNCTION__" %s level=%d From='%s'(%d,%d,%d) To='%s'(%d,%d,%d)\n", pToFuncTXT, 392 level, pTempFrom, FromTyp, lenFrom, lenTempFrom, pTempTo, ToTyp, lenTo, lenTempTo); 393 394 /* Check Source */ 448 395 if (FromTyp != TypisDir 449 396 && FromTyp != TypisFile … … 454 401 break; 455 402 } /* endif */ 456 zTyp = ToTyp; 457 ToTyp = SHFileTyp(pTo, &lenTo, 458 pTempTo, &lenTempTo, 459 &pToFile, 460 &ToPathAttr, &ToAttr); 461 462 // fix for more then one source for one target 403 /* fix for more then one source for one target */ 463 404 if (ToTyp == TypisUnkn 464 405 && zTyp < TypisFile … … 469 410 lenTo = strlen(pTempTo); 470 411 } /* endif */ 471 / / recursiv creating from directorys are not valid for FO_MOVE.412 /* recursiv creating from directorys are not valid for FO_MOVE. */ 472 413 if (FuncSwitch == FO_MOVE && ToTyp == TypisNewPath) ToTyp = TypisUnkn; 473 / / Check Target414 /* Check Target */ 474 415 if (ToTyp == TypisMask) { 475 416 nlpFileOp.fAnyOperationsAborted=TRUE; … … 532 473 case TypisDir: { /* Source is Dir */ 533 474 if (TargetisDir) { 534 / / From Root to Root not full tested, also no Comparsion in W98475 /* From Root to Root not full tested, also no Comparsion in W98 */ 535 476 MakeDir = (!(lpFileOp->fFlags & FOF_MULTIDESTFILES) && ToTyp != TypisRoot); 536 477 break; … … 545 486 nlpFileOp.fAnyOperationsAborted=TRUE; 546 487 where = 210 + FromTyp; 547 / / retCode=0x750;488 /* retCode=0x750; */ 548 489 break; 549 490 } … … 564 505 PathRemoveFileSpecA(pTempFrom); 565 506 lenTempTo = strlen(pTempFrom); 566 strcpy( pTempFrom,pFrom);507 strcpy(&pTempFrom[1],&pFrom[1]); 567 508 if (pTempFrom[lenTempTo-1] == '\\') lenTempTo--; 568 509 strcpy(pToFile,&pFrom[lenTempTo]); … … 654 595 } 655 596 break; 656 #else657 int multifrom = pFrom[strlen(pFrom) + 1] != '\0';658 int destisdir = PathIsDirectoryA( pTo );659 int todir = 0;660 661 if (lpFileOp->wFunc == FO_COPY)662 TRACE("File Copy:\n");663 else664 TRACE("File Move:\n");665 666 if( destisdir ) {667 if ( !((lpFileOp->fFlags & FOF_MULTIDESTFILES) && !multifrom))668 todir = 1;669 } else {670 if ( !(lpFileOp->fFlags & FOF_MULTIDESTFILES) && multifrom)671 todir = 1;672 }673 674 if ((pTo[strlen(pTo) + 1] != '\0') &&675 !(lpFileOp->fFlags & FOF_MULTIDESTFILES))676 {677 WARN("Attempt to use multiple file names as a destination "678 "without specifying FOF_MULTIDESTFILES\n");679 return 1;680 }681 682 if ((lpFileOp->fFlags & FOF_MULTIDESTFILES) &&683 !SHELL_FileNamesMatch(pTo, pFrom))684 {685 WARN("Attempt to use multiple file names as a destination "686 "with mismatching number of files in the source and "687 "destination lists\n");688 return 1;689 }690 691 if ( todir ) {692 char szTempFrom[MAX_PATH];693 char *fromfile;694 int lenPTo;695 if ( ! destisdir) {696 TRACE(" creating directory %s\n",pTo);697 SHCreateDirectory(NULL,pTo);698 }699 lenPTo = strlen(pTo);700 while(1) {701 HANDLE hFind;702 WIN32_FIND_DATAA wfd;703 704 if(!pFrom[0]) break;705 TRACE(" From Pattern='%s'\n", pFrom);706 if(INVALID_HANDLE_VALUE != (hFind = FindFirstFileA(pFrom, &wfd)))707 {708 do709 {710 if(strcasecmp(wfd.cFileName, ".") && strcasecmp(wfd.cFileName, ".."))711 {712 strcpy(szTempFrom, pFrom);713 714 pTempTo = HeapAlloc(GetProcessHeap(), 0,715 lenPTo + strlen(wfd.cFileName) + 5);716 if (pTempTo) {717 strcpy(pTempTo,pTo);718 PathAddBackslashA(pTempTo);719 strcat(pTempTo,wfd.cFileName);720 721 fromfile = PathFindFileNameA(szTempFrom);722 fromfile[0] = '\0';723 PathAddBackslashA(szTempFrom);724 strcat(szTempFrom, wfd.cFileName);725 TRACE(" From='%s' To='%s'\n", szTempFrom, pTempTo);726 if(lpFileOp->wFunc == FO_COPY)727 {728 if(FILE_ATTRIBUTE_DIRECTORY & wfd.dwFileAttributes)729 {730 /* copy recursively */731 if(!(lpFileOp->fFlags & FOF_FILESONLY))732 {733 SHFILEOPSTRUCTA shfo;734 735 SHCreateDirectory(NULL,pTempTo);736 PathAddBackslashA(szTempFrom);737 strcat(szTempFrom, "*.*");738 szTempFrom[strlen(szTempFrom) + 1] = '\0';739 pTempTo[strlen(pTempTo) + 1] = '\0';740 memcpy(&shfo, lpFileOp, sizeof(shfo));741 shfo.pFrom = szTempFrom;742 shfo.pTo = pTempTo;743 SHFileOperationA(&shfo);744 745 szTempFrom[strlen(szTempFrom) - 4] = '\0';746 }747 }748 else749 CopyFileA(szTempFrom, pTempTo, FALSE);750 }751 else752 {753 /* move file/directory */754 MoveFileA(szTempFrom, pTempTo);755 }756 HeapFree(GetProcessHeap(), 0, pTempTo);757 }758 }759 } while(FindNextFileA(hFind, &wfd));760 FindClose(hFind);761 }762 else763 {764 /* can't find file with specified name */765 break;766 }767 pFrom += strlen(pFrom) + 1;768 }769 } else {770 while(1) {771 if(!pFrom[0]) break;772 if(!pTo[0]) break;773 TRACE(" From='%s' To='%s'\n", pFrom, pTo);774 775 pTempTo = HeapAlloc(GetProcessHeap(), 0, strlen(pTo)+1);776 if (pTempTo)777 {778 strcpy( pTempTo, pTo );779 PathRemoveFileSpecA(pTempTo);780 TRACE(" Creating Directory '%s'\n", pTempTo);781 SHCreateDirectory(NULL,pTempTo);782 HeapFree(GetProcessHeap(), 0, pTempTo);783 }784 if (lpFileOp->wFunc == FO_COPY)785 CopyFileA(pFrom, pTo, FALSE);786 else787 MoveFileA(pFrom, pTo);788 789 pFrom += strlen(pFrom) + 1;790 pTo += strlen(pTo) + 1;791 }792 }793 TRACE("Setting AnyOpsAborted=FALSE\n");794 lpFileOp->fAnyOperationsAborted=FALSE;795 return 0;796 #endif797 597 } 798 598 799 599 case FO_DELETE: 800 #ifdef __WIN32OS2__801 600 TRACE(__FUNCTION__" FO_DELETE level=%d\n",level); 802 / / need break at error before change sourcepointer601 /* need break at error before change sourcepointer */ 803 602 while(!nlpFileOp.fAnyOperationsAborted && (pFrom+=lenFrom+1)[0]) { 804 603 lenFrom=strlen(pFrom); … … 808 607 if (DeleteFileA(pFrom)) continue; 809 608 nlpFileOp.fAnyOperationsAborted=TRUE; 810 / / retCode = 0x71;609 /* retCode = 0x71; */ 811 610 where = 301; 812 611 break; … … 818 617 if (!(FromAttr & FILE_ATTRIBUTE_DIRECTORY) ) { 819 618 nlpFileOp.fAnyOperationsAborted=TRUE; 820 / / retCode = 0x71;619 /* retCode = 0x71; */ 821 620 where = 302; 822 621 break; 823 622 } 824 / / is Source an existing directory\*.* ?623 /* is Source an existing directory\*.* ? */ 825 624 if (FromAttr == -1) { 826 625 PathRemoveFileSpecA(pTempFrom); … … 844 643 lenTempFrom = strlen(pTempFrom); 845 644 if (lenFrom < lenTempFrom) { 846 / / Source is without \*.*645 /* Source is without \*.* */ 847 646 pTempFrom[lenTempFrom+1]='\0'; 848 647 nlpFileOp.pFrom = pTempFrom; … … 852 651 853 652 if (nlpFileOp.fAnyOperationsAborted) {break;} 854 / / Call SHELL_DeleteDirectoryA ?653 /* Call SHELL_DeleteDirectoryA ? */ 855 654 if (RemoveDirectoryA(pFrom)) continue; 856 655 nlpFileOp.fAnyOperationsAborted=TRUE; … … 896 695 case 0: 897 696 break; 898 #else899 {900 HANDLE hFind;901 WIN32_FIND_DATAA wfd;902 char szTemp[MAX_PATH];903 char *file_name;904 905 TRACE("File Delete:\n");906 while(1) {907 if(!pFrom[0]) break;908 TRACE(" Pattern='%s'\n", pFrom);909 if(INVALID_HANDLE_VALUE != (hFind = FindFirstFileA(pFrom, &wfd)))910 {911 do912 {913 if(strcasecmp(wfd.cFileName, ".") && strcasecmp(wfd.cFileName, ".."))914 {915 strcpy(szTemp, pFrom);916 file_name = PathFindFileNameA(szTemp);917 file_name[0] = '\0';918 PathAddBackslashA(szTemp);919 strcat(szTemp, wfd.cFileName);920 921 TRACE(" File='%s'\n", szTemp);922 if(FILE_ATTRIBUTE_DIRECTORY & wfd.dwFileAttributes)923 {924 if(!(lpFileOp->fFlags & FOF_FILESONLY))925 SHELL_DeleteDirectoryA(szTemp, FALSE);926 }927 else928 DeleteFileA(szTemp);929 }930 } while(FindNextFileA(hFind, &wfd));931 932 FindClose(hFind);933 }934 pFrom += strlen(pFrom) + 1;935 }936 TRACE("Setting AnyOpsAborted=FALSE\n");937 lpFileOp->fAnyOperationsAborted=FALSE;938 return 0;939 }940 #endif941 697 case FO_RENAME: 942 698 TRACE("File Rename:\n"); … … 944 700 { 945 701 WARN("Attempt to rename more than one file\n"); 946 return 1; 702 lpFileOp->fAnyOperationsAborted=TRUE; 703 retCode=0; 704 break; 947 705 } 948 lpFileOp->fAnyOperationsAborted = FALSE;949 706 TRACE("From %s, To %s\n", pFrom, pTo); 950 return !MoveFileA(pFrom, pTo); 707 pTempFrom = HeapAlloc(GetProcessHeap(), 0, 2 * MAX_PATH+6); 708 pTempTo = &pTempFrom[MAX_PATH+4]; 709 710 FromTyp = SHFileTyp(pFrom, &lenFrom, 711 pTempFrom, &lenTempFrom, 712 &pFromFile, 713 &FromPathAttr, &FromAttr); 714 715 ToTyp = SHFileTyp(pTo, &lenTo, 716 pTempTo, &lenTempTo, 717 &pToFile, 718 &ToPathAttr, &ToAttr); 719 720 TRACE(__FUNCTION__" FO_RENAME level=%d From='%s'(%d,%d,%d) To='%s'(%d,%d,%d)\n", 721 level, pTempFrom, FromTyp, lenFrom, lenTempFrom, pTempTo, ToTyp, lenTo, lenTempTo); 722 723 /* Check Target, Target = Dir is invalid, must be befor the next SourceCheck */ 724 if (FromTyp == TypisDir && ToTyp == TypisDir) { 725 nlpFileOp.fAnyOperationsAborted=TRUE; 726 retCode=0x7b; 727 break; 728 } /* endif */ 729 /* Check Source */ 730 if (FromTyp == TypisDirS || FromTyp == TypisName 731 /* for (FromTyp == TypisNewPath) to many, all are invalid and not are retCode 0x402 */ 732 || (FromTyp == TypisNewPath && (ToTyp != TypisDir && ToTyp != TypisName))) { 733 nlpFileOp.fAnyOperationsAborted=TRUE; 734 retCode=0x402; 735 break; 736 } /* endif */ 737 /* Check Target, Target = NewDir is invalid, must be after 0x402 ? */ 738 if (ToTyp == TypisNewPath) { 739 nlpFileOp.fAnyOperationsAborted=TRUE; 740 retCode=0x75; 741 break; 742 } /* endif */ 743 if (ToTyp == TypisDirS) { 744 nlpFileOp.fAnyOperationsAborted=TRUE; 745 retCode=0xb7; 746 break; 747 } /* endif */ 748 /* What is with existing Target, can we replace it ? */ 749 if (((FromTyp == TypisFile || FromTyp == TypisDir) && ToTyp == TypisName) 750 || (FromTyp == TypisDir && ToTyp == TypisNameS)) { 751 if (ToTyp == TypisNameS) pTempTo[--lenTo] = '\0'; 752 lenTempTo = lenTempFrom = 2; 753 /* FileRename only in the same path !! ?? */ 754 if (FromTyp == TypisFile) { 755 pFromFile = strrchr(pTempFrom,'\\'); 756 pToFile = strrchr(pTempTo,'\\'); 757 if (pFromFile == NULL || pToFile == NULL) { 758 if (ToTyp == TypisNameS) pTempTo[lenTo++] = '\\'; 759 break; 760 } 761 pFromFile[0] = '\0'; 762 pToFile[0] = '\0'; 763 lenTempTo = strlen(pTempTo); 764 lenTempFrom = strlen(pTempFrom); 765 pFromFile[0] = '\\'; 766 pToFile[0] = '\\'; 767 } 768 if (lenTempTo == lenTempFrom && 0 == memcmp(pTempTo,pTempFrom,lenTempTo)) { 769 retCode = !MoveFileA(pTempFrom, pTempTo); 770 if (ToTyp == TypisNameS) pTempTo[lenTo++] = '\\'; 771 if (retCode) nlpFileOp.fAnyOperationsAborted=TRUE; 772 break; 773 } 774 } 775 776 retCode=0x73; 777 nlpFileOp.fAnyOperationsAborted=TRUE; 778 break; 951 779 952 780 default: 953 #ifdef __WIN32OS2__954 781 TRACE(__FUNCTION__" Unhandled shell file operation %d at level=%d stub\n",(lpFileOp->wFunc & 15), level ); 955 782 lpFileOp->fAnyOperationsAborted=TRUE; 956 #else 957 FIXME("Unhandled shell file operation %d\n", lpFileOp->wFunc); 958 } 959 #endif 960 return 1; 961 962 #ifdef __WIN32OS2__ 783 return 1; 963 784 } 964 785 if (pTempFrom) HeapFree(GetProcessHeap(), 0, pTempFrom); … … 981 802 return 0; 982 803 983 #endif984 804 } 985 805 986 806 /************************************************************************* 987 * SHFileOperationW [SHELL32. 244]807 * SHFileOperationW [SHELL32.@] 988 808 * 989 809 * NOTES 990 810 * exported by name 991 811 */ 992 DWORD WINAPI SHFileOperationW (LPSHFILEOPSTRUCTW lpFileOp) 812 DWORD WINAPI SHFileOperationW (LPSHFILEOPSTRUCTW lpFileOp) 993 813 { 994 814 FIXME("(%p):stub.\n", lpFileOp); … … 997 817 998 818 /************************************************************************* 999 * SHFileOperation [SHELL32. 242]819 * SHFileOperation [SHELL32.@] 1000 820 * 1001 821 */ … … 1036 856 } 1037 857 1038
Note:
See TracChangeset
for help on using the changeset viewer.