pusofalse 发表于 2009-8-31 20:10:00

Win32 API资料 - CopyFile

; 应bing614兄的邀请,将几个具有代表性的API函数讲解贴上来,希望可以方便其他朋友。
第一讲 - CopyFile

调用API CopyFile 复制文件,定义于Kernel32.dll。其函数原型如下:
BOOL WINAPI CopyFile(
__inLPCTSTR lpExistingFileName,
__inLPCTSTR lpNewFileName,
__inBOOL bFailIfExists
);

头部的BOOL 说明CopyFile的返回值为布尔值,只有复制成功或复制失败。BOOL类型对应au3中的int型。
第一个参数lpExistingFileName,指定要复制的文件,LPCTSTR为参数类型,对应于Au3中的str。
第二个参数lpNewFileName, 指定新文件名,参数同样对应于AU3中的str。若此参数指定为某文件夹路径而非某文件名,函数将执行失败,错误值将设为5(拒绝访问)。

第三个参数bFailIfExists, 指定一个BOOL值(真或假),用于说明是否覆盖已经存在的文件。真为覆盖,假为不覆盖。
如果新文件已经存在,并且bFailIfExists指定为False,函数则执行失败。如果新文件不存在,则CopyFile函数忽略这个参数。如果函数最终返回0(假),说明函数执行失败。调用GetLastError(定义于Kernel32.dll中)返回其扩展的错误值。

在au3中应用如下,注意API名称区分大小写:
; 复制系统文件夹中的cmd.exe到当前文件所在的目录,并把新文件命名为cmd1.exe。
; CopyFile - http://msdn.microsoft.com/en-us/library/aa363851(VS.85).aspx
$iResult = DllCall("Kernel32.dll", "int", "CopyFile", _
                "str", @SystemDir & "\cmd.exe", _
                "str", @ScriptDir & "\cmd1.exe", "int", 1)
If $iResult <> 0 Then
        Msgbox(0, "", "复制成功")
Else
        $iError = DllCall("Kernel32.dll", "long", "GetLastError")
        Msgbox(0, "", "失败,错误代码" & $iError)
EndIf
由CopyFile这个API函数,你想到了AU3中的哪个函数? -- FileCopy
当然在au3中,复制文件可以直接调用内置函数FileCopy,大可不必这么繁琐地调用DLL。这一讲目的只是对系统API函数有一个非常初级的认识。
扩展练习 -- 调用API MoveFile 实现移动文件。

bing614 发表于 2009-8-31 22:03:47

大哥,顶先。

bing614 发表于 2009-8-31 22:13:55

本帖最后由 bing614 于 2009-8-31 22:55 编辑

非常不错,试下MoveFile$x=DllCall("Kernel32.dll","int","MoveFile","str",@ScriptDir & "\cmd1.exe","str",@ScriptDir & "\cmd.exe")
If $iResult <> 0 Then
      Msgbox(0, "", "移动成功")
Else      
      $iError = DllCall("Kernel32.dll", "long", "GetLastError")
      有个问题请教一下,关于数据类型 long 和 dword 查看AU3帮助说明都是32 位整数.是不是表示他们可以通用。就是用long可以,用dword也可以,在我的几次测试中都能正常执行。比如:

GetLastError原型
C++
DWORD WINAPI GetLastError(void);

$iError = DllCall("Kernel32.dll", "long", "GetLastError")
$iError = DllCall("Kernel32.dll", "dword ", "GetLastError")
都能正常返回错误值.

pusofalse 发表于 2009-8-31 23:16:15

Re 3#:
用long或者dword都无所谓,int/ptr/hWnd应该也可以。
除非API函数明确规定了参数类型必须为某类型。
如果某API函数某参数类型为long,那么在AU3中也最好写为long,当然你用int多数情况下也不会出错。
但如果你用short或者ushort、ubyte、int64、uint64就不行了。因为long型值占4字节,int64/uint64占8字节,short/ushort占2字节,byte/ubyte只占一字节。而long/ulong/int/uint/dword/ptr/hwnd/ulong_ptr/float都是占4字节。
所以在字节相等的情况下,你大多数可以任意选用参数类型,但这样做的后果就是编程不严谨。

bing614 发表于 2009-9-1 02:19:44

受教了。      .

pingfan5888 发表于 2010-3-17 22:10:43

学习学习。。

lpxx 发表于 2010-3-18 11:46:28

俺还没到达这种档次,慢慢啃吧。

zps26 发表于 2010-10-4 16:21:49

受益匪浅,欢迎出第二讲深入学习下去。

ashfinal 发表于 2011-2-5 19:33:31

偷听了下 受益匪浅 嘿嘿~

浪迹红客 发表于 2011-4-3 18:02:33

通俗易懂,顶上

zhhsh 发表于 2011-4-5 11:49:22

要善于利用Winapi,另外,这个会不会弹出“正在复制”窗口?

iamwonvy 发表于 2012-9-8 02:08:21

学习了 原来字节大小一样是可以用其他的数据类型的

wszhov 发表于 2013-12-12 22:23:33

入门必看,有收获

joyran 发表于 2013-12-12 22:31:18

赞一个...{:face (327):}
页: [1]
查看完整版本: Win32 API资料 - CopyFile