7

長い引数文字列(> MAX_PATH)を含むショートカットを(デスクトップ上に)作成しようとしています。

MSDNのドキュメントには、Unicode文字列の場合、文字列はMAX_PATHより長くなる可能性があることが明記されています。

結果のショートカットは、MAX_PATH文字(つまり、Path+ Arguments)の直後にカットされます。

私の実装に何か問題がありますか、それともこれはWindowsの制限ですか?

procedure CreateShortcut(APath: WideString;
  AWorkingDirectory: WideString; AArguments: WideString; ADescription: WideString;
  ALinkFileName: WideString);
var
   IObject : IUnknown;
   ISLink  : IShellLinkW;
   IPFile  : IPersistFile;
begin
   IObject := CreateComObject(CLSID_ShellLink);
   ISLink := IObject as IShellLinkW;
   ISLink.SetPath(            PWideChar(APath));
   ISLink.SetWorkingDirectory(PWideChar(AWorkingDirectory));
   ISLink.SetArguments(       PWideChar(AArguments));
   ISLink.SetDescription(     PWideChar(ADescription));
   IPFile := IObject as IPersistFile;
   IPFile.Save(PWideChar(ALinkFileName), False);
end;

PS:OSはWindows XP(およびそれ以降)です。

4

2 に答える 2

15

この問題は、実際には Explorer シェル ダイアログの制限のみであることが判明しました。生成されたショートカット ファイルには、260 文字の制限はありません。ダイアログがそれよりも多くの文字を含むターゲットを表示することを拒否しているだけです。おそらくGetPath、固定長のバッファで呼び出します。

procedure TForm11.Button1Click(Sender: TObject);
var
  sl: IShellLinkW;
  pf: IPersistFile;
begin
  CoCreateInstance(CLSID_ShellLink, nil, 
    CLSCTX_INPROC_SERVER, IID_IShellLinkW, sl);
  sl.SetPath('c:\desktop\test.bat');
  sl.SetWorkingDirectory('c:\desktop\');
  sl.SetArguments(PChar(StringOfChar('x', 300)+'_the_end'));
  pf := sl as IPersistFile;
  pf.Save('c:\desktop\test.lnk', False);
end;

test.batはこのように見えます:

echo %1> test.out

結果test.outは _the_end に向かいます!

于 2011-02-11T20:19:18.847 に答える
5

このスレッドに貢献してくれたすべての人に感謝します - それは私を大いに助けました.

ただし、可能であれば、ソリューションの作成中に発見した以下の情報を追加したいと思います。

  1. Windows 7 Enterprise ~ SP1 では、VBS を使用してショートカットを作成すると、(少なくとも) 引数フィールドの最大文字数にまだ制限があるようです。切り捨てられる前に、最大 1023 文字をテストしました。同じ制限が Delphi メソッドにも同様に適用されると思います。

  2. Windows XP Professional ~ SP3 では、VBS メソッドでは 260 文字を超えるショートカットが作成されますが (lnk ファイルにはデータが含まれています)、実行するとこの数で切り捨てられるようです。

于 2012-09-13T21:07:06.467 に答える