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: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")
都能正常返回错误值. 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字节。
所以在字节相等的情况下,你大多数可以任意选用参数类型,但这样做的后果就是编程不严谨。 受教了。 . 学习学习。。 俺还没到达这种档次,慢慢啃吧。 受益匪浅,欢迎出第二讲深入学习下去。 偷听了下 受益匪浅 嘿嘿~ 通俗易懂,顶上 要善于利用Winapi,另外,这个会不会弹出“正在复制”窗口? 学习了 原来字节大小一样是可以用其他的数据类型的 入门必看,有收获 赞一个...{:face (327):}
页:
[1]