Sign in to follow this  
Followers 0
BigDaddyO

Shell.Application .CopyHere ignoring options

6 posts in this topic

#1 ·  Posted (edited)

I am using the sample script below for testing.

run it once, and it's great, run it a second time and you get prompts to overwrite even though I have set the Yes to All option.

Anybody know how I can get it to just overwrite without prompting me?

I am getting the same issue on Vista & XP sp2. I have found a bunch of stuff online about this and some say the options don't work, but some seem to have no problems at all. Also, the msdn site says to use &H10& instead of 16 but my script doesn't like that either.

_FileCopy(@DesktopDir, 0 , @TempDir & "\TestYestoAll")

Func _FileCopy($sSource, $iType, $sTarget)
;if $sSource is a folder than append \*.* to copy the entire contents
    if $iType = 0 Then 
        $sSource &= "\*.*"
    EndIf
;Ensure the $sTarget location exists
    if not FileExists($sTarget) Then DirCreate($sTarget)
;Variables for use with the copy command
    Local $FOF_RESPOND_YES = 16
    Local $FOF_SIMPLEPROGRESS = 256
;Execute the copy command for this file/folder
    $winShell = ObjCreate("shell.application")
    $winShell.namespace($sTarget).CopyHere($sSource,$FOF_RESPOND_YES)
EndFunc
Edited by MikeOsdx

Share this post


Link to post
Share on other sites



Hi,

Not sure about the Yes To All problem.

But the "&H10&" is correct, the H10 means hex value which is equal to 16

ConsoleWrite(Hex(16,2)& @LF)

Share this post


Link to post
Share on other sites

#4 ·  Posted (edited)

I don't know fix for your script but maybe this similar script can be used as workaround:

Global Const $FO_COPY                   = 0x0002
Global Const $FOF_CONFIRMMOUSE          = 0x0002
Global Const $FOF_RENAMEONCOLLISION     = 0x0008
Global Const $FOF_NOCONFIRMATION        = 0x0010
Global Const $FOF_WANTMAPPINGHANDLE     = 0x0020
Global Const $FOF_ALLOWUNDO             = 0x0040
Global Const $FOF_FILESONLY             = 0x0080
Global Const $FOF_SIMPLEPROGRESS        = 0x0100
Global Const $FOF_NOCONFIRMMKDIR        = 0x0200
Global Const $FOF_NOERRORUI             = 0x0400
Global Const $FOF_NOCOPYSECURITYATTRIBS = 0x0800
Global Const $FOF_NORECURSION           = 0x1000
Global Const $FOF_NO_CONNECTED_ELEMENTS = 0x2000
Global Const $FOF_WANTNUKEWARNING       = 0x4000
Global Const $FOF_NORECURSEREPARSE      = 0x8000

Func _CopyWithProgress($sFrom, $sTo)
    Local $SHFILEOPSTRUCT, $pFrom, $pTo, $aDllRet, $nError = 0
    
    $SHFILEOPSTRUCT = DllStructCreate("hwnd hwnd;uint wFunc;ptr pFrom;ptr pTo;int fFlags;int fAnyOperationsAborted;ptr hNameMappings;ptr lpszProgressTitle")
    DllStructSetData($SHFILEOPSTRUCT, "hwnd", 0)
    DllStructSetData($SHFILEOPSTRUCT, "wFunc", $FO_COPY)
    
    $pFrom = DllStructCreate("char[" & StringLen($sFrom)+2 & "]")
    DllStructSetData($pFrom, 1, $sFrom)
    DllStructSetData($pFrom, 1, Chr(0), StringLen($sFrom)+2) ; second null at the end
    DllStructSetData($SHFILEOPSTRUCT, "pFrom", DllStructGetPtr($pFrom))
    
    $pTo = DllStructCreate("char[" & StringLen($sTo)+2 & "]")
    DllStructSetData($pTo, 1, $sTo)
    DllStructSetData($pTo, 1, Chr(0), StringLen($sTo)+2) ; second null at the end
    DllStructSetData($SHFILEOPSTRUCT, "pTo", DllStructGetPtr($pTo))
    
    DllStructSetData($SHFILEOPSTRUCT, "fFlags", BitOR($FOF_NOCONFIRMATION, $FOF_NOERRORUI))
    DllStructSetData($SHFILEOPSTRUCT, "fAnyOperationsAborted", 0)
    DllStructSetData($SHFILEOPSTRUCT, "hNameMappings", 0)
    DllStructSetData($SHFILEOPSTRUCT, "lpszProgressTitle", 0)
    
    $aDllRet = DllCall("shell32.dll", "int", "SHFileOperation", "ptr", DllStructGetPtr($SHFILEOPSTRUCT))
    If @error Or $aDllRet[0] <> 0 Then
        $aDllRet = DllCall("kernel32.dll", "long", "GetLastError")
        If Not @error Then $nError = $aDllRet[0]
    EndIf
    
    ; test if button Abort was pressed
    If DllStructGetData($SHFILEOPSTRUCT, "fAnyOperationsAborted") Then $nError = -1

    $pFrom = 0
    $pTo = 0
    $SHFILEOPSTRUCT = 0
    
    If $nError <> 0 Then
        SetError($nError)
        Return False
    EndIf
    Return True
EndFunc
Edited by Zedna

Share this post


Link to post
Share on other sites

I don't know fix for your script but maybe this similar script can be used as workaround:

The Hex value didn't help but this script worked great.

one more question though?

I am also using .MoveHere with the same problem.

Do you have the hex value for $FO_MOVE or a link to a site that contains further info?

Thanks,

Mike


Share this post


Link to post
Share on other sites

The Hex value didn't help but this script worked great.

one more question though?

I am also using .MoveHere with the same problem.

Do you have the hex value for $FO_MOVE or a link to a site that contains further info?

Thanks,

Mike

MSDN

http://msdn.microsoft.com/en-us/library/bb762164(VS.85).aspx

http://msdn.microsoft.com/en-us/library/bb759795(VS.85).aspx

#define FO_MOVE 0x0001

#define FO_COPY 0x0002

#define FO_DELETE 0x0003

#define FO_RENAME 0x0004

When you need some system constant then use google: define FO_MOVE

;-)

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!


Register a new account

Sign in

Already have an account? Sign in here.


Sign In Now
Sign in to follow this  
Followers 0