使用Extern.Declare调用ReplaceFile Winapi

使用Extern.Declare调用ReplaceFile Winapi,winapi,vbscript,hp-uft,kernel32,Winapi,Vbscript,Hp Uft,Kernel32,更新是的,但仍未解决,我仍在寻找解决方案。 更新此问题仍未解决,我仍在寻找解决方案 我正在尝试从UFT调用ReplaceFile API 这是我的剧本: Option Explicit Private Const REPLACEFILE_WRITE_THROUGH=1 Private Const REPLACEFILE_IGNORE_MERGE_ERRORS=2 Private Const REPLACEFILE_IGNORE_ACL_ERRORS=4 Extern.Declare micI

更新是的,但仍未解决,我仍在寻找解决方案。 更新此问题仍未解决,我仍在寻找解决方案

我正在尝试从UFT调用ReplaceFile API

这是我的剧本:

Option Explicit

Private Const REPLACEFILE_WRITE_THROUGH=1
Private Const REPLACEFILE_IGNORE_MERGE_ERRORS=2
Private Const REPLACEFILE_IGNORE_ACL_ERRORS=4

Extern.Declare micInteger, "ReplaceFile", "Kernel32.dll", "ReplaceFileA", micString, micString, micString, micDWord, micLong, micLong
Dim lpReplacedFileName: lpReplacedFileName="C:\TEMP\T\alt.dat"
Dim lpReplacementFileName: lpReplacementFileName="C:\TEMP\T\neu.dat"
Dim lpBackupFileName: lpBackupFileName="C:\TEMP\T\bak.dat"
Dim dwReplaceFlags: dwReplaceFlags=REPLACEFILE_WRITE_THROUGH
Dim lpExclude: lpExclude=NULL
Dim lpReserved: lpReserved=NULL


Dim Result:
Result=Extern.ReplaceFile (lpReplacedFileName, lpReplacementFileName, lpBackupFileName, 0, lpExclude, lpReserved)
MsgBox GetLastError ()
如果我现在在c:\temp中创建一个文件alt.dat,那么在脚本运行时它不会被重命名为neu.dat。结果是0,GetLastError返回0,这可能意味着:未调用API函数,Extern.Declare没有告诉我做错了什么


那么我做错了什么呢?

如果函数返回0,那么它就成功了
GetLastError
仅在调用失败时提供有意义的值。如果使用
ReplaceFileW
,调用是否有效?@theB:,
ReplaceFile()
在失败时返回0,而不是成功。如果
GetLastError()
在失败时没有返回错误代码,那么我猜
Extern
本身很可能在
ReplaceFile()
退出后,在脚本有机会调用
GetLastError()
之前重置
GetLastError()
。祝您好运@Remy。这是我的错,因为今天有太多的非零回报。这确实让我更加怀疑存在字符串转换问题。如果字符串实际上是UTF-16编码的,那么只有路径字符串的第一个字符将发送到函数,这意味着调用相当于
ReplaceFile(“C”,“C”,“C”,0,0,0)
,但我调用的是ReplaceFileA,而不是ReplaceFileW。同时,我同意这可能是字符集编码/表示问题,将进一步探索并报告发现的任何解决方案