2

セルフロケーションから次のような別の場所にファイルをコピーしたい:

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であるかどうかはまだわかりません。wideStringでファイルの現在の場所を返すWindowsAPIはありますか?

手伝ってくれてありがとう :)

4

2 に答える 2

3

Delphi 7 ではが返されるため( のデフォルトの型)、期待される最初のパラメータの型( )と一致しないため、 を使用CopyFileWしたParamStr(0)直接呼び出しは機能しません。ParamStr(0)AnsiStringstringPWideChar

それを行う唯一の方法は、あなたのやり方です-最初に の内容を変数に割り当て、ParamStr(0)次にWideStringそれを のパラメータとして使用しますCopyFileW

CopyFileADelphi 7 のWindowsユニットがマップする非 Unicode API ( を使用する場合、Windows はほとんどの場合、Unicode と ANSI の間の変換を透過的に行いますCopyFile。そのため、代わりにそれを使用する必要があります。

于 2012-05-26T03:29:31.350 に答える
3

もちろん。内部で使用GetModuleFileNameWする Unicode バージョンの api を使用できます。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 に答える