我想将文件从自我定位复制到另一个位置:
var
NewFile : WideString;
MyOwnLocation : WideString;
begin
NewFile := 'C:\mycopy.exe';
// CopyFileW (PWideChar(paramstr(0)), PWideChar(NewFile), false); // ===> doesn't work
MyOwnLocation := paramstr(0);
CopyFileW (PWideChar(MyOwnLocation), PWideChar(NewFile), false); // ===> works but not sure if Unicode supported...
end;
当我将paramstr(0)复制到WideString时它起作用,但我仍然不确定paramstr(0)是否已经是UNICODE。是否有一个WindowsAPI可以在wideString中返回我文件的当前位置?
感谢您的帮助:)
答案 0 :(得分:3)
直接使用CopyFileW
调用ParamStr(0)
不起作用,因为ParamStr(0)
在Delphi 7中返回AnsiString
(string
的默认类型),所以它与期望的第一个参数类型(PWideChar
)不匹配。
执行此操作的唯一方法是您的方式 - 首先将ParamStr(0)
的内容分配给WideString
变量,然后将其用作CopyFileW
的参数。
当使用非Unicode API(CopyFileA
,而Delphi 7的Windows
单位映射CopyFile
时,Windows会在没有任何努力的情况下透明地执行Unicode和ANSI之间的大多数转换,因此你应该只使用它。
答案 1 :(得分:3)
不确定。您可以使用GetModuleFileNameW
,ParamStr(0)
内部使用的api的unicode版本:
var
NewFile: WideString;
MyOwnLocation: WideString;
Len: DWORD;
begin
NewFile := 'C:\mycopy.exe';
SetLength(MyOwnLocation, 260);
Len := GetModuleFileNameW(0, PWideChar(MyOwnLocation), Length(MyOwnLocation));
Win32Check(Bool(Len));
if GetLastError <> ERROR_INSUFFICIENT_BUFFER then begin
SetLength(MyOwnLocation, Len);
CopyFileW (PWideChar(MyOwnLocation), PWideChar(NewFile), false);
end else
// handle fail due to insufficient buffer