2

我想将文件从 selflocation 复制到另一个位置,如下所示:

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 可以在宽字符串中返回我的文件的当前位置?

感谢帮助 :)

4

2 回答 2

3

直接调用CopyFileWwithParamStr(0)不起作用,因为在 Delphi 7 中ParamStr(0)返回AnsiString(默认类型为string),因此它与预期的第一个参数类型( )不匹配PWideChar

做到这一点的唯一方法就是您的方式 - 首先将 的内容分配ParamStr(0)给一个WideString变量,然后将其用作CopyFileW.

当使用非 Unicode API (CopyFileA时,Delphi 7 的Windows单位映射CopyFile到 Windows 时,Windows 会透明地在 Unicode 和 ANSI 之间进行大多数转换,而无需您付出任何努力,因此您应该改用它。

于 2012-05-26T03:29:31.350 回答
3

当然。您可以使用内部使用GetModuleFileNameW的 api 的 unicode 版本:ParamStr(0)

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
于 2012-05-26T10:23:28.883 回答