2

この関数を Delphi 2010 (Unicode) に変換するにはどうすればよいですか?

function TForm1.GetTarget(const LinkFileName:String):String;
var
   //Link : String;
   psl  : IShellLink;
   ppf  : IPersistFile;
   WidePath  : Array[0..260] of WideChar;
   Info      : Array[0..MAX_PATH] of Char;
   wfs       : TWin32FindData;
begin
  if UpperCase(ExtractFileExt(LinkFileName)) <> '.LNK' Then
  begin
    Result:='NOT a shortuct by extension!';
    Exit;
  end;

  CoCreateInstance(CLSID_ShellLink, nil, CLSCTX_INPROC_SERVER, IShellLink, psl);
  if psl.QueryInterface(IPersistFile, ppf) = 0 Then
  Begin
    MultiByteToWideChar(CP_ACP, MB_PRECOMPOSED, PAnsiChar(LinkFileName), -1, @WidePath, MAX_PATH);
    ppf.Load(WidePath, STGM_READ);
    psl.GetPath((@info), MAX_PATH, wfs, SLGP_UNCPRIORITY);
    Result := info;

  end
  else
    Result := '';
end;

ありがとう

4

2 に答える 2

1

適切な文字列変換を大文字に使用し、エラー状態を確認し、不要なものを削除するために、Michael の回答にさらに変更を加えました。

function TForm1.GetTarget(const LinkFileName: String): String;
var
  psl: IShellLink;
  ppf: IPersistFile;
  wfs: TWin32FindData;
begin
  if Character.ToUpper(ExtractFileExt(LinkFileName)) <> '.LNK' Then
    Exit('NOT a shortcut by extension!');

  OleCheck(CoCreateInstance(CLSID_ShellLink, nil, CLSCTX_INPROC_SERVER,
    IShellLink, psl));
  if psl.QueryInterface(IPersistFile, ppf) = 0 Then
  Begin
    OleCheck(ppf.Load(PChar(LinkFileName), STGM_READ));
    SetLength(Result, MAX_PATH);
    OleCheck(psl.GetPath(PChar(Result), MAX_PATH, wfs, SLGP_UNCPRIORITY));
    Result := PChar(Result);
  end;
end;
于 2009-11-25T16:45:12.610 に答える
1

私が知る限り、ppf.Load は LinkFileName を直接 PChar (現在は PWideChar) にキャストできるはずです。MultiByteToWideChar 行を削除し、一時変数にコピーする代わりに PChar(LinkFileName) を使用してください。

これにより、コードは次のようになります。

function TForm1.GetTarget(const LinkFileName:String):String;
var
   //Link : String;
   psl  : IShellLink;
   ppf  : IPersistFile;
   //WidePath  : Array[0..260] of WideChar;
   Info      : Array[0..MAX_PATH] of Char;
   wfs       : TWin32FindData;
begin
  if UpperCase(ExtractFileExt(LinkFileName)) <> '.LNK' Then
  begin
    Result:='NOT a shortuct by extension!';
    Exit;
  end;

  CoCreateInstance(CLSID_ShellLink, nil, CLSCTX_INPROC_SERVER, IShellLink, psl);
  if psl.QueryInterface(IPersistFile, ppf) = 0 Then
  Begin
    ppf.Load(PChar(LinkFileName), STGM_READ);
    psl.GetPath((@info), MAX_PATH, wfs, SLGP_UNCPRIORITY);
    Result := info;    
  end
  else
    Result := '';
end;

psl.GetPath は MSDN で LPTSTR を使用すると宣言されているため、その部分を変更せずに Unicode バージョンを取得する必要があると思います。

于 2009-11-25T16:20:58.587 に答える