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

获取程序可执行文件的名称(如paramstr(0))但在Delphi7中是否将其作为Unicode字符串?,delphi,unicode,delphi-7,Delphi,Unicode,Delphi 7,我想将文件从selflocation复制到另一个位置,如下所示: var NewFile : WideString; MyOwnLocation : WideString; begin NewFile := 'C:\mycopy.exe'; // CopyFileW (PWideChar(paramstr(0)), PWideChar(NewFile), false); // ===> doesn't work MyOwnLocation := paramstr(0);

我想将文件从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可以在wideString中返回我的文件的当前位置


感谢您的帮助:)

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

唯一的方法是按照您的方式—首先将
ParamStr(0)
的内容分配给
WideString
变量,然后将其用作
CopyFileW
的参数


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

当然。您可以使用
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
var
新文件:宽字符串;
位置:宽弦;
伦:德沃德;
开始
新文件:='C:\mycopy.exe';
毛长(肌下定位,260);
Len:=GetModuleFileNameW(0,PWideChar(myowLocation),Length(myowLocation));
Win32Check(Bool(Len));
如果GetLastError错误\u缓冲区不足,则开始
SetLength(MyOwnLocation,Len);
CopyFileW(PWideChar(MyOwnLocation)、PWideChar(NewFile)、false;
结束其他
//缓冲区不足导致句柄失败

您是否尝试过将exe重命名为具有非简单ASCII字符(例如俄语字符)的文件然后从命令行窗口执行?如果需要,键入名称的第一个字符,然后使用tab使窗口在以该字符开头的名称之间循环?这是找到问题答案的一种非常简单的方法。通常只需在Delphi主题或查看Embarcadero博客。很多俄罗斯人都在写博客……你在写恶意软件吗?是的。我应该在foldername或文件名中输入unicode字符。@WarrenP你为什么这么问?