找回密码
 加入
搜索
查看: 14056|回复: 13

[原创] Win32 API资料 - CopyFile

  [复制链接]
发表于 2009-8-31 20:10:00 | 显示全部楼层 |阅读模式
; 应bing614兄的邀请,将几个具有代表性的API函数讲解贴上来,希望可以方便其他朋友。
第一讲 - CopyFile

调用API CopyFile 复制文件,定义于Kernel32.dll。其函数原型如下:
BOOL WINAPI CopyFile(
  __in  LPCTSTR lpExistingFileName,
  __in  LPCTSTR lpNewFileName,
  __in  BOOL 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] <> 0 Then
        Msgbox(0, "", "复制成功")
Else
        $iError = DllCall("Kernel32.dll", "long", "GetLastError")
        Msgbox(0, "", "失败,错误代码" & $iError[0])
EndIf
由CopyFile这个API函数,你想到了AU3中的哪个函数? -- FileCopy
当然在au3中,复制文件可以直接调用内置函数FileCopy,大可不必这么繁琐地调用DLL。这一讲目的只是对系统API函数有一个非常初级的认识。
扩展练习 -- 调用API MoveFile 实现移动文件。

评分

参与人数 1金钱 +30 贡献 +5 收起 理由
zps26 + 30 + 5 学习了

查看全部评分

发表于 2009-8-31 22:03:47 | 显示全部楼层
大哥,顶先。
发表于 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] <> 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")
都能正常返回错误值.
 楼主| 发表于 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字节。
所以在字节相等的情况下,你大多数可以任意选用参数类型,但这样做的后果就是编程不严谨。
发表于 2009-9-1 02:19:44 | 显示全部楼层
受教了。      .
发表于 2010-3-17 22:10:43 | 显示全部楼层
学习学习。。
发表于 2010-3-18 11:46:28 | 显示全部楼层
俺还没到达这种档次,慢慢啃吧。
发表于 2010-10-4 16:21:49 | 显示全部楼层
受益匪浅,欢迎出第二讲深入学习下去。
发表于 2011-2-5 19:33:31 | 显示全部楼层
偷听了下 受益匪浅 嘿嘿~
发表于 2011-4-3 18:02:33 | 显示全部楼层
通俗易懂,顶上
发表于 2011-4-5 11:49:22 | 显示全部楼层
要善于利用Winapi,另外,这个会不会弹出“正在复制”窗口?
发表于 2012-9-8 02:08:21 | 显示全部楼层
学习了 原来字节大小一样是可以用其他的数据类型的
发表于 2013-12-12 22:23:33 | 显示全部楼层
入门必看,有收获
发表于 2013-12-12 22:31:18 | 显示全部楼层
赞一个...
您需要登录后才可以回帖 登录 | 加入

本版积分规则

QQ|手机版|小黑屋|AUTOIT CN ( 鲁ICP备19019924号-1 )谷歌 百度

GMT+8, 2024-5-5 16:40 , Processed in 0.076221 second(s), 20 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表