【问题标题】:convert function to delphi 2010 (unicode)将函数转换为 delphi 2010 (unicode)
【发布时间】:2009-11-25 14:50:19
【问题描述】:

如何将此函数转换为 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;

谢谢

【问题讨论】:

  • 说,如果我有一个名为“NOT a shortuct by extension!”的真实文件会发生什么?我做一个链接?这个函数的调用者如何知道区别?

标签: delphi unicode delphi-2010


【解决方案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 版本。

【讨论】:

    【解决方案2】:

    我对 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;
    

    【讨论】:

      猜你喜欢
      • 2010-12-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-01-01
      • 2015-01-29
      • 2011-06-12
      • 1970-01-01
      • 2015-07-28
      相关资源
      最近更新 更多