获取程序可执行文件的名称(如在paramstr(0)中),但在Delphi 7中将其作为Unicode字符串获取?

时间:2012-05-26 02:51:59

标签: delphi unicode delphi-7

我想将文件从自我定位复制到另一个位置:

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中返回我文件的当前位置?

感谢您的帮助:)

2 个答案:

答案 0 :(得分:3)

直接使用CopyFileW调用ParamStr(0)不起作用,因为ParamStr(0)在Delphi 7中返回AnsiStringstring的默认类型),所以它与期望的第一个参数类型(PWideChar)不匹配。

执行此操作的唯一方法是您的方式 - 首先将ParamStr(0)的内容分配给WideString变量,然后将其用作CopyFileW的参数。

当使用非Unicode API(CopyFileA,而Delphi 7的Windows单位映射CopyFile时,Windows会在没有任何努力的情况下透明地执行Unicode和ANSI之间的大多数转换,因此你应该只使用它。

答案 1 :(得分:3)

不确定。您可以使用GetModuleFileNameWParamStr(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